From 09b9df73ca9decca2555f1d0024806cfd090ea5a Mon Sep 17 00:00:00 2001 From: Michael Marley Date: Mon, 4 May 2015 21:27:14 -0400 Subject: [PATCH] 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. --- src/core/postgresqlstorage.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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(); -- 2.20.1