feat: add database details section to settings

Shows path to database (click to copy), database size, database log
size, message count.

Also adds a Ctrl+Shift button to wipe the database permanently. This is
performed by clearing the Messages collection and then rebuilding the
database, which brings it down to around 48KB on my machine (even with
many messages).
This commit is contained in:
Dean Sheather
2024-04-11 18:46:26 +10:00
parent 8b7a671e52
commit 715fb7aa5b
7 changed files with 265 additions and 15 deletions
+32 -6
View File
@@ -140,9 +140,6 @@ internal class Store : IDisposable {
bson => DateTime.UnixEpoch.AddMilliseconds(bson.AsInt64)
);
Database = Connect();
Messages.EnsureIndex(msg => msg.Date);
Messages.EnsureIndex(msg => msg.SortCode);
Messages.EnsureIndex(msg => msg.ExtraChatChannel);
Plugin.ChatGui.ChatMessageUnhandled += ChatMessage;
Plugin.Framework.Update += GetMessageInfo;
@@ -159,17 +156,26 @@ internal class Store : IDisposable {
Database.Dispose();
}
private ILiteDatabase Connect() {
internal static string DatabasePath()
{
var dir = Plugin.Interface.ConfigDirectory;
dir.Create();
return Path.Join(dir.FullName, "chat.db");
}
var dbPath = Path.Join(dir.FullName, "chat.db");
private LiteDatabase Connect() {
var dbPath = DatabasePath();
var connection = Plugin.Config.SharedMode ? "shared" : "direct";
var connString = $"Filename='{dbPath}';Connection={connection}";
return new LiteDatabase(connString, BsonMapper.Global) {
var conn = new LiteDatabase(connString, BsonMapper.Global) {
CheckpointSize = 1_000,
Timeout = TimeSpan.FromSeconds(1),
};
var messages = conn.GetCollection<Message>("messages");
messages.EnsureIndex(msg => msg.Date);
messages.EnsureIndex(msg => msg.SortCode);
messages.EnsureIndex(msg => msg.ExtraChatChannel);
return conn;
}
internal void Reconnect() {
@@ -177,6 +183,26 @@ internal class Store : IDisposable {
Database = Connect();
}
internal void ClearDatabase()
{
Messages.DeleteAll();
Database.Rebuild();
}
internal static long DatabaseSize()
{
var dbPath = DatabasePath();
return !File.Exists(dbPath) ? 0 : new FileInfo(dbPath).Length;
}
internal static long DatabaseLogSize()
{
var dbLogPath = Path.Join(Plugin.Interface.ConfigDirectory.FullName, "chat-log.db");
return !File.Exists(dbLogPath) ? 0 : new FileInfo(dbLogPath).Length;
}
internal int MessageCount() => Messages.Count();
private void Logout() {
LastContentId = 0;
}