X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fsqlitestorage.cpp;h=2f4fa091219643a22513145ea4a1ccd4eb9319b2;hp=fcc52adf173fb96d473e100c4374b44ec17b0366;hb=16c9fb5606113ddbcbe4be61f8ed2b775f31055e;hpb=b040ef84cdc254a0b1f083db3151f2724e45d210 diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index fcc52adf..2f4fa091 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -152,53 +152,71 @@ void SqliteStorage::renameUser(UserId user, const QString &newName) { } 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)); - - 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_authuser")); + query.bindValue(":username", user); + query.bindValue(":password", cryptedPassword(password)); + + lockForRead(); + safeExec(query); + + if(query.first()) { + userId = query.value(0).toInt(); + } } + unlock(); + + return userId; } UserId SqliteStorage::getUserId(const QString &username) { - QSqlQuery query(logDb()); - query.prepare(queryString("select_userid")); - query.bindValue(":username", username); + UserId userId; - lockForRead(); - safeExec(query); + // 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); - if(query.first()) { - unlock(); - return query.value(0).toInt(); - } else { - unlock(); - return 0; + lockForRead(); + safeExec(query); + + if(query.first()) { + userId = query.value(0).toInt(); + } } + unlock(); + + return userId; } 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) { @@ -442,7 +460,7 @@ QList SqliteStorage::identities(UserId user) { QList identities; QSqlDatabase db = logDb(); db.transaction(); - + QSqlQuery query(db); query.prepare(queryString("select_identities")); query.bindValue(":userid", user.toInt()); @@ -498,7 +516,7 @@ NetworkId SqliteStorage::createNetwork(UserId user, const NetworkInfo &info) { QSqlDatabase db = logDb(); db.transaction(); - + QSqlQuery query(db); query.prepare(queryString("insert_network")); query.bindValue(":userid", user.toInt()); @@ -526,7 +544,7 @@ NetworkId SqliteStorage::createNetwork(UserId user, const NetworkInfo &info) { return NetworkId(); } } - + db.commit(); unlock(); return networkId; @@ -741,7 +759,7 @@ QList SqliteStorage::connectedNetworks(UserId user) { QSqlDatabase db = logDb(); db.transaction(); - + QSqlQuery query(db); query.prepare(queryString("select_connected_networks")); query.bindValue(":userid", user.toInt()); @@ -1128,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()); + delBufferQuery.bindValue(":userid", user.toInt()); safeExec(delBufferQuery); if(!watchQuery(delBufferQuery)) { db.rollback(); @@ -1236,7 +1255,7 @@ bool SqliteStorage::logMessages(MessageList &msgs) { QSqlDatabase db = logDb(); db.transaction(); - QSet senders; + QSet senders; QSqlQuery addSenderQuery(db); addSenderQuery.prepare(queryString("insert_sender")); @@ -1613,7 +1632,7 @@ bool SqliteMigrationReader::readMo(BacklogMO &backlog) { } 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();