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;
}