Fixing backlog timestamps when merging from sqlite.
[quassel.git] / src / core / sqlitestorage.cpp
index 19710ed..2f4fa09 100644 (file)
@@ -120,7 +120,7 @@ UserId SqliteStorage::addUser(const QString &user, const QString &password) {
   return uid;
 }
 
   return uid;
 }
 
-void SqliteStorage::updateUser(UserId user, const QString &password) {
+bool SqliteStorage::updateUser(UserId user, const QString &password) {
   QSqlDatabase db = logDb();
   db.transaction();
 
   QSqlDatabase db = logDb();
   db.transaction();
 
@@ -130,8 +130,10 @@ void SqliteStorage::updateUser(UserId user, const QString &password) {
   query.bindValue(":password", cryptedPassword(password));
   lockForWrite();
   safeExec(query);
   query.bindValue(":password", cryptedPassword(password));
   lockForWrite();
   safeExec(query);
+  bool success = query.numRowsAffected() != 0;
   db.commit();
   unlock();
   db.commit();
   unlock();
+  return success;
 }
 
 void SqliteStorage::renameUser(UserId user, const QString &newName) {
 }
 
 void SqliteStorage::renameUser(UserId user, const QString &newName) {
@@ -150,36 +152,71 @@ void SqliteStorage::renameUser(UserId user, const QString &newName) {
 }
 
 UserId SqliteStorage::validateUser(const QString &user, const QString &password) {
 }
 
 UserId SqliteStorage::validateUser(const QString &user, const QString &password) {
-  QSqlQuery query(logDb());
-  query.prepare(queryString("select_authuser"));
-  query.bindValue(":username", user);
-  query.bindValue(":password", cryptedPassword(password));
+  UserId userId;
+
+  // this scope ensures that the query is freed in sqlite before we call unlock()
+  // this ensures that our thread doesn't hold a internal after unlock is called
+  // (see sqlites doc on implicit locking for details)
+  {
+    QSqlQuery query(logDb());
+    query.prepare(queryString("select_authuser"));
+    query.bindValue(":username", user);
+    query.bindValue(":password", cryptedPassword(password));
+
+    lockForRead();
+    safeExec(query);
+
+    if(query.first()) {
+      userId = query.value(0).toInt();
+    }
+  }
+  unlock();
 
 
-  lockForRead();
-  safeExec(query);
+  return userId;
+}
 
 
-  if(query.first()) {
-    unlock();
-    return query.value(0).toInt();
-  } else {
-    unlock();
-    return 0;
+UserId SqliteStorage::getUserId(const QString &username) {
+  UserId userId;
+
+  // this scope ensures that the query is freed in sqlite before we call unlock()
+  // this ensures that our thread doesn't hold a internal after unlock is called
+  // (see sqlites doc on implicit locking for details)
+  {
+    QSqlQuery query(logDb());
+    query.prepare(queryString("select_userid"));
+    query.bindValue(":username", username);
+
+    lockForRead();
+    safeExec(query);
+
+    if(query.first()) {
+      userId = query.value(0).toInt();
+    }
   }
   }
+  unlock();
+
+  return userId;
 }
 
 UserId SqliteStorage::internalUser() {
 }
 
 UserId SqliteStorage::internalUser() {
-  QSqlQuery query(logDb());
-  query.prepare(queryString("select_internaluser"));
-  lockForRead();
-  safeExec(query);
-
-  if(query.first()) {
-    unlock();
-    return query.value(0).toInt();
-  } else {
-    unlock();
-    return 0;
+  UserId userId;
+
+  // this scope ensures that the query is freed in sqlite before we call unlock()
+  // this ensures that our thread doesn't hold a internal after unlock is called
+  // (see sqlites doc on implicit locking for details)
+  {
+    QSqlQuery query(logDb());
+    query.prepare(queryString("select_internaluser"));
+    lockForRead();
+    safeExec(query);
+
+    if(query.first()) {
+      userId = query.value(0).toInt();
+    }
   }
   }
+  unlock();
+
+  return userId;
 }
 
 void SqliteStorage::delUser(UserId user) {
 }
 
 void SqliteStorage::delUser(UserId user) {
@@ -423,7 +460,7 @@ QList<CoreIdentity> SqliteStorage::identities(UserId user) {
   QList<CoreIdentity> identities;
   QSqlDatabase db = logDb();
   db.transaction();
   QList<CoreIdentity> identities;
   QSqlDatabase db = logDb();
   db.transaction();
-  
+
   QSqlQuery query(db);
   query.prepare(queryString("select_identities"));
   query.bindValue(":userid", user.toInt());
   QSqlQuery query(db);
   query.prepare(queryString("select_identities"));
   query.bindValue(":userid", user.toInt());
@@ -479,7 +516,7 @@ NetworkId SqliteStorage::createNetwork(UserId user, const NetworkInfo &info) {
 
   QSqlDatabase db = logDb();
   db.transaction();
 
   QSqlDatabase db = logDb();
   db.transaction();
-  
+
   QSqlQuery query(db);
   query.prepare(queryString("insert_network"));
   query.bindValue(":userid", user.toInt());
   QSqlQuery query(db);
   query.prepare(queryString("insert_network"));
   query.bindValue(":userid", user.toInt());
@@ -507,7 +544,7 @@ NetworkId SqliteStorage::createNetwork(UserId user, const NetworkInfo &info) {
       return NetworkId();
     }
   }
       return NetworkId();
     }
   }
-  
+
   db.commit();
   unlock();
   return networkId;
   db.commit();
   unlock();
   return networkId;
@@ -722,7 +759,7 @@ QList<NetworkId> SqliteStorage::connectedNetworks(UserId user) {
 
   QSqlDatabase db = logDb();
   db.transaction();
 
   QSqlDatabase db = logDb();
   db.transaction();
-  
+
   QSqlQuery query(db);
   query.prepare(queryString("select_connected_networks"));
   query.bindValue(":userid", user.toInt());
   QSqlQuery query(db);
   query.prepare(queryString("select_connected_networks"));
   query.bindValue(":userid", user.toInt());
@@ -1109,6 +1146,7 @@ bool SqliteStorage::mergeBuffersPermanently(const UserId &user, const BufferId &
   QSqlQuery delBufferQuery(db);
   delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
   delBufferQuery.bindValue(":bufferid", bufferId2.toInt());
   QSqlQuery delBufferQuery(db);
   delBufferQuery.prepare(queryString("delete_buffer_for_bufferid"));
   delBufferQuery.bindValue(":bufferid", bufferId2.toInt());
+  delBufferQuery.bindValue(":userid", user.toInt());
   safeExec(delBufferQuery);
   if(!watchQuery(delBufferQuery)) {
     db.rollback();
   safeExec(delBufferQuery);
   if(!watchQuery(delBufferQuery)) {
     db.rollback();
@@ -1217,7 +1255,7 @@ bool SqliteStorage::logMessages(MessageList &msgs) {
   QSqlDatabase db = logDb();
   db.transaction();
 
   QSqlDatabase db = logDb();
   db.transaction();
 
-  QSet<QString> senders;  
+  QSet<QString> senders;
 
   QSqlQuery addSenderQuery(db);
   addSenderQuery.prepare(queryString("insert_sender"));
 
   QSqlQuery addSenderQuery(db);
   addSenderQuery.prepare(queryString("insert_sender"));
@@ -1594,7 +1632,7 @@ bool SqliteMigrationReader::readMo(BacklogMO &backlog) {
   }
 
   backlog.messageid = value(0).toInt();
   }
 
   backlog.messageid = value(0).toInt();
-  backlog.time = QDateTime::fromTime_t(value(1).toInt());
+  backlog.time = QDateTime::fromTime_t(value(1).toInt()).toUTC();
   backlog.bufferid = value(2).toInt();
   backlog.type = value(3).toInt();
   backlog.flags = value(4).toInt();
   backlog.bufferid = value(2).toInt();
   backlog.type = value(3).toInt();
   backlog.flags = value(4).toInt();