From c0aba6b60277e5329f40513c66725dd0c52ee1b4 Mon Sep 17 00:00:00 2001 From: Shane Synan Date: Sun, 13 May 2018 17:07:07 -0500 Subject: [PATCH] core: Fix 64-bit ID SQLite -> Postgres migration Change skipSteps and stepSize() from 32-bit int to qint64, avoiding integer wraparound during backlog reading for migration. This only gets triggered when a message with a 64-bit ID exists in the SQLite backlog before migration. One can force this by sending a message with the text 'MARKER_MSG', then running this on the SQLite database before migration. INSERT INTO backlog (messageid, time, bufferid, type, flags, senderid, senderprefixes, message) VALUES (5000000000, 5000000000000, (SELECT bufferid FROM backlog WHERE message = 'MARKER_MSG'), 1, 1, (SELECT senderid FROM backlog WHERE message = 'MARKER_MSG'), "", "Test 64-bit message"); > Before, debug output SQLi::readMo - skipSteps 42948, start 2147400383, stop 2147450383 SQLi::readMo - skipSteps 42949, start 2147450383, stop -2147466913 SQLi::readMo - skipSteps 42950, start -2147466913, stop -2147416913 ... SQLi::readMo - skipSteps 85898, start -66913, stop -16913 SQLi::readMo - skipSteps 85899, start -16913, stop 33087 SQLi::readMo - MsgId: 1, message: Connecting to chat.freenode.net:... PSql::writeMo - MsgId: 1, message: Connecting to chat.freenode.net... > After, debug output SQLi::readMo - skipSteps 99999, start 4999950383, stop 5000000383 SQLi::readMo - MsgId: 5000000000, message: Test 64-bit message PSql::writeMo - MsgId: 5000000000, message: Test 64-bit message --- src/core/sqlitestorage.cpp | 2 +- src/core/sqlitestorage.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index 6fe8ffd4..e9882da3 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -2427,7 +2427,7 @@ bool SqliteMigrationReader::readMo(SenderMO &sender) bool SqliteMigrationReader::readMo(BacklogMO &backlog) { - int skipSteps = 0; + qint64 skipSteps = 0; while (!next()) { if (backlog.messageid < _maxId) { bindValue(0, backlog.messageid.toQint64() + (skipSteps * stepSize())); diff --git a/src/core/sqlitestorage.h b/src/core/sqlitestorage.h index f72a8391..0ab79213 100644 --- a/src/core/sqlitestorage.h +++ b/src/core/sqlitestorage.h @@ -175,7 +175,7 @@ public: bool prepareQuery(MigrationObject mo) override; - int stepSize() { return 50000; } + qint64 stepSize() { return 50000; } protected: bool transaction() override { return logDb().transaction(); } -- 2.20.1