[client] Upgrade offtheline, clear data on logout

This commit is contained in:
Abhishek Shroff
2024-09-18 18:19:52 +05:30
parent 5e0f3ffefe
commit e499f56854
8 changed files with 71 additions and 23 deletions

View File

@@ -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<void> 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);
}
}

View File

@@ -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<void> 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'));
}

View File

@@ -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<void> deleteDatabase({
required Directory? storageDir,
required String id,
}) =>
throw UnimplementedError();

View File

@@ -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<void> 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';
}

View File

@@ -27,7 +27,7 @@ class PhylumApiErrorResponse {
Map<String, dynamic> _tansformResponse(String response) => (jsonDecode(response) as Map<String, dynamic>?) ?? const {};
class PhylumAccount extends Account<PhylumApiResponse, PhylumApiErrorResponse, PhylumAccount> {
late final db = AppDatabase(id);
late final db = AppDatabase(id: id);
late final resourceRepository = ResourceRepository(account: this);
final datastore = PhylumDatastore();
final actionQueue = ApiActionQueue<PhylumApiResponse, PhylumApiErrorResponse, PhylumAccount>();
@@ -78,7 +78,8 @@ class PhylumAccount extends Account<PhylumApiResponse, PhylumApiErrorResponse, P
@override
Future<void> clearData() async {
return db.close();
await super.clearData();
await db.dropDatabase();
}
Future<void> addAction(ApiAction<PhylumAccount> action) async {

View File

@@ -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);

View File

@@ -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"

View File

@@ -21,7 +21,7 @@ dependencies:
offtheline:
git:
url: https://codeberg.org/shroff/offtheline.git
ref: 92e25481826031de13839d1a001e350eed4960db
ref: ad3d1e804990bcb9ca65a1e5d003b1cb680908e0
open_file:
path:
path_provider: