Simplify schema

This commit is contained in:
Neeraj Gupta
2025-03-26 14:39:29 +05:30
parent 9351a52800
commit b6ffb3ca22
3 changed files with 18 additions and 64 deletions

View File

@@ -11,7 +11,7 @@ import "package:photos/db/local/schema.dart";
import "package:photos/log/devlog.dart";
import "package:sqlite_async/sqlite_async.dart";
import "../../models/file/file.dart";
import 'package:photos/models/file/file.dart';
class LocalDB with SqlDbBase {
static const _databaseName = "local_4.db";
@@ -38,7 +38,7 @@ class LocalDB with SqlDbBase {
final List<List<Object?>> values =
slice.map((e) => LocalDBMappers.assetsRow(e)).toList();
await _sqliteDB.executeBatch(
'INSERT OR REPLACE INTO assets ($assetColumns) values(${getParams(15)})',
'INSERT INTO assets ($assetColumns) values(${getParams(16)}) ON CONFLICT(id) DO UPDATE SET $updateAssetColumns',
values,
);
});

View File

@@ -23,6 +23,7 @@ class LocalDBMappers {
entity.mimeType,
entity.latitude,
entity.longitude,
0, // scan_state
];
}

View File

@@ -2,7 +2,14 @@ import "package:flutter/foundation.dart";
import "package:sqlite_async/sqlite_async.dart";
const assetColumns =
"id, type, sub_type, width, height, duration_in_sec, orientation, is_fav, title, relative_path, created_at, modified_at, mime_type, latitude, longitude";
"id, type, sub_type, width, height, duration_in_sec, orientation, is_fav, title, relative_path, created_at, modified_at, mime_type, latitude, longitude, scan_state";
// Generate the update clause dynamically (excludes 'id')
final updateAssetColumns = assetColumns
.split(', ')
.where((column) => column != 'id') // Exclude primary key from update
.map((column) => '$column = excluded.$column') // Use excluded virtual table
.join(', ');
const devicePathColumns =
"path_id, name, album_type, ios_album_type, ios_album_subtype";
@@ -25,54 +32,14 @@ class LocalDBMigration {
modified_at INTEGER NOT NULL,
mime_type TEXT,
latitude REAL,
longitude REAL
longitude REAL,
scan_state INTEGER DEFAULT 0,
hash TEXT,
size INTEGER,
os_metadata TEXT DEFAULT '{}'
);
''',
'''
CREATE TABLE metadata (
id TEXT PRIMARY KEY,
hash TEXT NOT NULL,
created_at INTEGER NOT NULL,
modified_at INTEGER NOT NULL,
latitude REAL,
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)
);
''',
'''
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
FOR EACH ROW
WHEN OLD.hash != NEW.hash AND NEW.hash IS NOT NULL
BEGIN
INSERT OR REPLACE INTO old_hash (id, hash, created_at)
VALUES (OLD.id, OLD.hash, strftime('%s', 'now'));
END;
''',
'''
CREATE TABLE device_path (
path_id TEXT PRIMARY KEY,
name TEXT NOT NULL,
@@ -86,31 +53,17 @@ class LocalDBMigration {
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)
FOREIGN KEY (asset_id) REFERENCES assets(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)
);
''',
'''
CREATE TRIGGER delete_queue
AFTER DELETE ON assets
FOR EACH ROW
BEGIN
DELETE FROM queue WHERE id = OLD.id;
END;
''',
];
static Future<void> migrate(