sharp-chat/SharpChat.SQLite/SQLiteMigrations.cs

49 lines
2.3 KiB
C#

using Microsoft.Extensions.Logging;
using ZLogger;
namespace SharpChat.SQLite;
public class SQLiteMigrations(ILogger logger, SQLiteConnection conn) {
public async Task RunMigrations() {
long currentVersion = await conn.RunQueryValue<long>("PRAGMA user_version");
long version = currentVersion;
async Task doMigration(int expect, Func<Task> action) {
if(version < expect) {
logger.ZLogInformation($"Upgrading to version {version}...");
await action();
++version;
}
};
await doMigration(1, CreateMessagesTable);
if(currentVersion != version)
await conn.RunCommand($"PRAGMA user_version = {version}");
}
private async Task CreateMessagesTable() {
await conn.RunCommand(
@"CREATE TABLE ""messages"" ("
+ @"""msg_id"" INTEGER NOT NULL,"
+ @"""msg_type"" TEXT NOT NULL COLLATE NOCASE,"
+ @"""msg_created"" TEXT NOT NULL COLLATE NOCASE,"
+ @"""msg_deleted"" TEXT DEFAULT NULL COLLATE NOCASE,"
+ @"""msg_channel"" TEXT DEFAULT NULL COLLATE NOCASE,"
+ @"""msg_sender"" TEXT DEFAULT NULL COLLATE BINARY,"
+ @"""msg_sender_name"" TEXT DEFAULT NULL COLLATE NOCASE,"
+ @"""msg_sender_colour"" INTEGER DEFAULT NULL,"
+ @"""msg_sender_rank"" INTEGER DEFAULT NULL,"
+ @"""msg_sender_nick"" TEXT DEFAULT NULL COLLATE NOCASE,"
+ @"""msg_sender_perms"" INTEGER DEFAULT NULL,"
+ @"""msg_data"" BLOB DEFAULT NULL CHECK(JSON_VALID(""msg_data"") AND JSON_TYPE(""msg_data"") = ""object"") COLLATE BINARY,"
+ @"PRIMARY KEY(""msg_id"")"
+ @");"
);
await conn.RunCommand(@"CREATE INDEX ""messages_channel_index"" ON ""messages"" (""msg_channel"");");
await conn.RunCommand(@"CREATE INDEX ""messages_created_index"" ON ""messages"" (""msg_created"");");
await conn.RunCommand(@"CREATE INDEX ""messages_deleted_index"" ON ""messages"" (""msg_deleted"");");
await conn.RunCommand(@"CREATE INDEX ""messages_event_type"" ON ""messages"" (""msg_type"");");
await conn.RunCommand(@"CREATE INDEX ""messages_sender_index"" ON ""messages"" (""msg_sender"");");
}
}