[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/graphics/digikam
From:       Holger Foerster <hamsi2k () freenet ! de>
Date:       2010-04-27 17:58:17
Message-ID: 20100427180131.6AECFAC8A5 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1119726 by foerster:

Extended dbus interface of the databaseserver to retrieve detailled error information \
to the callee if the database can't started. This error information is shown in a \
message box, when the databaseserverstarter fails to setup the running environment. \
Therefore there is a new class "databaseservererror" which is a data container which \
contains the error information for the transfer over dbus .


 M  +1 -0      CMakeLists.txt  
 U             databaseserver/CMakeLists.txt  
 M  +92 -25    databaseserver/databaseserver.cpp  
 M  +11 -6     databaseserver/databaseserver.h  
 M  +4 -0      databaseserver/org.kde.digikam.DatabaseServer.xml  
 M  +9 -1      digikam/albummanager.cpp  
 AM            libs/database/databaseservererror.cpp   [License: GPL (v2+)]
 AM            libs/database/databaseservererror.h   [License: GPL (v2+)]
 M  +40 -2     libs/database/databaseserverstarter.cpp  
 M  +4 -1      libs/database/databaseserverstarter.h  


--- trunk/extragear/graphics/digikam/CMakeLists.txt #1119725:1119726
@@ -1006,6 +1006,7 @@
         ${CMAKE_CURRENT_SOURCE_DIR}/libs/database/databasecopymanager.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/libs/database/databaseserverstarter.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/libs/database/tagscache.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/libs/database/databaseservererror.cpp
        )
 
     SET(libdatabaseui_SRCS
--- trunk/extragear/graphics/digikam/databaseserver/databaseserver.cpp \
#1119725:1119726 @@ -42,6 +42,7 @@
 // KDE includes
 
 #include <kdebug.h>
+#include <klocale.h>
 #include <kstandarddirs.h>
 
 // Local includes
@@ -49,6 +50,7 @@
 #include "pollthread.h"
 #include "databaseserveradaptor.h"
 #include "databaseparameters.h"
+#include "databaseservererror.h"
 
 namespace Digikam
 {
@@ -76,7 +78,11 @@
               : QObject(application), d(new DatabaseServerPriv)
 {
     d->app = application;
+    if (qDBusRegisterMetaType<DatabaseServerError>()<0)
+    {
+        kError()<<"Error while registering DatabaseServerError class.";
 }
+}
 
 DatabaseServer::~DatabaseServer()
 {
@@ -104,9 +110,9 @@
  * TODO: Ensure that no other digikam dbms is running. Reusing this instance instead \
                start a new one.
  * Maybe this can be done by DBUS communication or an PID file.
  */
-void DatabaseServer::startDatabaseProcess()
+bool DatabaseServer::startDatabaseProcess(QDBusVariant &error)
 {
-    startDatabaseProcess("QMYSQL");
+    return startDatabaseProcess("QMYSQL", error);
 }
 
 /*
@@ -114,15 +120,20 @@
  * TODO: Ensure that no other digikam dbms is running. Reusing this instance instead \
                start a new one.
  * Maybe this can be done by DBUS communication or an PID file.
  */
-void DatabaseServer::startDatabaseProcess(const QString dbType)
+bool DatabaseServer::startDatabaseProcess(const QString dbType, QDBusVariant &error)
 {
     if (dbType == QString("QMYSQL"))
     {
-        startMYSQLDatabaseProcess();
+//        return QVariant::fromValue(startMYSQLDatabaseProcess());
+    	error=QDBusVariant(QVariant::fromValue(startMYSQLDatabaseProcess()));
+        return false;
     }
     else
     {
         kDebug() << "DBType ["<< dbType <<"] is not supported.";
+        DatabaseServerError errorDetails(DatabaseServerError::NotSupported, \
QString("DBType [%0] is not supported.").arg(dbType)); +        \
error=QDBusVariant(QVariant::fromValue(errorDetails)); +        return false;
     }
 }
 
@@ -131,8 +142,9 @@
  * TODO: Ensure that no other digikam dbms is running. Reusing this instance instead \
                start a new one.
  * Maybe this can be done by DBUS communication or an PID file.
  */
-void DatabaseServer::startMYSQLDatabaseProcess()
+DatabaseServerError DatabaseServer::startMYSQLDatabaseProcess()
 {
+	DatabaseServerError result;
     const QString dbType("QMYSQL");
     DatabaseParameters internalServerParameters = \
DatabaseParameters::defaultParameters(dbType);  
@@ -146,7 +158,10 @@
     //const QString mysqldPath("/usr/sbin/mysqld");
 
     if ( mysqldPath.isEmpty() )
+    {
         kDebug() << "No path to mysqld set in server configuration!";
+        return DatabaseServerError(DatabaseServerError::StartError, i18n("No path to \
mysqld set in server configuration!")); +    }
 
     // create the database directories if they don't exists
     //  const QString dataDir     = XdgBaseDirs::saveDir( "data", QLatin1String( \
"Digikam/db_data" ) ); @@ -189,7 +204,10 @@
 
 
     if ( globalConfig.isEmpty() )
+    {
         kDebug() << "Did not find MySQL server default configuration \
(mysql-global.conf)"; +        return \
DatabaseServerError(DatabaseServerError::StartError, i18n("Did not find MySQL server \
default configuration (mysql-global.conf)!")); +    }
 
     bool confUpdate = false;
     QFile actualFile ( actualConfig );
@@ -217,9 +235,11 @@
         }
         else
         {
-            kDebug() << "Unable to create MySQL server configuration file.";
-            kDebug() << "This means that either the default configuration file \
                (mysql-global.conf) was not readable";
-            kDebug() << "or the target file (mysql.conf) could not be written.";
+        	QString  str = i18n("Unable to create MySQL server configuration file.\n",
+								"This means that either the default configuration file (mysql-global.conf) \
was not readable\n", +								"or the target file (mysql.conf) could not be \
written."); +            kDebug() << str;
+            return DatabaseServerError(DatabaseServerError::StartError, str);
         }
     }
 
@@ -233,13 +253,25 @@
         actualFile.setPermissions( allowedPerms );
 
     if ( dataDir.isEmpty() )
-        kDebug() << "Digikam server was not able not create database data \
directory"; +    {
+        QString  str = i18n("Digikam server was not able not create database data \
directory"); +        kDebug() << str;
+        return DatabaseServerError(DatabaseServerError::StartError, str);
+    }
 
     if ( akDir.isEmpty() )
-        kDebug() << "Digikam server was not able not create database log directory";
+    {
+    	QString  str = i18n("Digikam server was not able not create database log \
directory"); +    	kDebug() << str;
+    	return DatabaseServerError(DatabaseServerError::StartError, str);
+    }
 
     if ( miscDir.isEmpty() )
-        kDebug() << "Digikam server was not able not create database misc \
directory"; +    {
+    	QString  str = i18n("Digikam server was not able not create database misc \
directory"); +    	kDebug() << str;
+    	return DatabaseServerError(DatabaseServerError::StartError, str);
+    }
 
     // move mysql error log file out of the way
     const QFileInfo errorLog( dataDir + QDir::separator() + QString::fromLatin1( \
"mysql.err" ) ); @@ -281,9 +313,11 @@
         initProcess.start( mysqlInitCmd );
         if ( !initProcess.waitForFinished())
         {
-            kDebug() << "Could not start database init command!";
-            kDebug() << "executable:" << mysqlInitCmd;
-            kDebug() << "process error:" << initProcess.errorString();
+        	QString  str = i18n("Could not start database init command!\n",
+								"Executable: %1\n",
+								"Process error:%2", mysqlInitCmd, initProcess.errorString());
+        	kDebug() << str;
+        	return DatabaseServerError(DatabaseServerError::StartError, str);
         }
     }
 
@@ -292,10 +326,13 @@
 
     if ( !d->databaseProcess->waitForStarted() )
     {
-        kDebug() << "Could not start database server!";
-        kDebug() << "executable:" << mysqldPath;
-        kDebug() << "arguments:" << arguments;
-        kDebug() << "process error:" << d->databaseProcess->errorString();
+    	QString argumentStr = convertStringListToString(arguments, ", ");
+    	QString  str = i18n("Could not start database server!");
+    	str+=i18n("<p>Executable: %1</p>", mysqldPath);
+    	str+=i18n("<p>Arguments: %1</p>", argumentStr);
+    	str+=i18n("<p>Process error: %1</p>", d->databaseProcess->errorString());
+    	kDebug() << str;
+		return DatabaseServerError(DatabaseServerError::StartError, str);
     }
 
     const QLatin1String initCon( "initConnection" );
@@ -323,6 +360,13 @@
                 kDebug() << "stderr:" << d->databaseProcess->readAllStandardError();
                 kDebug() << "exit code:" << d->databaseProcess->exitCode();
                 kDebug() << "process error:" << d->databaseProcess->errorString();
+
+            	QString  str = i18n("Database process exited unexpectedly during \
initial connection!", +									"<p>Executable: %1</p>"",
+									"<p>Process error: %2</p>",
+									mysqldPath, d->databaseProcess->errorString());
+
+            	return DatabaseServerError(DatabaseServerError::StartError, str);
             }
         }
 
@@ -338,9 +382,11 @@
 
                 if ( !query.exec( QLatin1String( "CREATE DATABASE digikam" ) ) )
                 {
-                    kDebug() << "Failed to create database";
-                    kDebug() << "Query error:" << query.lastError().text();
-                    kDebug() << "Database error:" << db.lastError().text();
+                	QString  str = i18n("Failed to create database",
+										"<p>Query error: %1</p>",
+										"<p>Database error: %2</p>", query.lastError().text(), \
db.lastError().text()); +                	kDebug() << str;
+					return DatabaseServerError(DatabaseServerError::StartError, str);
                 }
                 else
                 {
@@ -353,12 +399,13 @@
     }
 
     QSqlDatabase::removeDatabase( initCon );
+    return result;
 }
 
 /*
  * Creates the initial database for the internal server instance.
  */
-void DatabaseServer::createDatabase()
+DatabaseServerError DatabaseServer::createDatabase()
 {
     const QLatin1String initCon( "initConnection" );
     QSqlDatabase db = QSqlDatabase::addDatabase( "MYSQL", initCon );
@@ -382,9 +429,11 @@
 
             if ( !query.exec( QLatin1String( "CREATE DATABASE digikam" ) ) )
             {
-                kDebug() << "Failed to create database";
-                kDebug() << "Query error:" << query.lastError().text();
-                kDebug() << "Database error:" << db.lastError().text();
+                QString str = i18n("Failed to create database",
+								   "<p>Query error: %1</p>",
+								   "<p>Database error: %2</p>",query.lastError().text(), \
db.lastError().text()); +                kDebug() << str;
+                return DatabaseServerError(DatabaseServerError::StartError, str);
             }
         }
 
@@ -392,6 +441,7 @@
         db.close();
     }
     QSqlDatabase::removeDatabase( initCon );
+    return DatabaseServerError(DatabaseServerError::NoErrors, QString());
 }
 
 /*
@@ -426,4 +476,21 @@
     return (d->databaseProcess->state() == QProcess::Running);
 }
 
+QString DatabaseServer::convertStringListToString(const QStringList &inputList, \
const QString &delimiter) +{
+	QString resultString;
+	QStringList::const_iterator iterator;
+	for (iterator = inputList.constBegin(); iterator != inputList.constEnd(); \
++iterator){ +		QString  entry 	= *iterator;
+		resultString.append(entry);
+
+		// Add a semicolon to the statement, if we are not on the last entry
+		if ((iterator+1) != inputList.constEnd())
+		{
+			resultString.append(delimiter);
+		}
+	}
+	return resultString;
+}
+
 } // namespace Digikam
--- trunk/extragear/graphics/digikam/databaseserver/databaseserver.h #1119725:1119726
@@ -28,8 +28,12 @@
 // QT includes
 
 #include <QString>
-#include <QDBusAbstractAdaptor>
+#include <QDBusVariant>
+#include <QObject>
 
+// Local includes
+#include "databaseservererror.h"
+
 class QCoreApplication;
 
 namespace Digikam
@@ -46,15 +50,16 @@
 
     DatabaseServer(QCoreApplication* application);
     ~DatabaseServer();
-    void createDatabase();
+    DatabaseServerError createDatabase();
     void registerOnDBus();
     void startPolling();
-    void startMYSQLDatabaseProcess();
+    DatabaseServerError startMYSQLDatabaseProcess();
 
+    QString convertStringListToString(const QStringList &inputList, const QString \
&delimiter); +
 public Q_SLOTS:
-
-    void startDatabaseProcess(const QString dbType);
-    void startDatabaseProcess();
+    bool startDatabaseProcess(QString dbType, QDBusVariant &error);
+    bool startDatabaseProcess(QDBusVariant &error);
     void stopDatabaseProcess();
     bool isRunning();
 
--- trunk/extragear/graphics/digikam/databaseserver/org.kde.digikam.DatabaseServer.xml \
#1119725:1119726 @@ -2,9 +2,13 @@
 <node>
   <interface name="org.kde.digikam.DatabaseServer">
     <method name="startDatabaseProcess">
+      <arg type="b" direction="out"/>
       <arg name="dbType" type="s" direction="in"/>
+      <arg name="error" type="v" direction="out"/>
     </method>
     <method name="startDatabaseProcess">
+      <arg type="b" direction="out"/>
+      <arg name="error" type="v" direction="out"/>
     </method>
     <method name="stopDatabaseProcess">
     </method>
--- trunk/extragear/graphics/digikam/digikam/albummanager.cpp #1119725:1119726
@@ -657,8 +657,16 @@
 
     if (params.internalServer)
     {
-        DatabaseServerStarter::startServerManagerProcess();
+        DatabaseServerError result = \
DatabaseServerStarter::startServerManagerProcess(); +        if \
(result.getErrorType()!=DatabaseServerError::NoErrors) +        {
+			QWidget* parent = QWidget::find(0);
+			QString message = i18n("<p><b>A error occurred during the internal server \
start.</b></p>" +								   "Details:\n %1", result.getErrorText());
+			QApplication::setOverrideCursor(Qt::ArrowCursor);
+			KMessageBox::error(parent, message);
     }
+    }
 
     DatabaseAccess::setParameters(params, DatabaseAccess::MainApplication);
 
--- trunk/extragear/graphics/digikam/libs/database/databaseserverstarter.cpp \
#1119725:1119726 @@ -39,7 +39,10 @@
 #include <QSqlError>
 #include <QDBusConnection>
 #include <QDBusConnectionInterface>
+#include <QDBusMetaType>
 #include <QDBusInterface>
+#include <QDBusVariant>
+#include <QVariant>
 #include <QDBusReply>
 #include <QProcess>
 #include <QSystemSemaphore>
@@ -50,6 +53,8 @@
 
 #include <kdebug.h>
 #include <kstandarddirs.h>
+#include <kmessagebox.h>
+#include <klocale.h>
 
 // Local includes
 
@@ -82,8 +87,21 @@
 {
 }
 
-void DatabaseServerStarter::startServerManagerProcess(const QString dbType)
+bool DatabaseServerStarter::init()
 {
+	if (qDBusRegisterMetaType<DatabaseServerError>()<0)
+	{
+		kError()<<"Error while registering DatabaseServerError class.";
+		return false;
+	}
+	return true;
+}
+
+bool DatabaseServerStarter::__init=DatabaseServerStarter::init();
+
+DatabaseServerError DatabaseServerStarter::startServerManagerProcess(const QString \
dbType) +{
+	DatabaseServerError result;
     /*
      * TODO:
      * 1. Acquire semaphore lock on "DigikamDBSrvAccess"
@@ -130,11 +148,31 @@
     QDBusMessage stateMsg = dbus_iface.call("isRunning");
     if (!stateMsg.arguments().at(0).toBool())
     {
+    	DatabaseServerError error;
+
         QList<QVariant> arguments;
         arguments.append(dbType);
-        dbus_iface.callWithArgumentList(QDBus::Block, "startDatabaseProcess", \
arguments); +
+        QDBusMessage reply = dbus_iface.callWithArgumentList(QDBus::Block, \
"startDatabaseProcess", arguments); +        if \
(QDBusMessage::ErrorMessage==reply.type()) +        {
+        	result.setErrorType(DatabaseServerError::StartError);
+        	result.setErrorText(i18n("<p><b>Error while calling the database server \
starter.</b></p>" +					   "Details:\n %1", reply.errorMessage()));
+        }else
+        {
+        	arguments = reply.arguments();
+
+        	QDBusVariant dbusVariant = qvariant_cast<QDBusVariant>(arguments[1]);
+			// retrieve the actual value stored in the D-Bus variant
+			QVariant dbusArgument = dbusVariant.variant();
+        	DatabaseServerError item = qdbus_cast<DatabaseServerError>(dbusArgument);
+        	result = item;
     }
+    }
     sem.release();
+
+    return result;
 }
 
 bool DatabaseServerStarter::isServerRegistered()
--- trunk/extragear/graphics/digikam/libs/database/databaseserverstarter.h \
#1119725:1119726 @@ -34,6 +34,7 @@
 // Local includes
 
 #include "digikam_export.h"
+#include "databaseservererror.h"
 
 namespace Digikam
 {
@@ -45,12 +46,14 @@
     public:
 
         DatabaseServerStarter(QObject* parent);
-        static void startServerManagerProcess(const QString dbType="QMYSQL");
+        static DatabaseServerError startServerManagerProcess(const QString \
dbType="QMYSQL");  static void cleanUp();
 
     private:
 
         static bool isServerRegistered();
+        static bool __init;
+        static bool init();
 };
 
 }  // namespace Digikam


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic