Add option to Advanced tab to vacuum the database

This commit is contained in:
chylex 2022-03-21 14:02:52 +01:00
parent 277e241183
commit 86acef1a22
No known key found for this signature in database
GPG Key ID: 4DE42C8F19A80548
6 changed files with 35 additions and 7 deletions

View File

@ -15,5 +15,11 @@
<Expander Header="Internal Server Configuration" IsExpanded="True"> <Expander Header="Internal Server Configuration" IsExpanded="True">
<controls:ServerConfigurationPanel DataContext="{Binding ServerConfigurationModel}" /> <controls:ServerConfigurationPanel DataContext="{Binding ServerConfigurationModel}" />
</Expander> </Expander>
<Expander Header="Database Tools" IsExpanded="True">
<StackPanel Orientation="Vertical" Spacing="10">
<TextBlock TextWrapping="Wrap">Recreates the database to remove any traces of deleted data, which frees up space and prevents forensic recovery.</TextBlock>
<Button Command="{Binding VacuumDatabase}">Vacuum Database</Button>
</StackPanel>
</Expander>
</StackPanel> </StackPanel>
</UserControl> </UserControl>

View File

@ -1,5 +1,6 @@
using System; using System;
using Avalonia.Controls; using Avalonia.Controls;
using DHT.Desktop.Dialogs.Message;
using DHT.Desktop.Main.Controls; using DHT.Desktop.Main.Controls;
using DHT.Desktop.Server; using DHT.Desktop.Server;
using DHT.Server.Database; using DHT.Server.Database;
@ -9,19 +10,30 @@ namespace DHT.Desktop.Main.Pages {
sealed class AdvancedPageModel : BaseModel, IDisposable { sealed class AdvancedPageModel : BaseModel, IDisposable {
public ServerConfigurationPanelModel ServerConfigurationModel { get; } public ServerConfigurationPanelModel ServerConfigurationModel { get; }
[Obsolete("Designer")] private readonly Window window;
public AdvancedPageModel() : this(null!, new ServerManager(DummyDatabaseFile.Instance)) {} 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); ServerConfigurationModel = new ServerConfigurationPanelModel(window, serverManager);
} }
public void Initialize() { public void Initialize() {
ServerConfigurationModel.Initialize(); ServerConfigurationModel.Initialize();
} }
public void Dispose() { public void Dispose() {
ServerConfigurationModel.Dispose(); ServerConfigurationModel.Dispose();
} }
public async void VacuumDatabase() {
db.Vacuum();
await Dialog.ShowOk(window, "Vacuum Database", "Done.");
}
} }
} }

View File

@ -26,7 +26,7 @@ namespace DHT.Desktop.Main.Screens {
private AdvancedPageModel AdvancedPageModel { get; } private AdvancedPageModel AdvancedPageModel { get; }
public DebugPage? DebugPage { get; } public DebugPage? DebugPage { get; }
#if DEBUG #if DEBUG
public bool HasDebugPage => true; public bool HasDebugPage => true;
private DebugPageModel DebugPageModel { get; } private DebugPageModel DebugPageModel { get; }
@ -66,7 +66,7 @@ namespace DHT.Desktop.Main.Screens {
ViewerPageModel = new ViewerPageModel(window, db); ViewerPageModel = new ViewerPageModel(window, db);
ViewerPage = new ViewerPage { DataContext = ViewerPageModel }; ViewerPage = new ViewerPage { DataContext = ViewerPageModel };
AdvancedPageModel = new AdvancedPageModel(window, serverManager); AdvancedPageModel = new AdvancedPageModel(window, db, serverManager);
AdvancedPage = new AdvancedPage { DataContext = AdvancedPageModel }; AdvancedPage = new AdvancedPage { DataContext = AdvancedPageModel };
#if DEBUG #if DEBUG
@ -75,7 +75,7 @@ namespace DHT.Desktop.Main.Screens {
#else #else
DebugPage = null; DebugPage = null;
#endif #endif
StatusBarModel = new StatusBarModel(db.Statistics); StatusBarModel = new StatusBarModel(db.Statistics);
AdvancedPageModel.ServerConfigurationModel.ServerStatusChanged += OnServerStatusChanged; AdvancedPageModel.ServerConfigurationModel.ServerStatusChanged += OnServerStatusChanged;

View File

@ -41,6 +41,8 @@ namespace DHT.Server.Database {
public void RemoveMessages(MessageFilter filter, MessageFilterRemovalMode mode) {} public void RemoveMessages(MessageFilter filter, MessageFilterRemovalMode mode) {}
public void Vacuum() {}
public void Dispose() {} public void Dispose() {}
} }
} }

View File

@ -21,5 +21,7 @@ namespace DHT.Server.Database {
int CountMessages(MessageFilter? filter = null); int CountMessages(MessageFilter? filter = null);
List<Message> GetMessages(MessageFilter? filter = null); List<Message> GetMessages(MessageFilter? filter = null);
void RemoveMessages(MessageFilter filter, MessageFilterRemovalMode mode); void RemoveMessages(MessageFilter filter, MessageFilterRemovalMode mode);
void Vacuum();
} }
} }

View File

@ -436,6 +436,12 @@ LEFT JOIN replied_to rt ON m.message_id = rt.message_id" + filter.GenerateWhereC
return dict; return dict;
} }
public void Vacuum() {
using var conn = pool.Take();
using var cmd = conn.Command("VACUUM");
cmd.ExecuteNonQuery();
}
private void UpdateServerStatistics(ISqliteConnection conn) { private void UpdateServerStatistics(ISqliteConnection conn) {
Statistics.TotalServers = conn.SelectScalar("SELECT COUNT(*) FROM servers") as long? ?? 0; Statistics.TotalServers = conn.SelectScalar("SELECT COUNT(*) FROM servers") as long? ?? 0;
} }