Use trigger instead of fk to avoid redundant deletion

This commit is contained in:
Neeraj Gupta
2025-03-19 14:07:58 +05:30
parent 7a9ff9877a
commit 5768eeb1fe
2 changed files with 41 additions and 15 deletions

View File

@@ -12,7 +12,7 @@ import "package:photos/log/devlog.dart";
import "package:sqlite_async/sqlite_async.dart";
class LocalDB with SqlDbBase {
static const _databaseName = "local_2.db";
static const _databaseName = "local_3.db";
static const _batchInsertMaxCount = 1000;
static const _smallTableBatchInsertMaxCount = 5000;
late final SqliteDatabase _sqliteDB;
@@ -101,7 +101,7 @@ class LocalDB with SqlDbBase {
);
}
});
debugPrint(
'$runtimeType insertPathToAssetIDs $pairCount complete in '
'${stopwatch.elapsed.inMilliseconds}ms for '

View File

@@ -30,25 +30,38 @@ class LocalDBMigration {
''',
'''
CREATE TABLE metadata (
id TEXT PRIMARY_KEY,
id TEXT PRIMARY KEY,
hash TEXT NOT NULL,
created_at INTEGER NOT NULL,
modified_at INTEGER NOT NULL,
latitude REAL,
longitude REAL,
PRIMARY KEY (id),
FOREIGN KEY (id) REFERENCES assets (id) ON DELETE CASCADE
longitude REAL
);
''',
'''
CREATE TRIGGER delete_metadata
AFTER DELETE ON assets
FOR EACH ROW
BEGIN
DELETE FROM metadata WHERE id = OLD.id;
END;
''',
'''
CREATE TABLE old_hash (
id TEXT NOT NULL,
hash TEXT NOT NULL,
created_at INTEGER NOT NULL,
PRIMARY KEY (id, hash),
FOREIGN KEY (id) REFERENCES assets (id) ON DELETE CASCADE
PRIMARY KEY (id, hash)
);
''',
''',
'''
CREATE TRIGGER delete_old_hash
AFTER DELETE ON assets
FOR EACH ROW
BEGIN
DELETE FROM old_hash WHERE id = OLD.id;
END;
''',
'''
CREATE TRIGGER update_old_hash
AFTER UPDATE OF hash ON metadata
@@ -72,18 +85,31 @@ class LocalDBMigration {
CREATE TABLE device_path_assets (
path_id TEXT NOT NULL,
asset_id TEXT NOT NULL,
PRIMARY KEY (path_id, asset_id),
FOREIGN KEY (path_id) REFERENCES device_path (path_id) ON DELETE CASCADE,
FOREIGN KEY (asset_id) REFERENCES assets (id) ON DELETE CASCADE
PRIMARY KEY (path_id, asset_id)
);
''',
'''
CREATE TRIGGER delete_device_path_assets
AFTER DELETE ON assets
FOR EACH ROW
BEGIN
DELETE FROM device_path_assets WHERE asset_id = OLD.id;
END;
''',
'''
CREATE TABLE queue (
id TEXT NOT NULL,
name TEXT NOT NULL,
PRIMARY KEY (id, name),
FOREIGN KEY (id) REFERENCES assets (id) ON DELETE CASCADE
)
PRIMARY KEY (id, name)
);
''',
'''
CREATE TRIGGER delete_queue
AFTER DELETE ON assets
FOR EACH ROW
BEGIN
DELETE FROM queue WHERE id = OLD.id;
END;
''',
];