From 098b7d4977438faf42539d85efbbe867da19aa77 Mon Sep 17 00:00:00 2001 From: jedso <26863777+jedso@users.noreply.github.com> Date: Mon, 26 Sep 2022 22:56:12 +0930 Subject: [PATCH] Add SQLite statements to re-create playertimes with FK constraint --- .../sql-create-tables-and-migrations.sp | 34 +++++++++++++++++++ 1 file changed, 34 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 dbf7a7fd..b5aae5e6 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 @@ -629,6 +629,40 @@ public void SQL_TableMigrationPlayertimesAuthFK_Callback(Database db, DBResultSe FormatEx(sQuery, sizeof(sQuery), "ALTER TABLE `%splayertimes` ADD CONSTRAINT `%spt_auth` FOREIGN KEY (`auth`) REFERENCES `%susers` (`auth`) ON UPDATE RESTRICT ON DELETE RESTRICT;", gS_SQLPrefix, gS_SQLPrefix, gS_SQLPrefix); AddQueryLog(trans, sQuery); } + else + { + results.FetchRow(); + + char sPlayertimesMasterSQL[1024]; + results.FetchString(0, sPlayertimesMasterSQL, sizeof(sPlayertimesMasterSQL)); + + char sConstraintTest[64]; + FormatEx(sConstraintTest, sizeof(sConstraintTest), "CONSTRAINT `%spt_auth`", gS_SQLPrefix); + + if (StrContains(sPlayertimesMasterSQL, sConstraintTest) == -1 // >= v3.1.0 + || StrContains(sPlayertimesMasterSQL, "(`auth`) ON UPDATE CASCADE ON DELETE CASCADE") != -1) // <= v3.0.8 + { + FormatEx(sQuery, sizeof(sQuery), "CREATE TEMPORARY TABLE temp_pt AS SELECT * FROM `%splayertimes`;", gS_SQLPrefix); + AddQueryLog(trans, sQuery); + + FormatEx(sQuery, sizeof(sQuery), "DROP TABLE `%splayertimes`;", gS_SQLPrefix); + AddQueryLog(trans, sQuery); + + // Re-use playertimes table creation query + AddQueryLog(trans, SQLitePTQuery); + + FormatEx(sQuery, sizeof(sQuery), "INSERT INTO `%splayertimes` (id, style, track, time, auth, map, points, jumps, date, strafes, sync, perfs, completions) SELECT id, style, track, time, auth, map, points, jumps, date, strafes, sync, perfs, completions FROM temp_pt;", gS_SQLPrefix); + AddQueryLog(trans, sQuery); + + FormatEx(sQuery, sizeof(sQuery), "DROP TABLE `temp_pt`;"); + AddQueryLog(trans, sQuery); + } + else // db was created > v3.3.2 + { + InsertMigration(Migration_AddPlayertimesAuthFK); + return; + } + } gH_SQL.Execute(trans, Trans_AddPlayertimesAuthFK_Success, Trans_AddPlayertimesAuthFK_Error, 0, DBPrio_High); }