From 6ca54f0776876390655a63c7f2982d4f59366c96 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Sat, 13 Aug 2022 03:09:42 +0800 Subject: [PATCH] Add VACUUM to dev settings --- app/lib/entity/sqlite_table_extension.dart | 11 +++++++++++ app/lib/widget/settings.dart | 23 ++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/app/lib/entity/sqlite_table_extension.dart b/app/lib/entity/sqlite_table_extension.dart index 71f19952..738bb748 100644 --- a/app/lib/entity/sqlite_table_extension.dart +++ b/app/lib/entity/sqlite_table_extension.dart @@ -99,6 +99,17 @@ extension SqliteDbExtension on SqliteDb { }); } + /// Run [block] after acquiring the database + /// + /// The [db] argument passed to [block] is identical to this + /// + /// This function does not start a transaction, see [use] instead + Future useNoTransaction(Future Function(SqliteDb db) block) async { + return await platform.Lock.synchronized(k.appDbLockId, () async { + return await block(this); + }); + } + /// Start an isolate and run [callback] there, with access to the /// SQLite database Future isolate(T args, ComputeWithDbCallback callback) async { diff --git a/app/lib/widget/settings.dart b/app/lib/widget/settings.dart index e2cee093..202c3373 100644 --- a/app/lib/widget/settings.dart +++ b/app/lib/widget/settings.dart @@ -1622,6 +1622,10 @@ class _DevSettingsState extends State<_DevSettings> { title: const Text("Clear cache database"), onTap: () => _clearCacheDb(), ), + ListTile( + title: const Text("SQL:VACUUM"), + onTap: () => _runSqlVacuum(), + ), ], ), ), @@ -1652,6 +1656,25 @@ class _DevSettingsState extends State<_DevSettings> { } } + Future _runSqlVacuum() async { + try { + final c = KiwiContainer().resolve(); + await c.sqliteDb.useNoTransaction((db) async { + await db.customStatement("VACUUM;"); + }); + SnackBarManager().showSnackBar(const SnackBar( + content: Text("Finished successfully"), + duration: k.snackBarDurationShort, + )); + } catch (e, stackTrace) { + SnackBarManager().showSnackBar(SnackBar( + content: Text(exception_util.toUserString(e)), + duration: k.snackBarDurationNormal, + )); + _log.shout("[_runSqlVacuum] Uncaught exception", e, stackTrace); + } + } + static final _log = Logger("widget.settings._DevSettingsState"); }