X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fabstractsqlstorage.cpp;h=00c818fe2240375f0ac4938b6584e727fe157918;hp=8523d506cbf1ac71d6eb30e3ba69a43825ae447b;hb=77a021d6d237abc3b54277584c1bedfecf0ceda2;hpb=f6781dc095957d65e8fc1683fda1c5a5b9cbedbb diff --git a/src/core/abstractsqlstorage.cpp b/src/core/abstractsqlstorage.cpp index 8523d506..00c818fe 100644 --- a/src/core/abstractsqlstorage.cpp +++ b/src/core/abstractsqlstorage.cpp @@ -19,11 +19,14 @@ ***************************************************************************/ #include "abstractsqlstorage.h" +#include "quassel.h" #include "logger.h" #include +#include #include +#include #include int AbstractSqlStorage::_nextConnectionId = 0; @@ -84,12 +87,16 @@ void AbstractSqlStorage::addConnectionToPool() { if(!db.open()) { qWarning() << "Unable to open database" << displayName() << "for thread" << QThread::currentThread(); qWarning() << "-" << db.lastError().text(); + } else { + initDbSession(db); } } Storage::State AbstractSqlStorage::init(const QVariantMap &settings) { setConnectionProperties(settings); + _debug = Quassel::isOptionSet("debug"); + QSqlDatabase db = logDb(); if(!db.isValid() || !db.isOpen()) return NotAvailable; @@ -221,20 +228,47 @@ int AbstractSqlStorage::schemaVersion() { } bool AbstractSqlStorage::watchQuery(QSqlQuery &query) { - if(query.lastError().isValid()) { - qCritical() << "unhandled Error in QSqlQuery!"; - qCritical() << " last Query:\n" << query.lastQuery(); - qCritical() << " executed Query:\n" << query.executedQuery(); - qCritical() << " bound Values:"; - QList list = query.boundValues().values(); - for (int i = 0; i < list.size(); ++i) - qCritical() << i << ": " << list.at(i).toString().toAscii().data(); - qCritical() << " Error Number:" << query.lastError().number(); - qCritical() << " Error Message:" << query.lastError().text(); - qCritical() << " Driver Message:" << query.lastError().driverText(); - qCritical() << " DB Message:" << query.lastError().databaseText(); + bool queryError = query.lastError().isValid(); + if(queryError || _debug) { + if(queryError) + qCritical() << "unhandled Error in QSqlQuery!"; + qCritical() << " last Query:\n" << qPrintable(query.lastQuery()); + qCritical() << " executed Query:\n" << qPrintable(query.executedQuery()); + QVariantMap boundValues = query.boundValues(); + QStringList valueStrings; + QVariantMap::const_iterator iter; + for(iter = boundValues.constBegin(); iter != boundValues.constEnd(); iter++) { + QString value; + QSqlField field; + if(query.driver()) { + // let the driver do the formatting + field.setType(iter.value().type()); + if(iter.value().isNull()) + field.clear(); + else + field.setValue(iter.value()); + value = query.driver()->formatValue(field); + } else { + switch(iter.value().type()) { + case QVariant::Invalid: + value = "NULL"; + break; + case QVariant::Int: + value = iter.value().toString(); + break; + default: + value = QString("'%1'").arg(iter.value().toString()); + } + } + valueStrings << QString("%1=%2").arg(iter.key(), value); + } + qCritical() << " bound Values:" << qPrintable(valueStrings.join(", ")); + qCritical() << " Error Number:" << query.lastError().number(); + qCritical() << " Error Message:" << qPrintable(query.lastError().text()); + qCritical() << " Driver Message:" << qPrintable(query.lastError().driverText()); + qCritical() << " DB Message:" << qPrintable(query.lastError().databaseText()); - return false; + return !queryError; } return true; } @@ -460,8 +494,6 @@ bool AbstractSqlMigrationReader::transferMo(MigrationObject moType, T &mo) { while(readMo(mo)) { if(!_writer->writeMo(mo)) { abortMigration(QString("AbstractSqlMigrationReader::transferMo(): unable to transfer Migratable Object of type %1!").arg(AbstractSqlMigrator::migrationObject(moType))); - rollback(); - _writer->rollback(); return false; } i++;