From acef37fa581fa0094238f9bfaed513fa4b3fb14d Mon Sep 17 00:00:00 2001 From: Bart De Vries Date: Tue, 29 Jun 2021 20:52:40 +0200 Subject: [PATCH] Fix database migration by avoiding DROP COLUMN AND ADD COLUMN --- src/database.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/database.cpp b/src/database.cpp index 03da9bdf..294fb301 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -80,13 +80,18 @@ bool Database::migrateTo2() bool Database::migrateTo3() { qDebug() << "Migrating database to version 3"; - TRUE_OR_RETURN(execute(QStringLiteral("ALTER TABLE Enclosures ADD COLUMN downloaded_temp BOOL DEFAULT 0;"))); - TRUE_OR_RETURN(execute(QStringLiteral("UPDATE Enclosures SET downloaded_temp=1 WHERE downloaded=1;"))); - TRUE_OR_RETURN(execute(QStringLiteral("ALTER TABLE Enclosures DROP COLUMN downloaded;"))); - TRUE_OR_RETURN(execute(QStringLiteral("ALTER TABLE Enclosures ADD COLUMN downloaded INTEGER DEFAULT 0;"))); - TRUE_OR_RETURN(execute(QStringLiteral("UPDATE Enclosures SET downloaded=3 WHERE downloaded_temp=1;"))); - TRUE_OR_RETURN(execute(QStringLiteral("ALTER TABLE Enclosures DROP COLUMN downloaded_temp;"))); + TRUE_OR_RETURN(execute(QStringLiteral("BEGIN TRANSACTION;"))); + TRUE_OR_RETURN( + execute(QStringLiteral("CREATE TABLE IF NOT EXISTS Enclosurestemp (feed TEXT, id TEXT, duration INTEGER, size INTEGER, title TEXT, type TEXT, url " + "TEXT, playposition INTEGER, downloaded INTEGER);"))); + TRUE_OR_RETURN( + execute(QStringLiteral("INSERT INTO Enclosurestemp (feed, id, duration, size, title, type, url, playposition, downloaded) SELECT feed, id, duration, " + "size, title, type, url, playposition, downloaded FROM Enclosures;"))); + TRUE_OR_RETURN(execute(QStringLiteral("UPDATE Enclosurestemp SET downloaded=3 WHERE downloaded=1;"))); + TRUE_OR_RETURN(execute(QStringLiteral("DROP TABLE Enclosures;"))); + TRUE_OR_RETURN(execute(QStringLiteral("ALTER TABLE Enclosurestemp RENAME TO Enclosures;"))); TRUE_OR_RETURN(execute(QStringLiteral("PRAGMA user_version = 3;"))); + TRUE_OR_RETURN(execute(QStringLiteral("COMMIT;"))); return true; }