since seezer was too slow: fixing double click buffer switches in the chatmonitor
[quassel.git] / src / core / abstractsqlstorage.cpp
index 618c929..92f03cb 100644 (file)
 #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)
 {
 }
 
@@ -37,6 +39,7 @@ AbstractSqlStorage::~AbstractSqlStorage() {
   // 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);
   }
 }
@@ -83,6 +86,8 @@ void AbstractSqlStorage::addConnectionToPool() {
   if(!db.open()) {
     qWarning() << "Unable to open database" << displayName() << "for thread" << QThread::currentThread();
     qWarning() << "-" << db.lastError().text();
+  } else {
+    initDbSession(db);
   }
 }
 
@@ -222,16 +227,41 @@ 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<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();
+    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;
   }
@@ -350,11 +380,11 @@ AbstractSqlMigrationReader::AbstractSqlMigrationReader()
 
 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;
   }
@@ -366,10 +396,6 @@ bool AbstractSqlMigrationReader::migrateTo(AbstractSqlMigrationWriter *writer) {
   if(!transferMo(QuasselUser, quasselUserMo))
      return false;
 
-  SenderMO senderMo;
-  if(!transferMo(Sender, senderMo))
-    return false;
-
   IdentityMO identityMo;
   if(!transferMo(Identity, identityMo))
     return false;
@@ -386,6 +412,10 @@ bool AbstractSqlMigrationReader::migrateTo(AbstractSqlMigrationWriter *writer) {
   if(!transferMo(Buffer, bufferMo))
     return false;
 
+  SenderMO senderMo;
+  if(!transferMo(Sender, senderMo))
+    return false;
+
   BacklogMO backlogMo;
   if(!transferMo(Backlog, backlogMo))
     return false;
@@ -455,6 +485,7 @@ bool AbstractSqlMigrationReader::transferMo(MigrationObject moType, T &mo) {
   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)));
@@ -470,6 +501,7 @@ bool AbstractSqlMigrationReader::transferMo(MigrationObject moType, T &mo) {
     file.write("\n");
     file.flush();
   }
+
   qDebug() << "Done.";
   return true;
 }