added alter table statements for adding and removing indexes when maps are loaded. THis way i avoid mysql's limit of 64 indexes per table. the toptimes and own times can now be displayed very quickly ingame. ONly exception is if dev/ze2/ze play the same map because mapStart and MapEnd add and remove the indexes. So if dev/ze/ or ze2/ze play the same map then the first server leaving the map will delete the index again
This commit is contained in:
parent
26315fe33e
commit
a5c7067026
@ -65,6 +65,12 @@ public void OnPluginStart()
|
||||
HookEntityOutput("trigger_multiple", "OnStartTouch", Trigger_Multiple);
|
||||
HookEntityOutput("trigger_teleport", "OnTrigger", trigger_teleport);
|
||||
HookEntityOutput("trigger_teleport", "OnStartTouch", trigger_teleport);
|
||||
//DB
|
||||
if (!g_dDatabase)
|
||||
{
|
||||
Database.Connect(SQL_OnDatabaseConnect, "racetimercss");
|
||||
}
|
||||
|
||||
//HUD
|
||||
hText = CreateHudSynchronizer();
|
||||
//Just constantly reruns the alter table query to handle new zones, less lazy solution would just be adding a forward for when zones were renamed
|
||||
@ -184,6 +190,7 @@ public void SQL_OnConnectFinished(Database db, DBResultSet results, const char[]
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
if (IsValidClient(i))
|
||||
OnClientPostAdminCheck(i);
|
||||
AddBinarySearchIndex();
|
||||
}
|
||||
|
||||
public void MYSQLCheckMapEntry()
|
||||
@ -228,12 +235,79 @@ public void SQL_FinishedQuery(Database db, DBResultSet results, const char[] err
|
||||
delete data;
|
||||
}
|
||||
|
||||
//a mysql table can max have 64 keys attached to it without recompiling. Therefore dropping and attaching binary tree index on the given map start, map end,
|
||||
//PluginStart Database connection and PluginEnd.
|
||||
//Adding and removing indexes should be pretty cheap so creating/removing them for only the specific map should be ok
|
||||
//also check that racezones actually exist before making a binary tree index
|
||||
//also handles if the column ends with just mapname or with mapnameS1, mapnameS2 etc etc
|
||||
//its only relevant for sourcemod scripting part, the java backend making rest endpoints uses a cache and does select * statements so it does not need indexing
|
||||
public void AddBinarySearchIndex()
|
||||
{
|
||||
int race_zone_count = GetTotalRaceZones();
|
||||
int l_iZoneCount = unloze_zoneCount();
|
||||
char sQuery[g_dLength];
|
||||
GetCurrentMap(g_cMapname, sizeof(g_cMapname));
|
||||
//if admins dont make dumb random zones without any meaning it works fine
|
||||
if (race_zone_count == 1 && l_iZoneCount == 1)
|
||||
{
|
||||
Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table_new` add INDEX if not exists `%s` (`%s`)", g_cMapname, g_cMapname);
|
||||
DataPack hDataPack = new DataPack();
|
||||
hDataPack.WriteString(sQuery);
|
||||
g_dDatabase.Query(SQL_FinishedQuery, sQuery, hDataPack, DBPrio_High);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 1; i <= race_zone_count; i++)
|
||||
{
|
||||
Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table_new` add INDEX if not exists `%sS%i` (`%sS%i`)", g_cMapname, i, g_cMapname, i);
|
||||
DataPack hDataPack = new DataPack();
|
||||
hDataPack.WriteString(sQuery);
|
||||
g_dDatabase.Query(SQL_FinishedQuery, sQuery, hDataPack, DBPrio_High);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//if ze1 and ze2 both play the same map and one leaves the map then the other will not have index anymore, but otherwise its fine.
|
||||
public void RemoveBinarySearchIndex()
|
||||
{
|
||||
char sQuery[g_dLength];
|
||||
int race_zone_count = GetTotalRaceZones();
|
||||
int l_iZoneCount = unloze_zoneCount();
|
||||
GetCurrentMap(g_cMapname, sizeof(g_cMapname));
|
||||
if (race_zone_count == 1 && l_iZoneCount == 1)
|
||||
{
|
||||
Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table_new` drop INDEX if exists `%s`", g_cMapname);
|
||||
DataPack hDataPack = new DataPack();
|
||||
hDataPack.WriteString(sQuery);
|
||||
g_dDatabase.Query(SQL_FinishedQuery, sQuery, hDataPack, DBPrio_High);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 1; i <= race_zone_count; i++)
|
||||
{
|
||||
Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table_new` drop INDEX if exists `%sS%i`", g_cMapname, i);
|
||||
DataPack hDataPack = new DataPack();
|
||||
hDataPack.WriteString(sQuery);
|
||||
g_dDatabase.Query(SQL_FinishedQuery, sQuery, hDataPack, DBPrio_High);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OnMapEnd()
|
||||
{
|
||||
if (!g_dDatabase)
|
||||
Database.Connect(SQL_OnDatabaseConnect, "racetimercss");
|
||||
else
|
||||
RemoveBinarySearchIndex();
|
||||
}
|
||||
|
||||
public void OnMapStart()
|
||||
{
|
||||
if (!g_dDatabase)
|
||||
Database.Connect(SQL_OnDatabaseConnect, "racetimercss");
|
||||
else
|
||||
{
|
||||
AddBinarySearchIndex();
|
||||
static Handle hHostName;
|
||||
if((hHostName = FindConVar("hostname")) == INVALID_HANDLE)
|
||||
return;
|
||||
@ -258,6 +332,7 @@ public void OnPluginEnd()
|
||||
CloseHandle(hText);
|
||||
if (g_hAlterTableTimer != null)
|
||||
delete g_hAlterTableTimer;
|
||||
RemoveBinarySearchIndex();
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
|
Loading…
Reference in New Issue
Block a user