diff --git a/client/lib/libphylum/db/db.dart b/client/lib/libphylum/db/db.dart index 286d73a4..02597837 100644 --- a/client/lib/libphylum/db/db.dart +++ b/client/lib/libphylum/db/db.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:drift/drift.dart'; import 'package:phylum/libphylum/db/resources.dart'; @@ -7,10 +9,11 @@ part 'db.g.dart'; @DriftDatabase(tables: [Resources]) class AppDatabase extends _$AppDatabase { - static String storageDir = ''; - static String tmpDir = ''; + static Directory? storageDir; + static Directory? tmpDir; + final String id; - AppDatabase(String id) : super(_openConnection(id)); + AppDatabase({required this.id}) : super(_openConnection(id)); @override int get schemaVersion => 5; @@ -23,7 +26,12 @@ class AppDatabase extends _$AppDatabase { await m.createAll(); }); + Future dropDatabase() async { + await super.close(); + await deleteDatabase(storageDir: storageDir, id: id); + } + static QueryExecutor _openConnection(String id) { - return openDatabase(storageDir: storageDir, tmpDir: tmpDir, name: '$id-drift'); + return openDatabase(storageDir: storageDir, tmpDir: tmpDir, id: id); } } diff --git a/client/lib/libphylum/db/native.dart b/client/lib/libphylum/db/native.dart index 44cfd30d..31949f68 100644 --- a/client/lib/libphylum/db/native.dart +++ b/client/lib/libphylum/db/native.dart @@ -6,14 +6,25 @@ import 'package:path/path.dart' as p; import 'package:sqlite3/sqlite3.dart'; QueryExecutor openDatabase({ - required String storageDir, - required String tmpDir, - required String name, + required Directory? storageDir, + required Directory? tmpDir, + required String id, }) { return LazyDatabase(() async { - final file = File(p.join(storageDir, '$name.sqlite')); - sqlite3.tempDirectory = tmpDir; + final file = _dbFile(storageDir, id); + sqlite3.tempDirectory = tmpDir!.path; return NativeDatabase.createInBackground(file); }); } + +Future deleteDatabase({ + required Directory? storageDir, + required String id, +}) { + return _dbFile(storageDir, id).delete(); +} + +File _dbFile(Directory? storageDir, String id) { + return File(p.join(storageDir!.path, '$id-phylum.db')); +} diff --git a/client/lib/libphylum/db/unsupported.dart b/client/lib/libphylum/db/unsupported.dart index 7e982c0a..413519a6 100644 --- a/client/lib/libphylum/db/unsupported.dart +++ b/client/lib/libphylum/db/unsupported.dart @@ -1,8 +1,16 @@ +import 'dart:io'; + import 'package:drift/drift.dart'; QueryExecutor openDatabase({ - required String storageDir, - required String tmpDir, - required String name, + required Directory? storageDir, + required Directory? tmpDir, + required String id, +}) => + throw UnimplementedError(); + +Future deleteDatabase({ + required Directory? storageDir, + required String id, }) => throw UnimplementedError(); diff --git a/client/lib/libphylum/db/web.dart b/client/lib/libphylum/db/web.dart index b467d1dd..aef98232 100644 --- a/client/lib/libphylum/db/web.dart +++ b/client/lib/libphylum/db/web.dart @@ -1,14 +1,16 @@ +import 'dart:io'; + import 'package:drift/drift.dart'; import 'package:drift/wasm.dart'; QueryExecutor openDatabase({ - required String storageDir, - required String tmpDir, - required String name, + required Directory? storageDir, + required Directory? tmpDir, + required String id, }) { return DatabaseConnection.delayed(Future(() async { final result = await WasmDatabase.open( - databaseName: name, + databaseName: _dbName(id), sqlite3Uri: Uri.parse('sqlite3.wasm'), driftWorkerUri: Uri.parse('drift_worker.js'), ); @@ -24,3 +26,21 @@ QueryExecutor openDatabase({ return result.resolvedExecutor; })); } + +Future deleteDatabase({ + required Directory? storageDir, + required String id, +}) async { + final probe = await WasmDatabase.probe( + sqlite3Uri: Uri.parse('sqlite3.wasm'), + driftWorkerUri: Uri.parse('drift_worker.js'), + databaseName: _dbName(id), + ); + for (final db in probe.existingDatabases) { + await probe.deleteDatabase(db); + } +} + +String _dbName(String id) { + return '$id-phylum.db'; +} diff --git a/client/lib/libphylum/phylum_account.dart b/client/lib/libphylum/phylum_account.dart index 4997dd80..8b1f5c0b 100644 --- a/client/lib/libphylum/phylum_account.dart +++ b/client/lib/libphylum/phylum_account.dart @@ -27,7 +27,7 @@ class PhylumApiErrorResponse { Map _tansformResponse(String response) => (jsonDecode(response) as Map?) ?? const {}; class PhylumAccount extends Account { - late final db = AppDatabase(id); + late final db = AppDatabase(id: id); late final resourceRepository = ResourceRepository(account: this); final datastore = PhylumDatastore(); final actionQueue = ApiActionQueue(); @@ -78,7 +78,8 @@ class PhylumAccount extends Account clearData() async { - return db.close(); + await super.clearData(); + await db.dropDatabase(); } Future addAction(ApiAction action) async { diff --git a/client/lib/main.dart b/client/lib/main.dart index 6f3775d7..c3353f4d 100644 --- a/client/lib/main.dart +++ b/client/lib/main.dart @@ -37,8 +37,8 @@ void main() async { final appDir = (Platform.isLinux) ? Directory(path.join((await getApplicationSupportDirectory()).path, storageDir.isNotEmpty ? storageDir : 'data')) : await getApplicationDocumentsDirectory(); - AppDatabase.storageDir = appDir.path; - AppDatabase.tmpDir = (await getTemporaryDirectory()).path; + AppDatabase.storageDir = appDir; + AppDatabase.tmpDir = await getTemporaryDirectory(); await appDir.create(); Hive.init(appDir.path); diff --git a/client/pubspec.lock b/client/pubspec.lock index 665dd40d..da186a5f 100644 --- a/client/pubspec.lock +++ b/client/pubspec.lock @@ -577,8 +577,8 @@ packages: dependency: "direct main" description: path: "." - ref: "92e25481826031de13839d1a001e350eed4960db" - resolved-ref: "92e25481826031de13839d1a001e350eed4960db" + ref: ad3d1e804990bcb9ca65a1e5d003b1cb680908e0 + resolved-ref: ad3d1e804990bcb9ca65a1e5d003b1cb680908e0 url: "https://codeberg.org/shroff/offtheline.git" source: git version: "0.14.0" diff --git a/client/pubspec.yaml b/client/pubspec.yaml index d084bf54..51307fcf 100644 --- a/client/pubspec.yaml +++ b/client/pubspec.yaml @@ -21,7 +21,7 @@ dependencies: offtheline: git: url: https://codeberg.org/shroff/offtheline.git - ref: 92e25481826031de13839d1a001e350eed4960db + ref: ad3d1e804990bcb9ca65a1e5d003b1cb680908e0 open_file: path: path_provider: