public static async Task <bool> UpgradeAsync(CancellationToken cancellationToken) { await using (var db = new BotDb()) if (!await UpgradeAsync(db, Config.Cts.Token)) { return(false); } await using (var db = new ThumbnailDb()) { if (!await UpgradeAsync(db, Config.Cts.Token)) { return(false); } if (!await ImportNamesPool(db, Config.Cts.Token)) { return(false); } } return(true); }
private static async Task ImportAsync(BotDb dbContext, CancellationToken cancellationToken) { var db = dbContext.Database; using (var tx = await db.BeginTransactionAsync(cancellationToken)) { try { // __EFMigrationsHistory table will be already created by the failed migration attempt await db.ExecuteSqlCommandAsync($"INSERT INTO `__EFMigrationsHistory`(`MigrationId`,`ProductVersion`) VALUES ({new InitialCreate().GetId()},'manual')", cancellationToken); await db.ExecuteSqlCommandAsync($"INSERT INTO `__EFMigrationsHistory`(`MigrationId`,`ProductVersion`) VALUES ({new Explanations().GetId()},'manual')", cancellationToken); // create constraints on moderator await db.ExecuteSqlCommandAsync(@"CREATE TABLE `temp_new_moderator` ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `discord_id` INTEGER NOT NULL, `sudoer` INTEGER NOT NULL )", cancellationToken); await db.ExecuteSqlCommandAsync("INSERT INTO temp_new_moderator SELECT `id`,`discord_id`,`sudoer` FROM `moderator`", cancellationToken); await db.ExecuteSqlCommandAsync("DROP TABLE `moderator`", cancellationToken); await db.ExecuteSqlCommandAsync("ALTER TABLE `temp_new_moderator` RENAME TO `moderator`", cancellationToken); await db.ExecuteSqlCommandAsync("CREATE UNIQUE INDEX `moderator_discord_id` ON `moderator` (`discord_id`)", cancellationToken); // create constraints on piracystring await db.ExecuteSqlCommandAsync(@"CREATE TABLE `temp_new_piracystring` ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `string` varchar ( 255 ) NOT NULL )", cancellationToken); await db.ExecuteSqlCommandAsync("INSERT INTO temp_new_piracystring SELECT `id`,`string` FROM `piracystring`", cancellationToken); await db.ExecuteSqlCommandAsync("DROP TABLE `piracystring`", cancellationToken); await db.ExecuteSqlCommandAsync("ALTER TABLE `temp_new_piracystring` RENAME TO `piracystring`", cancellationToken); await db.ExecuteSqlCommandAsync("CREATE UNIQUE INDEX `piracystring_string` ON `piracystring` (`string`)", cancellationToken); // create constraints on warning await db.ExecuteSqlCommandAsync(@"CREATE TABLE `temp_new_warning` ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `discord_id` INTEGER NOT NULL, `reason` TEXT NOT NULL, `full_reason` TEXT NOT NULL, `issuer_id` INTEGER NOT NULL DEFAULT 0 )", cancellationToken); await db.ExecuteSqlCommandAsync("INSERT INTO temp_new_warning SELECT `id`,`discord_id`,`reason`,`full_reason`,`issuer_id` FROM `warning`", cancellationToken); await db.ExecuteSqlCommandAsync("DROP TABLE `warning`", cancellationToken); await db.ExecuteSqlCommandAsync("ALTER TABLE `temp_new_warning` RENAME TO `warning`", cancellationToken); await db.ExecuteSqlCommandAsync("CREATE INDEX `warning_discord_id` ON `warning` (`discord_id`)", cancellationToken); // create constraints on explanation await db.ExecuteSqlCommandAsync(@"CREATE TABLE `temp_new_explanation` ( `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `keyword` TEXT NOT NULL, `text` TEXT NOT NULL )", cancellationToken); await db.ExecuteSqlCommandAsync("INSERT INTO temp_new_explanation SELECT `id`,`keyword`,`text` FROM `explanation`", cancellationToken); await db.ExecuteSqlCommandAsync("DROP TABLE `explanation`", cancellationToken); await db.ExecuteSqlCommandAsync("ALTER TABLE `temp_new_explanation` RENAME TO `explanation`", cancellationToken); await db.ExecuteSqlCommandAsync("CREATE UNIQUE INDEX `explanation_keyword` ON `explanation` (`keyword`)", cancellationToken); tx.Commit(); } catch (Exception e) { //tx.Rollback(); tx.Commit(); throw e; } } }