Add support for PostgreSQL and SQLite in playtime queries

This commit is contained in:
cialloo 2025-07-14 19:25:04 +08:00
parent 55c7836c67
commit 4271d32b39

View File

@ -582,11 +582,23 @@ public Action Command_Playtime(int client, int args)
} }
char sQuery[512]; char sQuery[512];
FormatEx(sQuery, sizeof(sQuery),
"(SELECT auth, name, playtime, -1 as ownrank FROM %susers WHERE playtime > 0 ORDER BY playtime DESC LIMIT 100) " ... if (gI_Driver == Driver_mysql)
"UNION " ... {
"(SELECT -1, '', u2.playtime, COUNT(*) as ownrank FROM %susers u1 JOIN (SELECT playtime FROM %susers WHERE auth = %d) u2 WHERE u1.playtime >= u2.playtime);", FormatEx(sQuery, sizeof(sQuery),
gS_MySQLPrefix, gS_MySQLPrefix, gS_MySQLPrefix, GetSteamAccountID(client)); "(SELECT auth, name, playtime, -1 as ownrank FROM %susers WHERE playtime > 0 ORDER BY playtime DESC LIMIT 100) " ...
"UNION " ...
"(SELECT -1, '', u2.playtime, COUNT(*) as ownrank FROM %susers u1 JOIN (SELECT playtime FROM %susers WHERE auth = %d) u2 WHERE u1.playtime >= u2.playtime);",
gS_MySQLPrefix, gS_MySQLPrefix, gS_MySQLPrefix, GetSteamAccountID(client));
}
else // PostgreSQL/SQLite
{
FormatEx(sQuery, sizeof(sQuery),
"(SELECT auth, name, playtime, -1 as ownrank FROM %susers WHERE playtime > 0 ORDER BY playtime DESC LIMIT 100) " ...
"UNION " ...
"(SELECT -1, ''::TEXT, u2.playtime, COUNT(*)::INT as ownrank FROM %susers u1 JOIN (SELECT playtime FROM %susers WHERE auth = %d) u2 WHERE u1.playtime >= u2.playtime);",
gS_MySQLPrefix, gS_MySQLPrefix, gS_MySQLPrefix, GetSteamAccountID(client));
}
QueryLog(gH_SQL, SQL_TopPlaytime_Callback, sQuery, GetClientSerial(client), DBPrio_Normal); QueryLog(gH_SQL, SQL_TopPlaytime_Callback, sQuery, GetClientSerial(client), DBPrio_Normal);
return Plugin_Handled; return Plugin_Handled;
@ -943,31 +955,65 @@ Action OpenStatsMenu_Main(int steamid, int style, DataPack data)
{ {
char sQuery[2048]; char sQuery[2048];
FormatEx(sQuery, sizeof(sQuery), if (gI_Driver == Driver_mysql)
"SELECT 0, points, lastlogin, firstlogin, ip, playtime, name FROM %susers WHERE auth = %d\n" ... {
"UNION ALL SELECT 1, SUM(playtime), 0, 0, 0, 0, '' FROM %sstyleplaytime WHERE auth = %d AND style = %d\n" ... FormatEx(sQuery, sizeof(sQuery),
"UNION ALL SELECT 2, COUNT(*), 0, 0, 0, 0, '' FROM %susers u1\n" ... "SELECT 0, points, lastlogin, firstlogin, ip, playtime, name FROM %susers WHERE auth = %d\n" ...
" JOIN (SELECT points FROM %susers WHERE auth = %d) u2 ON 1=1\n" ... "UNION ALL SELECT 1, SUM(playtime), 0, 0, 0, 0, '' FROM %sstyleplaytime WHERE auth = %d AND style = %d\n" ...
" WHERE u1.points >= u2.points", "UNION ALL SELECT 2, COUNT(*), 0, 0, 0, 0, '' FROM %susers u1\n" ...
gS_MySQLPrefix, steamid, " JOIN (SELECT points FROM %susers WHERE auth = %d) u2 ON 1=1\n" ...
gS_MySQLPrefix, steamid, style, " WHERE u1.points >= u2.points",
gS_MySQLPrefix, gS_MySQLPrefix, steamid gS_MySQLPrefix, steamid,
); gS_MySQLPrefix, steamid, style,
gS_MySQLPrefix, gS_MySQLPrefix, steamid
);
}
else // PostgreSQL/SQLite
{
FormatEx(sQuery, sizeof(sQuery),
"SELECT 0, points::FLOAT, lastlogin, firstlogin, ip, playtime::FLOAT, name FROM %susers WHERE auth = %d\n" ...
"UNION ALL SELECT 1, SUM(playtime)::FLOAT, 0, 0, 0, 0.0, '' FROM %sstyleplaytime WHERE auth = %d AND style = %d\n" ...
"UNION ALL SELECT 2, COUNT(*)::FLOAT, 0, 0, 0, 0.0, '' FROM %susers u1\n" ...
" JOIN (SELECT points FROM %susers WHERE auth = %d) u2 ON 1=1\n" ...
" WHERE u1.points >= u2.points",
gS_MySQLPrefix, steamid,
gS_MySQLPrefix, steamid, style,
gS_MySQLPrefix, gS_MySQLPrefix, steamid
);
}
if (!gB_Mapchooser || !gCV_UseMapchooser.BoolValue) if (!gB_Mapchooser || !gCV_UseMapchooser.BoolValue)
{ {
Format(sQuery, sizeof(sQuery), if (gI_Driver == Driver_mysql)
"%s\n" ... {
"UNION ALL SELECT 3, COUNT(*), x.bonus, 0, 0, '' FROM\n"... Format(sQuery, sizeof(sQuery),
" (SELECT map, track>0 as bonus FROM %splayertimes WHERE auth = %d AND style = %d GROUP BY map, track>0) x GROUP BY x.bonus\n"... "%s\n" ...
"UNION ALL SELECT 4, COUNT(*), track>0, 0, 0, '' FROM %swrs WHERE auth = %d AND style = %d GROUP BY track>0\n"... "UNION ALL SELECT 3, COUNT(*), x.bonus, 0, 0, 0, '' FROM\n"...
"UNION ALL SELECT 5, COUNT(*), x.bonus, 0, 0, '' FROM\n"... " (SELECT map, track>0 as bonus FROM %splayertimes WHERE auth = %d AND style = %d GROUP BY map, track>0) x GROUP BY x.bonus\n"...
" (SELECT map, track>0 as bonus FROM %smapzones WHERE type = 0 GROUP BY map, track>0) x GROUP BY x.bonus", "UNION ALL SELECT 4, COUNT(*), track>0, 0, 0, 0, '' FROM %swrs WHERE auth = %d AND style = %d GROUP BY track>0\n"...
sQuery, "UNION ALL SELECT 5, COUNT(*), x.bonus, 0, 0, 0, '' FROM\n"...
gS_MySQLPrefix, steamid, style, " (SELECT map, track>0 as bonus FROM %smapzones WHERE type = 0 GROUP BY map, track>0) x GROUP BY x.bonus",
gS_MySQLPrefix, steamid, style, sQuery,
gS_MySQLPrefix gS_MySQLPrefix, steamid, style,
); gS_MySQLPrefix, steamid, style,
gS_MySQLPrefix
);
}
else // PostgreSQL/SQLite
{
Format(sQuery, sizeof(sQuery),
"%s\n" ...
"UNION ALL SELECT 3, COUNT(*)::FLOAT, CASE WHEN x.bonus THEN 1 ELSE 0 END, 0, 0, 0.0, '' FROM\n"...
" (SELECT map, track>0 as bonus FROM %splayertimes WHERE auth = %d AND style = %d GROUP BY map, track>0) x GROUP BY x.bonus\n"...
"UNION ALL SELECT 4, COUNT(*)::FLOAT, CASE WHEN track>0 THEN 1 ELSE 0 END, 0, 0, 0.0, '' FROM %swrs WHERE auth = %d AND style = %d GROUP BY track>0\n"...
"UNION ALL SELECT 5, COUNT(*)::FLOAT, CASE WHEN x.bonus THEN 1 ELSE 0 END, 0, 0, 0.0, '' FROM\n"...
" (SELECT map, track>0 as bonus FROM %smapzones WHERE type = 0 GROUP BY map, track>0) x GROUP BY x.bonus",
sQuery,
gS_MySQLPrefix, steamid, style,
gS_MySQLPrefix, steamid, style,
gS_MySQLPrefix
);
}
} }
StrCat(sQuery, sizeof(sQuery), ";"); StrCat(sQuery, sizeof(sQuery), ";");