sharp-chat/SharpChat/Database_Migrations.cs

60 lines
2.7 KiB
C#

using MySqlConnector;
using System;
namespace SharpChat {
public static partial class Database {
private static void DoMigration(string name, Action action) {
bool done = (long)RunQueryValue(
@"SELECT COUNT(*) FROM `sqc_migrations` WHERE `migration_name` = @name",
new MySqlParameter(@"name", name)
) > 0;
if (!done) {
Logger.Write($@"Running migration '{name}'...");
action();
RunCommand(
@"INSERT INTO `sqc_migrations` (`migration_name`) VALUES (@name)",
new MySqlParameter(@"name", name)
);
}
}
private static void RunMigrations() {
RunCommand(
@"CREATE TABLE IF NOT EXISTS `sqc_migrations` ("
+ @"`migration_name` VARCHAR(255) NOT NULL,"
+ @"`migration_completed` TIMESTAMP NOT NULL DEFAULT current_timestamp(),"
+ @"UNIQUE INDEX `migration_name` (`migration_name`),"
+ @"INDEX `migration_completed` (`migration_completed`)"
+ @") COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB;"
);
DoMigration(@"create_events_table", CreateEventsTable);
}
private static void CreateEventsTable() {
RunCommand(
@"CREATE TABLE `sqc_events` ("
+ @"`event_id` BIGINT(20) NOT NULL,"
+ @"`event_sender` BIGINT(20) UNSIGNED NULL DEFAULT NULL,"
+ @"`event_sender_name` VARCHAR(255) NULL DEFAULT NULL,"
+ @"`event_sender_colour` INT(11) NULL DEFAULT NULL,"
+ @"`event_sender_rank` INT(11) NULL DEFAULT NULL,"
+ @"`event_sender_nick` VARCHAR(255) NULL DEFAULT NULL,"
+ @"`event_sender_perms` INT(11) NULL DEFAULT NULL,"
+ @"`event_created` TIMESTAMP NOT NULL DEFAULT current_timestamp(),"
+ @"`event_deleted` TIMESTAMP NULL DEFAULT NULL,"
+ @"`event_type` VARBINARY(255) NOT NULL,"
+ @"`event_target` VARBINARY(255) NOT NULL,"
+ @"`event_flags` TINYINT(3) UNSIGNED NOT NULL,"
+ @"`event_data` BLOB NULL DEFAULT NULL,"
+ @"PRIMARY KEY (`event_id`),"
+ @"INDEX `event_target` (`event_target`),"
+ @"INDEX `event_type` (`event_type`),"
+ @"INDEX `event_sender` (`event_sender`),"
+ @"INDEX `event_datetime` (`event_created`),"
+ @"INDEX `event_deleted` (`event_deleted`)"
+ @") COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB;"
);
}
}
}