1
0
mirror of https://github.com/chylex/Discord-History-Tracker.git synced 2025-09-17 16:24:47 +02:00

1 Commits

Author SHA1 Message Date
ae64747ce4 Add foreign keys to tables linked to messages 2025-02-02 14:16:14 +01:00
3 changed files with 127 additions and 53 deletions

View File

@@ -0,0 +1,67 @@
using System.Threading.Tasks;
using DHT.Server.Database.Sqlite.Utils;
namespace DHT.Server.Database.Sqlite.Schema;
sealed class SqliteSchemaUpgradeTo10 : ISchemaUpgrade {
async Task ISchemaUpgrade.Run(ISqliteConnection conn, ISchemaUpgradeCallbacks.IProgressReporter reporter) {
await reporter.MainWork("Migrating message embeds...", 0, 5);
await conn.ExecuteAsync("""
CREATE TABLE message_embeds_new (
message_id INTEGER NOT NULL,
json TEXT NOT NULL,
FOREIGN KEY (message_id) REFERENCES messages (message_id) ON UPDATE CASCADE ON DELETE CASCADE
)
""");
await conn.ExecuteAsync("INSERT INTO message_embeds_new (message_id, json) SELECT message_id, json FROM message_embeds WHERE message_id IN (SELECT DISTINCT message_id FROM messages)");
await reporter.MainWork("Migrating message reactions...", 1, 5);
await conn.ExecuteAsync("""
CREATE TABLE message_reactions_new (
message_id INTEGER NOT NULL,
emoji_id INTEGER,
emoji_name TEXT,
emoji_flags INTEGER NOT NULL,
count INTEGER NOT NULL,
FOREIGN KEY (message_id) REFERENCES messages (message_id) ON UPDATE CASCADE ON DELETE CASCADE
)
""");
await conn.ExecuteAsync("INSERT INTO message_reactions_new (message_id, emoji_id, emoji_name, emoji_flags, count) SELECT message_id, emoji_id, emoji_name, emoji_flags, count FROM message_reactions WHERE message_id IN (SELECT DISTINCT message_id FROM messages)");
await reporter.MainWork("Migrating message edit timestamps...", 2, 5);
await conn.ExecuteAsync("""
CREATE TABLE message_edit_timestamps_new (
message_id INTEGER PRIMARY KEY NOT NULL,
edit_timestamp INTEGER NOT NULL,
FOREIGN KEY (message_id) REFERENCES messages (message_id) ON UPDATE CASCADE ON DELETE CASCADE
)
""");
await conn.ExecuteAsync("INSERT INTO message_edit_timestamps_new (message_id, edit_timestamp) SELECT message_id, edit_timestamp FROM message_edit_timestamps WHERE message_id IN (SELECT DISTINCT message_id FROM messages)");
await reporter.MainWork("Migrating message replies...", 3, 5);
await conn.ExecuteAsync("""
CREATE TABLE message_replied_to_new (
message_id INTEGER PRIMARY KEY NOT NULL,
replied_to_id INTEGER NOT NULL,
FOREIGN KEY (message_id) REFERENCES messages (message_id) ON UPDATE CASCADE ON DELETE CASCADE
)
""");
await conn.ExecuteAsync("INSERT INTO message_replied_to_new (message_id, replied_to_id) SELECT message_id, replied_to_id FROM message_replied_to WHERE message_id IN (SELECT DISTINCT message_id FROM messages)");
await reporter.MainWork("Applying schema changes...", 4, 5);
await conn.ExecuteAsync("DROP TABLE message_embeds");
await conn.ExecuteAsync("ALTER TABLE message_embeds_new RENAME TO message_embeds");
await conn.ExecuteAsync("CREATE INDEX embeds_message_ix ON message_embeds(message_id)");
await conn.ExecuteAsync("DROP TABLE message_reactions");
await conn.ExecuteAsync("ALTER TABLE message_reactions_new RENAME TO message_reactions");
await conn.ExecuteAsync("CREATE INDEX reactions_message_ix ON message_reactions(message_id)");
await conn.ExecuteAsync("DROP TABLE message_edit_timestamps");
await conn.ExecuteAsync("ALTER TABLE message_edit_timestamps_new RENAME TO message_edit_timestamps");
await conn.ExecuteAsync("DROP TABLE message_replied_to");
await conn.ExecuteAsync("ALTER TABLE message_replied_to_new RENAME TO message_replied_to");
}
}

View File

@@ -7,11 +7,19 @@ sealed class SqliteSchemaUpgradeTo3 : ISchemaUpgrade {
async Task ISchemaUpgrade.Run(ISqliteConnection conn, ISchemaUpgradeCallbacks.IProgressReporter reporter) { async Task ISchemaUpgrade.Run(ISqliteConnection conn, ISchemaUpgradeCallbacks.IProgressReporter reporter) {
await reporter.MainWork("Applying schema changes...", 0, 1); await reporter.MainWork("Applying schema changes...", 0, 1);
await SqliteSchema.CreateMessageEditTimestampTable(conn); await conn.ExecuteAsync("""
await conn.ExecuteAsync("ALTER TABLE message_edit_timestamps RENAME TO edit_timestamps"); CREATE TABLE edit_timestamps (
message_id INTEGER PRIMARY KEY NOT NULL,
edit_timestamp INTEGER NOT NULL
)
""");
await SqliteSchema.CreateMessageRepliedToTable(conn); await conn.ExecuteAsync("""
await conn.ExecuteAsync("ALTER TABLE message_replied_to RENAME TO replied_to"); CREATE TABLE replied_to (
message_id INTEGER PRIMARY KEY NOT NULL,
replied_to_id INTEGER NOT NULL
)
""");
await conn.ExecuteAsync(""" await conn.ExecuteAsync("""
INSERT INTO edit_timestamps (message_id, edit_timestamp) INSERT INTO edit_timestamps (message_id, edit_timestamp)

View File

@@ -8,7 +8,7 @@ using DHT.Utils.Logging;
namespace DHT.Server.Database.Sqlite; namespace DHT.Server.Database.Sqlite;
sealed class SqliteSchema { sealed class SqliteSchema {
internal const int Version = 9; internal const int Version = 10;
private static readonly Log Log = Log.ForType<SqliteSchema>(); private static readonly Log Log = Log.ForType<SqliteSchema>();
@@ -100,7 +100,8 @@ sealed class SqliteSchema {
await conn.ExecuteAsync(""" await conn.ExecuteAsync("""
CREATE TABLE message_embeds ( CREATE TABLE message_embeds (
message_id INTEGER NOT NULL, message_id INTEGER NOT NULL,
json TEXT NOT NULL json TEXT NOT NULL,
FOREIGN KEY (message_id) REFERENCES messages (message_id) ON UPDATE CASCADE ON DELETE CASCADE
) )
"""); """);
@@ -110,12 +111,27 @@ sealed class SqliteSchema {
emoji_id INTEGER, emoji_id INTEGER,
emoji_name TEXT, emoji_name TEXT,
emoji_flags INTEGER NOT NULL, emoji_flags INTEGER NOT NULL,
count INTEGER NOT NULL count INTEGER NOT NULL,
FOREIGN KEY (message_id) REFERENCES messages (message_id) ON UPDATE CASCADE ON DELETE CASCADE
)
""");
await conn.ExecuteAsync("""
CREATE TABLE message_edit_timestamps (
message_id INTEGER PRIMARY KEY NOT NULL,
edit_timestamp INTEGER NOT NULL,
FOREIGN KEY (message_id) REFERENCES messages (message_id) ON UPDATE CASCADE ON DELETE CASCADE
)
""");
await conn.ExecuteAsync("""
CREATE TABLE message_replied_to (
message_id INTEGER PRIMARY KEY NOT NULL,
replied_to_id INTEGER NOT NULL,
FOREIGN KEY (message_id) REFERENCES messages (message_id) ON UPDATE CASCADE ON DELETE CASCADE
) )
"""); """);
await CreateMessageEditTimestampTable(conn);
await CreateMessageRepliedToTable(conn);
await CreateDownloadTables(conn); await CreateDownloadTables(conn);
await CreateMessageAttachmentsTable(conn); await CreateMessageAttachmentsTable(conn);
@@ -125,24 +141,6 @@ sealed class SqliteSchema {
await conn.ExecuteAsync("INSERT INTO metadata (key, value) VALUES ('version', " + Version + ")"); await conn.ExecuteAsync("INSERT INTO metadata (key, value) VALUES ('version', " + Version + ")");
} }
internal static async Task CreateMessageEditTimestampTable(ISqliteConnection conn) {
await conn.ExecuteAsync("""
CREATE TABLE message_edit_timestamps (
message_id INTEGER PRIMARY KEY NOT NULL,
edit_timestamp INTEGER NOT NULL
)
""");
}
internal static async Task CreateMessageRepliedToTable(ISqliteConnection conn) {
await conn.ExecuteAsync("""
CREATE TABLE message_replied_to (
message_id INTEGER PRIMARY KEY NOT NULL,
replied_to_id INTEGER NOT NULL
)
""");
}
internal static async Task CreateDownloadTables(ISqliteConnection conn) { internal static async Task CreateDownloadTables(ISqliteConnection conn) {
await conn.ExecuteAsync(""" await conn.ExecuteAsync("""
CREATE TABLE download_metadata ( CREATE TABLE download_metadata (
@@ -185,6 +183,7 @@ sealed class SqliteSchema {
{ 6, new SqliteSchemaUpgradeTo7() }, { 6, new SqliteSchemaUpgradeTo7() },
{ 7, new SqliteSchemaUpgradeTo8() }, { 7, new SqliteSchemaUpgradeTo8() },
{ 8, new SqliteSchemaUpgradeTo9() }, { 8, new SqliteSchemaUpgradeTo9() },
{ 9, new SqliteSchemaUpgradeTo10() },
}; };
var perf = Log.Start("from version " + dbVersion); var perf = Log.Start("from version " + dbVersion);