[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