Skip to content

Commit 9e3fd0e

Browse files
authored
perf(sql): optimise queries (#23)
1 parent e6b0465 commit 9e3fd0e

File tree

1 file changed

+49
-66
lines changed

1 file changed

+49
-66
lines changed

addons/sourcemod/scripting/KnockbackRestrict.sp

Lines changed: 49 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ int g_iClientPreviousMenu[MAXPLAYERS + 1] = {0, ...},
2626
g_iDefaultLength;
2727

2828
bool g_bKnifeModeEnabled,
29+
g_bUserVerified[MAXPLAYERS + 1] = { false, ... },
2930
g_bIsClientRestricted[MAXPLAYERS + 1] = { false, ... },
3031
g_bIsClientTypingReason[MAXPLAYERS + 1] = { false, ... },
3132
g_bLate = false,
@@ -102,7 +103,7 @@ public Plugin myinfo = {
102103
name = "KnockbackRestrict",
103104
author = "Dolly, Rushaway",
104105
description = "Adjust knockback of certain weapons for the kbanned players",
105-
version = "3.4.6",
106+
version = "3.4.7",
106107
url = "https://github.com/srcdslab/sm-plugin-KnockbackRestrict"
107108
};
108109

@@ -282,11 +283,8 @@ public void OnMapStart() {
282283
/* MAP NAME */
283284
GetCurrentMap(g_sMapName, sizeof(g_sMapName));
284285

285-
/* GET ALL KBANS */
286-
CreateTimer(1.0, GetAllKbans_Timer);
287-
288286
/* Check all kbans by a timer */
289-
CreateTimer(2.0, CheckAllKbans_Timer, _, TIMER_FLAG_NO_MAPCHANGE | TIMER_REPEAT);
287+
CreateTimer(5.0, CheckAllKbans_Timer, _, TIMER_FLAG_NO_MAPCHANGE | TIMER_REPEAT);
290288
}
291289

292290
public void OnMapEnd() {
@@ -331,12 +329,19 @@ public void OnClientPutInServer(int client) {
331329
}
332330

333331
public void OnClientPostAdminCheck(int client) {
334-
if(IsFakeClient(client) || IsClientSourceTV(client) || g_allKbans == null || g_OfflinePlayers == null || !IsDBConnected()) {
332+
if(g_bUserVerified[client] || g_allKbans == null || g_OfflinePlayers == null || !IsDBConnected()) {
335333
return;
336334
}
337335

336+
// We need to get last only last ban
338337
char queryEx[MAX_QUERIE_LENGTH];
339-
g_hDB.Format(queryEx, sizeof(queryEx), "SELECT * FROM `KbRestrict_CurrentBans` WHERE `client_steamid`='%s' OR `client_ip`='%s'", g_sSteamIDs[client], g_sIPs[client]);
338+
g_hDB.Format(queryEx, sizeof(queryEx),
339+
"SELECT id, client_name, client_steamid, client_ip, admin_name, admin_steamid, reason, map, length, time_stamp_start, time_stamp_end, is_expired, is_removed \
340+
FROM `KbRestrict_CurrentBans` \
341+
WHERE `client_steamid`='%s' OR `client_ip`='%s' \
342+
ORDER BY id DESC LIMIT 1",
343+
g_sSteamIDs[client], g_sIPs[client]
344+
);
340345
g_hDB.Query(OnClientPostAdminCheck_Query, queryEx, GetClientUserId(client));
341346

342347
for(int i = 0; i < g_OfflinePlayers.Length; i++) {
@@ -372,7 +377,7 @@ public void OnClientPostAdminCheck(int client) {
372377
}
373378

374379
void OnClientPostAdminCheck_Query(Database db, DBResultSet results, const char[] error, int userid) {
375-
if(results == null || error[0]) {
380+
if(!IsDBConnected() || results == null || error[0]) {
376381
Kban_GiveError(ERROR_TYPE_SELECT, error);
377382
return;
378383
}
@@ -389,6 +394,7 @@ void OnClientPostAdminCheck_Query(Database db, DBResultSet results, const char[]
389394
bool isExpired = (results.FetchInt(11) == 0) ? false : true;
390395
bool isRemoved = (results.FetchInt(12) == 0) ? false : true;
391396

397+
// Store all data results we need
392398
Kban info;
393399
Kban_GetRowResults(10, results, info);
394400

@@ -422,6 +428,8 @@ void OnClientPostAdminCheck_Query(Database db, DBResultSet results, const char[]
422428

423429
isKbanned = false;
424430
}
431+
432+
g_bUserVerified[client] = true;
425433

426434
if(isKbanned) {
427435
g_bIsClientRestricted[client] = true;
@@ -463,7 +471,7 @@ void OnClientPostAdminCheck_Query(Database db, DBResultSet results, const char[]
463471
}
464472

465473
void OnUpdateClientIP(Database db, DBResultSet results, const char[] error, int userid) {
466-
if(results == null || error[0]) {
474+
if(!IsDBConnected() || results == null || error[0]) {
467475
Kban_GiveError(ERROR_TYPE_UPDATE, error);
468476
return;
469477
}
@@ -472,15 +480,15 @@ void OnUpdateClientIP(Database db, DBResultSet results, const char[] error, int
472480
void Kban_CallGetKbansNumber(int client) {
473481
char query[MAX_QUERIE_LENGTH];
474482
if (!g_cvGetRealKbanNumber.BoolValue) {
475-
g_hDB.Format(query, sizeof(query), "SELECT * FROM `KbRestrict_CurrentBans` WHERE `client_steamid`='%s'", g_sSteamIDs[client]);
483+
g_hDB.Format(query, sizeof(query), "SELECT client_steamid FROM `KbRestrict_CurrentBans` WHERE `client_steamid`='%s'", g_sSteamIDs[client]);
476484
} else {
477-
g_hDB.Format(query, sizeof(query), "SELECT * FROM `KbRestrict_CurrentBans` WHERE `client_steamid`='%s' AND `is_removed`=0", g_sSteamIDs[client]);
485+
g_hDB.Format(query, sizeof(query), "SELECT client_steamid FROM `KbRestrict_CurrentBans` WHERE `client_steamid`='%s' AND `is_removed`=0", g_sSteamIDs[client]);
478486
}
479487
g_hDB.Query(OnGetKbansNumber, query, GetClientUserId(client));
480488
}
481489

482490
void OnGetKbansNumber(Database db, DBResultSet results, const char[] error, int userid) {
483-
if(results == null || error[0]) {
491+
if(!IsDBConnected() || results == null || error[0]) {
484492
Kban_GiveError(ERROR_TYPE_SELECT, error);
485493
return;
486494
}
@@ -535,6 +543,7 @@ public void OnClientConnected(int client) {
535543
}
536544

537545
// Initialize client data
546+
g_bUserVerified[client] = false;
538547
g_bIsClientRestricted[client] = false;
539548
FormatEx(g_sIPs[client], sizeof(g_sIPs[]), sIP);
540549
FormatEx(g_sSteamIDs[client], sizeof(g_sSteamIDs[]), sSteamID);
@@ -543,6 +552,11 @@ public void OnClientConnected(int client) {
543552
if(bError || IsIPBanned(g_sIPs[client])) {
544553
g_bIsClientRestricted[client] = true;
545554
}
555+
556+
// Avoid useless queries
557+
if (IsFakeClient(client) || IsClientSourceTV(client)) {
558+
g_bUserVerified[client] = true;
559+
}
546560
}
547561

548562
public void OnClientDisconnect(int client) {
@@ -562,6 +576,7 @@ public void OnClientDisconnect(int client) {
562576
FormatEx(g_sName[client], sizeof(g_sName[]), "");
563577
FormatEx(g_sIPs[client], sizeof(g_sIPs[]), "");
564578
g_bIsClientRestricted[client] = false;
579+
g_bUserVerified[client] = false;
565580
g_iClientKbansNumber[client] = 0;
566581
}
567582

@@ -645,6 +660,21 @@ Action CheckAllKbans_Timer(Handle timer) {
645660
return Plugin_Handled;
646661
}
647662

663+
// Player was not verified yet, force the verification
664+
for(int i = 1; i <= MaxClients; i++) {
665+
if(!IsClientInGame(i))
666+
continue;
667+
668+
if (g_bUserVerified[i])
669+
continue;
670+
671+
if (IsFakeClient(i) || IsClientSourceTV(i))
672+
continue;
673+
674+
OnClientConnected(i);
675+
OnClientPostAdminCheck(i);
676+
}
677+
648678
for(int i = 0; i < g_allKbans.Length; i++) {
649679
Kban info;
650680
g_allKbans.GetArray(i, info, sizeof(info));
@@ -660,7 +690,7 @@ Action CheckAllKbans_Timer(Handle timer) {
660690
}
661691

662692
void OnKbanExpired(Database db, DBResultSet results, const char[] error, int id) {
663-
if(results == null || error[0]) {
693+
if(!IsDBConnected() || results == null || error[0]) {
664694
Kban_GiveError(ERROR_TYPE_UPDATE, error);
665695
return;
666696
}
@@ -1101,55 +1131,6 @@ stock void CheckPlayerExpireTime(int lefttime, char[] TimeLeft, int maxlength) {
11011131
//----------------------------------------------------------------------------------------------------
11021132
// Database stuffs
11031133
//----------------------------------------------------------------------------------------------------
1104-
Action GetAllKbans_Timer(Handle timer) {
1105-
if(g_hDB == null) {
1106-
CreateTimer(1.0, GetAllKbans_Timer);
1107-
return Plugin_Stop;
1108-
}
1109-
1110-
g_hDB.Query(OnGetAllKbans, "SELECT * FROM `KbRestrict_CurrentBans`");
1111-
return Plugin_Continue;
1112-
}
1113-
1114-
void OnGetAllKbans(Database db, DBResultSet results, const char[] error, any data) {
1115-
if(results == null || error[0]) {
1116-
Kban_GiveError(ERROR_TYPE_SELECT, error);
1117-
return;
1118-
}
1119-
1120-
while(results.FetchRow()) {
1121-
bool push = false;
1122-
1123-
bool isExpired = (results.FetchInt(11) == 0) ? false : true;
1124-
bool isRemoved = (results.FetchInt(12) == 0) ? false : true;
1125-
1126-
if(!isExpired && !isRemoved) {
1127-
push = true;
1128-
}
1129-
1130-
if(push) {
1131-
Kban info;
1132-
for(int i = 0; i <= 10; i++) {
1133-
Kban_GetRowResults(i, results, info);
1134-
}
1135-
1136-
g_allKbans.PushArray(info, sizeof(info));
1137-
}
1138-
}
1139-
1140-
/* incase of a late load */
1141-
if(g_bLate) {
1142-
for(int i = 1; i <= MaxClients; i++) {
1143-
if(!IsClientInGame(i)) {
1144-
continue;
1145-
}
1146-
1147-
OnClientConnected(i);
1148-
OnClientPostAdminCheck(i);
1149-
}
1150-
}
1151-
}
1152-
11531134
void Kban_GetRowResults(int num, DBResultSet results, Kban info) {
11541135
switch(num) {
11551136
case 0: {
@@ -1232,6 +1213,8 @@ bool IsDBConnected()
12321213
{
12331214
if(g_hDB == null)
12341215
{
1216+
if (!g_bConnectingToDB)
1217+
LogError("[Kb-Restrict] Database connection is lost, attempting to reconnect...");
12351218
ConnectToDB();
12361219
return false;
12371220
}
@@ -1412,7 +1395,7 @@ void Kban_PublishKunban(int target, int admin, const char[] reason) {
14121395
}
14131396

14141397
void OnKbanRemove(Database db, DBResultSet results, const char[] error, any data) {
1415-
if(results == null || error[0]) {
1398+
if(!IsDBConnected() || results == null || error[0]) {
14161399
Kban_GiveError(ERROR_TYPE_UPDATE, error);
14171400
return;
14181401
}
@@ -1568,13 +1551,13 @@ void OnKbanPublished(Database db, DBResultSet results, const char[] error, int a
15681551
LogError("Invalid arrayIndex %d. g_allKbans has length %d.", arrayIndex, g_allKbans.Length);
15691552
}
15701553

1571-
if(results == null || error[0]) {
1554+
if(!IsDBConnected() || results == null || error[0]) {
15721555
Kban_GiveError(ERROR_TYPE_INSERT, error);
15731556
}
15741557
}
15751558

15761559
void OnKbanAdded(Database db, DBResultSet results, const char[] error, int arrayIndex) {
1577-
if(results == null || error[0]) {
1560+
if(!IsDBConnected() || results == null || error[0]) {
15781561
Kban_GiveError(ERROR_TYPE_INSERT, error);
15791562
return;
15801563
}
@@ -1621,7 +1604,7 @@ int Kban_CheckKbanAdminAccess(int client, int time) {
16211604
}
16221605

16231606
void OnGetKbanID(Database db, DBResultSet results, const char[] error, int arrayIndex) {
1624-
if(results == null || error[0]) {
1607+
if(!IsDBConnected() || results == null || error[0]) {
16251608
Kban_GiveError(ERROR_TYPE_SELECT, error);
16261609
return;
16271610
}

0 commit comments

Comments
 (0)