From a6bcc52535bc584405de447e5fc8dbb63e89c6f4 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