import 'package:veilid/veilid.dart'; import 'veilid_init.dart'; Future tableScope( String name, Future Function(VeilidTableDB tdb) callback, {int columnCount = 1}) async { final veilid = await eventualVeilid.future; final tableDB = await veilid.openTableDB(name, columnCount); try { return await callback(tableDB); } finally { tableDB.close(); } } Future transactionScope( VeilidTableDB tdb, Future Function(VeilidTableDBTransaction tdbt) callback, ) async { final tdbt = tdb.transact(); try { final ret = await callback(tdbt); if (!tdbt.isDone()) { await tdbt.commit(); } return ret; } finally { if (!tdbt.isDone()) { await tdbt.rollback(); } } } abstract mixin class AsyncTableDBBacked { String tableName(); String tableKeyName(); T valueFromJson(Object? obj); Object? valueToJson(T val); /// Load things from storage Future load() async { final obj = await tableScope(tableName(), (tdb) async { final objJson = await tdb.loadStringJson(0, tableKeyName()); return valueFromJson(objJson); }); return obj; } /// Store things to storage Future store(T obj) async { await tableScope(tableName(), (tdb) async { await tdb.storeStringJson(0, tableKeyName(), valueToJson(obj)); }); } }