From 86acef1a22908ceffdae3103fcb27ca32bbf8b2f Mon Sep 17 00:00:00 2001 From: chylex Date: Mon, 21 Mar 2022 14:02:52 +0100 Subject: [PATCH] Add option to Advanced tab to vacuum the database --- app/Desktop/Main/Pages/AdvancedPage.axaml | 6 ++++++ app/Desktop/Main/Pages/AdvancedPageModel.cs | 20 +++++++++++++++---- .../Main/Screens/MainContentScreenModel.cs | 6 +++--- app/Server/Database/DummyDatabaseFile.cs | 2 ++ app/Server/Database/IDatabaseFile.cs | 2 ++ .../Database/Sqlite/SqliteDatabaseFile.cs | 6 ++++++ 6 files changed, 35 insertions(+), 7 deletions(-) diff --git a/app/Desktop/Main/Pages/AdvancedPage.axaml b/app/Desktop/Main/Pages/AdvancedPage.axaml index c6939ef..637e4cb 100644 --- a/app/Desktop/Main/Pages/AdvancedPage.axaml +++ b/app/Desktop/Main/Pages/AdvancedPage.axaml @@ -15,5 +15,11 @@ + + + Recreates the database to remove any traces of deleted data, which frees up space and prevents forensic recovery. + + + diff --git a/app/Desktop/Main/Pages/AdvancedPageModel.cs b/app/Desktop/Main/Pages/AdvancedPageModel.cs index 9c7b73f..a531518 100644 --- a/app/Desktop/Main/Pages/AdvancedPageModel.cs +++ b/app/Desktop/Main/Pages/AdvancedPageModel.cs @@ -1,5 +1,6 @@ using System; using Avalonia.Controls; +using DHT.Desktop.Dialogs.Message; using DHT.Desktop.Main.Controls; using DHT.Desktop.Server; using DHT.Server.Database; @@ -9,19 +10,30 @@ namespace DHT.Desktop.Main.Pages { sealed class AdvancedPageModel : BaseModel, IDisposable { public ServerConfigurationPanelModel ServerConfigurationModel { get; } - [Obsolete("Designer")] - public AdvancedPageModel() : this(null!, new ServerManager(DummyDatabaseFile.Instance)) {} + private readonly Window window; + private readonly IDatabaseFile db; + + [Obsolete("Designer")] + public AdvancedPageModel() : this(null!, DummyDatabaseFile.Instance, new ServerManager(DummyDatabaseFile.Instance)) {} + + public AdvancedPageModel(Window window, IDatabaseFile db, ServerManager serverManager) { + this.window = window; + this.db = db; - public AdvancedPageModel(Window window, ServerManager serverManager) { ServerConfigurationModel = new ServerConfigurationPanelModel(window, serverManager); } public void Initialize() { ServerConfigurationModel.Initialize(); } - + public void Dispose() { ServerConfigurationModel.Dispose(); } + + public async void VacuumDatabase() { + db.Vacuum(); + await Dialog.ShowOk(window, "Vacuum Database", "Done."); + } } } diff --git a/app/Desktop/Main/Screens/MainContentScreenModel.cs b/app/Desktop/Main/Screens/MainContentScreenModel.cs index 89e0065..883fc44 100644 --- a/app/Desktop/Main/Screens/MainContentScreenModel.cs +++ b/app/Desktop/Main/Screens/MainContentScreenModel.cs @@ -26,7 +26,7 @@ namespace DHT.Desktop.Main.Screens { private AdvancedPageModel AdvancedPageModel { get; } public DebugPage? DebugPage { get; } - + #if DEBUG public bool HasDebugPage => true; private DebugPageModel DebugPageModel { get; } @@ -66,7 +66,7 @@ namespace DHT.Desktop.Main.Screens { ViewerPageModel = new ViewerPageModel(window, db); ViewerPage = new ViewerPage { DataContext = ViewerPageModel }; - AdvancedPageModel = new AdvancedPageModel(window, serverManager); + AdvancedPageModel = new AdvancedPageModel(window, db, serverManager); AdvancedPage = new AdvancedPage { DataContext = AdvancedPageModel }; #if DEBUG @@ -75,7 +75,7 @@ namespace DHT.Desktop.Main.Screens { #else DebugPage = null; #endif - + StatusBarModel = new StatusBarModel(db.Statistics); AdvancedPageModel.ServerConfigurationModel.ServerStatusChanged += OnServerStatusChanged; diff --git a/app/Server/Database/DummyDatabaseFile.cs b/app/Server/Database/DummyDatabaseFile.cs index 397367a..814673c 100644 --- a/app/Server/Database/DummyDatabaseFile.cs +++ b/app/Server/Database/DummyDatabaseFile.cs @@ -41,6 +41,8 @@ namespace DHT.Server.Database { public void RemoveMessages(MessageFilter filter, MessageFilterRemovalMode mode) {} + public void Vacuum() {} + public void Dispose() {} } } diff --git a/app/Server/Database/IDatabaseFile.cs b/app/Server/Database/IDatabaseFile.cs index 96d6227..8a5787a 100644 --- a/app/Server/Database/IDatabaseFile.cs +++ b/app/Server/Database/IDatabaseFile.cs @@ -21,5 +21,7 @@ namespace DHT.Server.Database { int CountMessages(MessageFilter? filter = null); List GetMessages(MessageFilter? filter = null); void RemoveMessages(MessageFilter filter, MessageFilterRemovalMode mode); + + void Vacuum(); } } diff --git a/app/Server/Database/Sqlite/SqliteDatabaseFile.cs b/app/Server/Database/Sqlite/SqliteDatabaseFile.cs index f076b1a..0fdf00f 100644 --- a/app/Server/Database/Sqlite/SqliteDatabaseFile.cs +++ b/app/Server/Database/Sqlite/SqliteDatabaseFile.cs @@ -436,6 +436,12 @@ LEFT JOIN replied_to rt ON m.message_id = rt.message_id" + filter.GenerateWhereC return dict; } + public void Vacuum() { + using var conn = pool.Take(); + using var cmd = conn.Command("VACUUM"); + cmd.ExecuteNonQuery(); + } + private void UpdateServerStatistics(ISqliteConnection conn) { Statistics.TotalServers = conn.SelectScalar("SELECT COUNT(*) FROM servers") as long? ?? 0; }