From 5f717553d92910f03b1b164111081cb5f33081f1 Mon Sep 17 00:00:00 2001 From: jedso <26863777+jedso@users.noreply.github.com> Date: Sat, 1 Oct 2022 21:39:04 +0930 Subject: [PATCH] Add SQLite statements to re-create mapzones with INTEGER PRIMARY KEY --- .../sql-create-tables-and-migrations.sp | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/addons/sourcemod/scripting/include/shavit/sql-create-tables-and-migrations.sp b/addons/sourcemod/scripting/include/shavit/sql-create-tables-and-migrations.sp index 643e6291..4ecc8443 100644 --- a/addons/sourcemod/scripting/include/shavit/sql-create-tables-and-migrations.sp +++ b/addons/sourcemod/scripting/include/shavit/sql-create-tables-and-migrations.sp @@ -575,6 +575,42 @@ public void SQL_FixSQLiteMapzonesROWID_Callback(Database db, DBResultSet results LogError("Timer error! SQLiteMapzonesROWID migration failed. Reason: %s", error); return; } + else if (!results.FetchInt(0)) // No NULL ids + { + InsertMigration(Migration_FixSQLiteMapzonesROWID); + return; + } + + Transaction trans = new Transaction(); + char sQuery[512]; + + FormatEx(sQuery, sizeof(sQuery), "CREATE TEMPORARY TABLE temp_mapzones AS SELECT * FROM `%smapzones`;", gS_SQLPrefix); + AddQueryLog(trans, sQuery); + + FormatEx(sQuery, sizeof(sQuery), "DROP TABLE `%smapzones`;", gS_SQLPrefix); + AddQueryLog(trans, sQuery); + + // Re-use mapzones table creation query + AddQueryLog(trans, SQLiteMapzonesQuery); + + // Can't do SELECT * FROM temp_mapzones because DBs created < v3.3.0 have an extra `prebuilt` column + FormatEx(sQuery, sizeof(sQuery), "INSERT INTO `%smapzones` SELECT `id`, `map`, `type`, `corner1_x`, `corner1_y`, `corner1_z`, `corner2_x`, `corner2_y`, `corner2_z`, `destination_x`, `destination_y`, `destination_z`, `track`, `flags`, `data`, `form`, `target` FROM temp_mapzones;", gS_SQLPrefix); + AddQueryLog(trans, sQuery); + + FormatEx(sQuery, sizeof(sQuery), "DROP TABLE `temp_mapzones`;"); + AddQueryLog(trans, sQuery); + + gH_SQL.Execute(trans, Trans_FixSQLiteMapzonesROWID_Success, Trans_FixSQLiteMapzonesROWID_Error, 0, DBPrio_High); +} + +public void Trans_FixSQLiteMapzonesROWID_Success(Database db, any data, int numQueries, DBResultSet[] results, any[] queryData) +{ + InsertMigration(Migration_FixSQLiteMapzonesROWID); +} + +public void Trans_FixSQLiteMapzonesROWID_Error(Database db, any data, int numQueries, const char[] error, int failIndex, any[] queryData) +{ + LogError("Timer error! SQLiteMapzonesROWID migration transaction failed. Reason: %s", error); } public void SQL_TableMigrationSingleQuery_Callback(Database db, DBResultSet results, const char[] error, any data)