From 2d3f41da6f08e001f70cfeb2c172693c1e51eedf Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Fri, 2 Aug 2019 22:58:30 +0200 Subject: [PATCH] Automatically remove devices with old schemas when upgrading --- data/schema/device-schema.sql | 2 +- src/core/database.cpp | 5 ++++- src/device/devicedatabasebackend.cpp | 21 ++++++++++++++++----- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/data/schema/device-schema.sql b/data/schema/device-schema.sql index 6d7740a8a..c4edc08ed 100644 --- a/data/schema/device-schema.sql +++ b/data/schema/device-schema.sql @@ -75,4 +75,4 @@ CREATE VIRTUAL TABLE device_%deviceid_fts USING fts5( tokenize = "unicode61 remove_diacritics 0" ); -UPDATE devices SET schema_version=0 WHERE ROWID=%deviceid; +UPDATE devices SET schema_version=1 WHERE ROWID=%deviceid; diff --git a/src/core/database.cpp b/src/core/database.cpp index cea845089..87febd775 100644 --- a/src/core/database.cpp +++ b/src/core/database.cpp @@ -147,7 +147,10 @@ QSqlDatabase Database::Connect() { UpdateDatabaseSchema(0, db); } - else if (SchemaVersion(&db) <= 8) { // Register unicode from unicode61 tokenizer to drop old FTS3 tables. + { + // Register unicode from unicode61 tokenizer to drop old FTS3 tables. + // We need it also to drop old devices later when loading devices. + // And that's done in a different thread after schemas are upgraded, so register it anyway. #ifdef SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER QVariant v = db.driver()->handle(); if (v.isValid() && qstrcmp(v.typeName(), "sqlite3*") == 0) { diff --git a/src/device/devicedatabasebackend.cpp b/src/device/devicedatabasebackend.cpp index 31c1cb242..5c52914ed 100644 --- a/src/device/devicedatabasebackend.cpp +++ b/src/device/devicedatabasebackend.cpp @@ -40,7 +40,7 @@ #include "core/logging.h" #include "devicedatabasebackend.h" -const int DeviceDatabaseBackend::kDeviceSchemaVersion = 0; +const int DeviceDatabaseBackend::kDeviceSchemaVersion = 1; DeviceDatabaseBackend::DeviceDatabaseBackend(QObject *parent) : QObject(parent), @@ -81,12 +81,13 @@ void DeviceDatabaseBackend::Exit() { DeviceDatabaseBackend::DeviceList DeviceDatabaseBackend::GetAllDevices() { DeviceList ret; + DeviceList old_devices; { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q(db); - q.prepare("SELECT ROWID, unique_id, friendly_name, size, icon, transcode_mode, transcode_format FROM devices"); + q.prepare("SELECT ROWID, unique_id, friendly_name, size, icon, schema_version, transcode_mode, transcode_format FROM devices"); q.exec(); if (db_->CheckErrors(q)) return ret; @@ -97,12 +98,22 @@ DeviceDatabaseBackend::DeviceList DeviceDatabaseBackend::GetAllDevices() { dev.friendly_name_ = q.value(2).toString(); dev.size_ = q.value(3).toLongLong(); dev.icon_name_ = q.value(4).toString(); - dev.transcode_mode_ = MusicStorage::TranscodeMode(q.value(5).toInt()); - dev.transcode_format_ = Song::FileType(q.value(6).toInt()); - ret << dev; + int schema_version = q.value(5).toInt(); + dev.transcode_mode_ = MusicStorage::TranscodeMode(q.value(6).toInt()); + dev.transcode_format_ = Song::FileType(q.value(7).toInt()); + if (schema_version < kDeviceSchemaVersion) { // Device is using old schema, drop it. + old_devices << dev; + } + else { + ret << dev; + } } } + for (Device dev : old_devices) { + RemoveDevice(dev.id_); + } + Close(); return ret;