core: Fix 64-bit ID SQLite -> Postgres migration
authorShane Synan <digitalcircuit36939@gmail.com>
Sun, 13 May 2018 22:07:07 +0000 (17:07 -0500)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 23 May 2018 22:33:28 +0000 (00:33 +0200)
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 (50000000005000000000000,
        (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
src/core/sqlitestorage.h

index 6fe8ffd..e9882da 100644 (file)
@@ -2427,7 +2427,7 @@ bool SqliteMigrationReader::readMo(SenderMO &sender)
 
 bool SqliteMigrationReader::readMo(BacklogMO &backlog)
 {
 
 bool SqliteMigrationReader::readMo(BacklogMO &backlog)
 {
-    int skipSteps = 0;
+    qint64 skipSteps = 0;
     while (!next()) {
         if (backlog.messageid < _maxId) {
             bindValue(0, backlog.messageid.toQint64() + (skipSteps * stepSize()));
     while (!next()) {
         if (backlog.messageid < _maxId) {
             bindValue(0, backlog.messageid.toQint64() + (skipSteps * stepSize()));
index f72a839..0ab7921 100644 (file)
@@ -175,7 +175,7 @@ public:
 
     bool prepareQuery(MigrationObject mo) override;
 
 
     bool prepareQuery(MigrationObject mo) override;
 
-    int stepSize() { return 50000; }
+    qint64 stepSize() { return 50000; }
 
 protected:
     bool transaction()  override { return logDb().transaction(); }
 
 protected:
     bool transaction()  override { return logDb().transaction(); }