From: Michael Marley Date: Tue, 5 May 2015 01:27:14 +0000 (-0400) Subject: Fix SQL errors caused by sender insertion from multiple threads X-Git-Tag: 0.12.3~48 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=a6bcc52535bc584405de447e5fc8dbb63e89c6f4 Fix SQL errors caused by sender insertion from multiple threads At least on Qt5, the QSqlQuery.lastQuery() function, when used with prepared queries, returns the EXECUTE statement and not the actual query. Qt then attempts to PREPARE this statement, which causes a syntax error, aborting the transaction and dropping the message that was to be inserted. A better idea would be to execute the named prepared query directly, which avoids the problem. --- diff --git a/src/core/postgresqlstorage.cpp b/src/core/postgresqlstorage.cpp index 68cf2544..e7a71e7b 100644 --- a/src/core/postgresqlstorage.cpp +++ b/src/core/postgresqlstorage.cpp @@ -1381,8 +1381,7 @@ bool PostgreSqlStorage::logMessage(Message &msg) if (addSenderQuery.lastError().isValid()) { rollbackSavePoint("sender_sp1", db); - getSenderIdQuery.prepare(getSenderIdQuery.lastQuery()); - safeExec(getSenderIdQuery); + getSenderIdQuery = executePreparedQuery("select_senderid", msg.sender(), db); watchQuery(getSenderIdQuery); getSenderIdQuery.first(); senderId = getSenderIdQuery.value(0).toInt(); @@ -1452,8 +1451,7 @@ bool PostgreSqlStorage::logMessages(MessageList &msgs) if (addSenderQuery.lastError().isValid()) { // seems it was inserted meanwhile... by a different thread rollbackSavePoint("sender_sp", db); - selectSenderQuery.prepare(selectSenderQuery.lastQuery()); - safeExec(selectSenderQuery); + selectSenderQuery = executePreparedQuery("select_senderid", sender, db); watchQuery(selectSenderQuery); selectSenderQuery.first(); senderIdList << selectSenderQuery.value(0).toInt();