Deletable mirrors and indexing for faster searching (#4026)

Makes individual mirrors deletable as per admin request.
Adds indexes for queries in isbanned() to make them roll faster.
This commit is contained in:
Erki
2017-12-31 14:28:00 +01:00
committed by Werner
parent b494341098
commit 97c1343189
5 changed files with 69 additions and 15 deletions
+29 -9
View File
@@ -30,7 +30,7 @@
bad_data &= ~BAD_CID
if (bad_data)
var/DBQuery/mirrored_bans = dbcon.NewQuery("SELECT ckey, ip, computerid FROM ss13_ban_mirrors WHERE ban_id = :ban_id:")
var/DBQuery/mirrored_bans = dbcon.NewQuery("SELECT ckey, ip, computerid FROM ss13_ban_mirrors WHERE isnull(deleted_at) AND ban_id = :ban_id:")
mirrored_bans.Execute(list("ban_id" = ban_id))
while (mirrored_bans.NextRow())
@@ -66,7 +66,7 @@
log_misc("Ban database connection failure while attempting to check mirrors. Key passed for mirror checking: [ckey].")
return null
var/DBQuery/initial_query = dbcon.NewQuery("SELECT DISTINCT ban_id FROM ss13_ban_mirrors WHERE ckey = :ckey: OR ip = :address: OR computerid = :computerid:")
var/DBQuery/initial_query = dbcon.NewQuery("SELECT DISTINCT ban_id FROM ss13_ban_mirrors WHERE isnull(deleted_at) AND (ckey = :ckey: OR ip = :address: OR computerid = :computerid:)")
initial_query.Execute(list("ckey" = ckey, "address" = address, "computerid" = computer_id))
var/list/ban_ids = list()
@@ -78,7 +78,7 @@
if (!ban_ids.len)
return null
var/DBQuery/search_query = dbcon.NewQuery("SELECT id FROM ss13_ban WHERE id IN :vars: AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)")
var/DBQuery/search_query = dbcon.NewQuery("SELECT id FROM ss13_ban WHERE id IN :vars: AND isnull(unbanned) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now()))")
search_query.Execute(list("vars" = ban_ids))
var/list/active_bans = list()
@@ -116,7 +116,7 @@
if (!dbcon.IsConnected())
return null
var/DBQuery/query = dbcon.NewQuery("SELECT id, ckey, ip, computerid, date(datetime) as datetime, source, extra_info FROM ss13_ban_mirrors WHERE ban_id = :ban_id:")
var/DBQuery/query = dbcon.NewQuery("SELECT id, ckey, ip, computerid, date(datetime) as datetime, source, extra_info, deleted_at FROM ss13_ban_mirrors WHERE ban_id = :ban_id:")
query.Execute(list("ban_id" = ban_id))
var/list/mirrors = list()
@@ -137,6 +137,11 @@
items["extra"] = TRUE
catch()
if (query.item[8])
items["inactive"] = TRUE
else
items["inactive"] = FALSE
mirrors += list(items)
return mirrors
@@ -169,18 +174,17 @@
var/static/list/bg_colors = list("#ffeeee", "#ffdddd")
var/i = 0
for (var/mirror in mirrors)
var/bg = bg_colors[i + 1]
var/list/details = mirror
var/bg = details["inactive"] ? "#aaaaaa" : bg_colors[i + 1]
output += "<tr bgcolor='[bg]'>"
output += "<td align='center'>[details["source"]]</td>"
output += "<td align='center'>[details["ckey"]]</td>"
output += "<td align='center'>[details["date"]]</td>"
output += "<td align='center'><a href='?_src_=holder;dbbanmirroract=[details["id"]];mirrorstatus=[details["inactive"]]'>[details["inactive"] ? "Reactivate" : "Deactivate"]</a>"
if (details["extra"])
output += "<td align='center'><a href='?_src_=holder;dbbanmirrorckeys=[details["id"]]'>View Ckeys</a></td>"
else
output += "<td></td>"
output += "</tr>"
output += " | <a href='?_src_=holder;dbbanmirroract=[details["id"]];mirrorckeys=1'>View Ckeys</a>"
output += "</td></tr>"
output += "<tr bgcolor='[bg]'>"
output += "<td align='center' colspan='2'>IP: [details["ip"]]</td>"
@@ -227,6 +231,22 @@
output += "<br><br><a href='?_src_=holder;dbbanmirrors=[query.item[2]];'>Back</a>"
user << browse(output, "window=banmirrors")
/proc/toggle_mirror_status(mob/user, mirror_id, inactive = FALSE)
if (!user || !check_rights(R_MOD|R_ADMIN) || !mirror_id)
return
if (!establish_db_connection(dbcon))
to_chat(user, "<span class='warning'>Database connection failed!</span>")
return
var/DBQuery/query = dbcon.NewQuery("UPDATE ss13_ban_mirrors SET deleted_at = :new_state: WHERE id = :id:")
query.Execute(list("new_state" = inactive ? null : "NOW()", "id" = mirror_id))
if (query.ErrorMsg())
to_chat(user, "<span class='warning'>An error occured while toggling mirror status!</span>")
else
to_chat(user, "<span class='notice'>Mirror set to [inactive ? "ACTIVE" : "INACTIVE"].</span>")
/proc/handle_connection_info(var/client/C, var/data)
if (!C)
return
+2 -2
View File
@@ -133,7 +133,7 @@
else
bantype_sql = "bantype = '[bantype_str]'"
var/sql = "SELECT id FROM ss13_ban WHERE ckey = '[ckey]' AND [bantype_sql] AND (unbanned is null OR unbanned = false)"
var/sql = "SELECT id FROM ss13_ban WHERE isnull(unbanned) AND [bantype_sql] AND ckey = '[ckey]'"
if(job)
sql += " AND job = '[job]'"
@@ -437,7 +437,7 @@
if (!match)
var/DBQuery/mirror_query = dbcon.NewQuery({"SELECT DISTINCT(mirrors.ban_id), bans.ckey FROM ss13_ban_mirrors mirrors
JOIN ss13_ban bans ON mirrors.ban_id = bans.id
WHERE (1 [mirror_player] [mirror_ip] [mirror_cid])
WHERE (isnull(mirrors.deleted_at) AND (1 [mirror_player] [mirror_ip] [mirror_cid]))
AND (
ISNULL(bans.unbanned) AND (
(bans.bantype = 'PERMABAN')
+2 -2
View File
@@ -44,10 +44,10 @@ world/IsBanned(key,address,computer_id)
var/params[] = list()
var/query_content = ""
if (pulled_ban_id)
query_content = "SELECT id, ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM ss13_ban WHERE id = :ban_id: AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)"
query_content = "SELECT id, ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM ss13_ban WHERE id = :ban_id: AND isnull(unbanned) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now()))"
params["ban_id"] = pulled_ban_id
else
query_content = "SELECT id, ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM ss13_ban WHERE (ckey = :ckey: OR computerid = :computerid: OR ip = :address:) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)"
query_content = "SELECT id, ckey, ip, computerid, a_ckey, reason, expiration_time, duration, bantime, bantype FROM ss13_ban WHERE isnull(unbanned) AND (bantype = 'PERMABAN' OR (bantype = 'TEMPBAN' AND expiration_time > Now())) AND (ckey = :ckey: OR computerid = :computerid: OR ip = :address:)"
params["ckey"] = ckey
params["computerid"] = computer_id
params["address"] = address
+7 -2
View File
@@ -97,8 +97,13 @@
display_mirrors_panel(usr, text2num(href_list["dbbanmirrors"]))
return
else if(href_list["dbbanmirrorckeys"])
display_mirrors_ckeys(usr, text2num(href_list["dbbanmirrorckeys"]))
else if(href_list["dbbanmirroract"])
// Mirror act contains the ID of the mirror being acted upon.
var/mirror_id = text2num(href_list["dbbanmirroract"])
if (href_list["mirrorckeys"])
display_mirrors_ckeys(usr, mirror_id)
else if (href_list["mirrorstatus"])
toggle_mirror_status(usr, mirror_id, text2num(href_list["mirrorstatus"]))
return
else if(href_list["editrights"])