***************************************************************************/
#include "abstractsqlstorage.h"
+#include "quassel.h"
#include "logger.h"
#include <QMutexLocker>
+#include <QSqlDriver>
#include <QSqlError>
+#include <QSqlField>
#include <QSqlQuery>
+int AbstractSqlStorage::_nextConnectionId = 0;
AbstractSqlStorage::AbstractSqlStorage(QObject *parent)
: Storage(parent),
- _schemaVersion(0),
- _nextConnectionId(0)
+ _schemaVersion(0)
{
}
// disconnect the connections, so their deletion is no longer interessting for us
QHash<QThread *, Connection *>::iterator conIter;
for(conIter = _connectionPool.begin(); conIter != _connectionPool.end(); conIter++) {
+ QSqlDatabase::removeDatabase(conIter.value()->name());
disconnect(conIter.value(), 0, this, 0);
}
}
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;
}
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<QVariant> 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;
}
bool AbstractSqlMigrationReader::migrateTo(AbstractSqlMigrationWriter *writer) {
if(!transaction()) {
- qWarning() << "AbstractSqlMigrationReader::migrateTo(): unable to start reader stransaction!";
+ qWarning() << "AbstractSqlMigrationReader::migrateTo(): unable to start reader's transaction!";
return false;
}
if(!writer->transaction()) {
- qWarning() << "AbstractSqlMigrationReader::migrateTo(): unable to start writer stransaction!";
+ qWarning() << "AbstractSqlMigrationReader::migrateTo(): unable to start writer's transaction!";
rollback(); // close the reader transaction;
return false;
}
if(!transferMo(QuasselUser, quasselUserMo))
return false;
- SenderMO senderMo;
- if(!transferMo(Sender, senderMo))
- return false;
-
IdentityMO identityMo;
if(!transferMo(Identity, identityMo))
return false;
if(!transferMo(Buffer, bufferMo))
return false;
+ SenderMO senderMo;
+ if(!transferMo(Sender, senderMo))
+ return false;
+
BacklogMO backlogMo;
if(!transferMo(Backlog, backlogMo))
return false;
if(!transferMo(UserSetting, userSettingMo))
return false;
+ if(!_writer->postProcess())
+ abortMigration();
return finalizeMigration();
}
return false;
}
- qDebug() << qPrintable(QString("Transfering %1...").arg(AbstractSqlMigrator::migrationObject(moType)));
+ qDebug() << qPrintable(QString("Transferring %1...").arg(AbstractSqlMigrator::migrationObject(moType)));
int i = 0;
QFile file;
file.open(stdout, QIODevice::WriteOnly);
+
while(readMo(mo)) {
if(!_writer->writeMo(mo)) {
abortMigration(QString("AbstractSqlMigrationReader::transferMo(): unable to transfer Migratable Object of type %1!").arg(AbstractSqlMigrator::migrationObject(moType)));
file.write("\n");
file.flush();
}
+
qDebug() << "Done.";
return true;
}