From 00666422afb9cc11d99b0849aedba68e0c418b00 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 15:47:46 -0700 Subject: [PATCH 01/14] fix --- .../admin/view_variables/debug_variables.dm | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm index 5116cd5cd6..ab9f4a534c 100644 --- a/code/modules/admin/view_variables/debug_variables.dm +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -16,11 +16,19 @@ header = "
  • " var/item + var/name_part = VV_HTML_ENCODE(name) + if(level > 0 || islist(D)) //handling keys in assoc lists + if(istype(name,/datum)) + name_part = "[VV_HTML_ENCODE(name)] [REF(name)]" + else if(islist(name)) + var/list/L = name + name_part = " /list ([length(L)]) [REF(name)]" + if (isnull(value)) - item = "[VV_HTML_ENCODE(name)] = null" + item = "[name_part] = null" else if (istext(value)) - item = "[VV_HTML_ENCODE(name)] = \"[VV_HTML_ENCODE(value)]\"" + item = "[name_part] = \"[VV_HTML_ENCODE(value)]\"" else if (isicon(value)) #ifdef VARSICON @@ -28,33 +36,31 @@ var/rnd = rand(1,10000) var/rname = "tmp[REF(I)][rnd].png" usr << browse_rsc(I, rname) - item = "[VV_HTML_ENCODE(name)] = ([value]) " + item = "[name_part] = ([value]) " #else - item = "[VV_HTML_ENCODE(name)] = /icon ([value])" + item = "[name_part] = /icon ([value])" #endif else if (isfile(value)) - item = "[VV_HTML_ENCODE(name)] = '[value]'" + item = "[name_part] = '[value]'" - else if(istype(value, /matrix)) // Needs to be before datum + else if(istype(value,/matrix)) // Needs to be before datum var/matrix/M = value - item = {"[VV_HTML_ENCODE(name)] = - - - - -
      - - - -
    [M.a][M.d]0
    [M.b][M.e]0
    [M.c][M.f]1
     
    "} //TODO link to modify_transform wrapper for all matrices - + item = {"[name_part] = +
      + + + + + + +
    [M.a][M.d]0
    [M.b][M.e]0
    [M.c][M.f]1
     
    "} //TODO link to modify_transform wrapper for all matrices else if (istype(value, /datum)) var/datum/DV = value if ("[DV]" != "[DV.type]") //if the thing as a name var, lets use it. - item = "[VV_HTML_ENCODE(name)] [REF(value)] = [DV] [DV.type]" + item = "[name_part] = [DV] [DV.type] [REF(value)]" else - item = "[VV_HTML_ENCODE(name)] [REF(value)] = [DV.type]" + item = "[name_part] = [DV.type] [REF(value)]" else if (islist(value)) var/list/L = value @@ -72,19 +78,19 @@ items += debug_variable(key, val, level + 1, sanitize = sanitize) - item = "[VV_HTML_ENCODE(name)] = /list ([L.len])" + item = "[name_part] = /list ([L.len])" else - item = "[VV_HTML_ENCODE(name)] = /list ([L.len])" + item = "[name_part] = /list ([L.len])" else if (name in GLOB.bitfields) var/list/flags = list() for (var/i in GLOB.bitfields[name]) if (value & GLOB.bitfields[name][i]) flags += i - item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(jointext(flags, ", "))]" + item = "[name_part] = [VV_HTML_ENCODE(jointext(flags, ", "))]" else - item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(value)]" + item = "[name_part] = [VV_HTML_ENCODE(value)]" return "[header][item]
  • " -#undef VV_HTML_ENCODE +#undef VV_HTML_ENCODE \ No newline at end of file From 146542b0771521fb78fd15389d30b119bdaec0af Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 16:33:36 -0700 Subject: [PATCH 02/14] sdql2 --- code/__DEFINES/is_helpers.dm | 3 + code/modules/admin/verbs/SDQL2/SDQL_2.dm | 108 +++++++++++++---------- 2 files changed, 64 insertions(+), 47 deletions(-) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 28ec3383ae..1bd18776af 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -1,3 +1,6 @@ +/// Checks if something is a BYOND object datatype rather than a primitive, or whatever's closest to one. +#define is_object_datatype(object) (!istext(object) && !isnum(object)) + // simple is_type and similar inline helpers #define in_range(source, user) (get_dist(source, user) <= 1 && (get_step(source, 0)?:z) == (get_step(user, 0)?:z)) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index df54df5c7d..e0eb878b68 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -346,7 +346,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null //print the key if(islist(key)) recursive_list_print(output, key, datum_handler, atom_handler) - else if(is_proper_datum(key) && (datum_handler || (isatom(key) && atom_handler))) + else if(is_object_datatype(key) && (datum_handler || (isatom(key) && atom_handler))) if(isatom(key) && atom_handler) output += atom_handler.Invoke(key) else @@ -360,7 +360,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null var/value = input[key] if(islist(value)) recursive_list_print(output, value, datum_handler, atom_handler) - else if(is_proper_datum(value) && (datum_handler || (isatom(value) && atom_handler))) + else if(is_object_datatype(value) && (datum_handler || (isatom(value) && atom_handler))) if(isatom(value) && atom_handler) output += atom_handler.Invoke(value) else @@ -486,7 +486,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null end_time = REALTIMEOFDAY state = SDQL2_STATE_IDLE finished = TRUE - . = TRUE + text_list += TRUE if(show_next_to_key) var/client/C = GLOB.directory[show_next_to_key] if(C) @@ -511,9 +511,9 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null state = SDQL2_STATE_HALTING return if("call") - . = query_tree["on"] + text_list += query_tree["on"] if("select", "delete", "update") - . = query_tree[query_tree[1]] + text_list += query_tree[query_tree[1]] state = SDQL2_STATE_SWITCHING /datum/SDQL2_query/proc/Search(list/tree) @@ -554,7 +554,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null obj_count_eligible = objs.len else obj_count_eligible = obj_count_all - . = objs + text_list += objs state = SDQL2_STATE_SWITCHING /datum/SDQL2_query/proc/SDQL_from_objs(list/tree) @@ -646,7 +646,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null switch(query_tree[1]) if("call") for(var/i in found) - if(!is_proper_datum(i)) + if(!is_object_datatype(i)) continue world.SDQL_var(i, query_tree["call"][1], null, i, superuser, src) obj_count_finished++ @@ -664,7 +664,10 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null var/list/text_list = list() var/print_nulls = !(options & SDQL2_OPTION_SELECT_OUTPUT_SKIP_NULLS) obj_count_finished = select_refs + var/n = 0 for(var/i in found) + if(++n == 20000) + text_list += "
    TRUNCATED - 20000 OBJECT LIMIT HIT" SDQL_print(i, text_list, print_nulls) select_refs[REF(i)] = TRUE SDQL2_TICK_CHECK @@ -675,7 +678,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null if("set" in query_tree) var/list/set_list = query_tree["set"] for(var/d in found) - if(!is_proper_datum(d)) + if(!is_object_datatype(d)) continue SDQL_internal_vv(d, set_list) obj_count_finished++ @@ -685,47 +688,61 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null obj_count_finished = length(obj_count_finished) state = SDQL2_STATE_SWITCHING -/datum/SDQL2_query/proc/SDQL_print(object, list/text_list, print_nulls = TRUE) - if(is_proper_datum(object)) - text_list += "[REF(object)] : [object]" - if(istype(object, /atom)) - var/atom/A = object - var/turf/T = A.loc - var/area/a - if(istype(T)) - text_list += " at [T] [ADMIN_COORDJMP(T)]" - a = T.loc - else - var/turf/final = get_turf(T) //Recursive, hopefully? - if(istype(final)) - text_list += " at [final] [ADMIN_COORDJMP(final)]" - a = final.loc +/** + * Recursively prints out an object to text list for SDQL2 output to admins, with VV links and all. + * Recursion limit: 50 + * Limit imposed by callers should be around 10000 objects + * Seriously, if you hit those limits, you're doing something wrong. + */ +/datum/SDQL2_query/proc/SDQL_print(object, list/text_list, print_nulls = TRUE, recursion = 0, linebreak = TRUE) + if(recursion > 50) + text_list += "RECURSION LIMIT REACHED." + if(is_object_datatype(object)) + if(!islist(object)) + text_list += "[REF(object)]([object.type]): [object]" + if(istype(object, /atom)) + var/atom/A = object + var/atom/container = A.loc + if(isturf(container)) + text_list += " in [container] [ADMIN_COORDJMP(container)] at [container.loc]" + else if(container) + var/turf/T = get_turf(container) + var/cref = REF(container) + text_list += " in [container]([cref])" + if(T) + text_list += " on [T] [ADMIN_COORDJMP(T)] at[T.loc]" else - text_list += " at nonexistant location" - if(a) - text_list += " in area [a]" - if(T.loc != a) - text_list += " inside [T]" - text_list += "
    " - else if(islist(object)) - var/list/L = object - var/first = TRUE - text_list += "\[" - for (var/x in L) - if (!first) - text_list += ", " - first = FALSE - SDQL_print(x, text_list) - if (!isnull(x) && !isnum(x) && L[x] != null) - text_list += " -> " - SDQL_print(L[L[x]], text_list) - text_list += "]
    " + text_list += " in nullspace" + if(linebreak) + text_list += "
    " + return + else // lists are snowflake and get special treatment. + for(var/t in 1 to recursion) + text_list += "\t" + text_list += "[REF(object)] \[" + var/first = TRUE + var/list/L = object + for(var/key in object) + if(!first) + text_list += ", " + first = FALSE + SDQL_print(key, text_list, TRUE, recursion + 1, FALSE) + if(IS_VALID_ASSOC_KEY(key) && !isnull(L[key])) + text_list += " --> " + SDQL_print(L[key], text_list, TRUE, recursion + 1, FALSE) + text_list += "\]" else if(isnull(object)) if(print_nulls) text_list += "NULL
    " + else if(istext(object)) + text_list += "STRING: [object]
    " + else if(isnum(object)) + text_list += "NUM: [object]
    " else - text_list += "[object]
    " + text_list += "UNKNOWN: [object]
    " + if(linebreak) + text_list += "
    " /datum/SDQL2_query/CanProcCall() if(!allow_admin_interact) @@ -957,7 +974,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null var/static/list/exclude = list("usr", "src", "marked", "global") var/long = start < expression.len var/datum/D - if(is_proper_datum(object)) + if(is_object_datatype(object)) D = object if (object == world && (!long || expression[start + 1] == ".") && !(expression[start] in exclude)) //3 == length("SS") + 1 @@ -1161,9 +1178,6 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null query_list += word return query_list -/proc/is_proper_datum(thing) - return istype(thing, /datum) || istype(thing, /client) - /obj/effect/statclick/SDQL2_delete/Click() var/datum/SDQL2_query/Q = target Q.delete_click() From c7eead3f28f1e4d2f9a78063f35b8576a1f19cb0 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 16:34:54 -0700 Subject: [PATCH 03/14] don't blind find/replace folks --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index e0eb878b68..b4f7832b44 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -486,7 +486,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null end_time = REALTIMEOFDAY state = SDQL2_STATE_IDLE finished = TRUE - text_list += TRUE + . += TRUE if(show_next_to_key) var/client/C = GLOB.directory[show_next_to_key] if(C) @@ -511,9 +511,9 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null state = SDQL2_STATE_HALTING return if("call") - text_list += query_tree["on"] + . += query_tree["on"] if("select", "delete", "update") - text_list += query_tree[query_tree[1]] + . += query_tree[query_tree[1]] state = SDQL2_STATE_SWITCHING /datum/SDQL2_query/proc/Search(list/tree) @@ -554,7 +554,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null obj_count_eligible = objs.len else obj_count_eligible = obj_count_all - text_list += objs + . += objs state = SDQL2_STATE_SWITCHING /datum/SDQL2_query/proc/SDQL_from_objs(list/tree) @@ -694,7 +694,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null * Limit imposed by callers should be around 10000 objects * Seriously, if you hit those limits, you're doing something wrong. */ -/datum/SDQL2_query/proc/SDQL_print(object, list/text_list, print_nulls = TRUE, recursion = 0, linebreak = TRUE) +/datum/SDQL2_query/proc/SDQL_print(datum/object, list/text_list, print_nulls = TRUE, recursion = 0, linebreak = TRUE) if(recursion > 50) text_list += "RECURSION LIMIT REACHED." if(is_object_datatype(object)) From 6cf18e1d49839882ed80ba43b49beee213370682 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 16:38:28 -0700 Subject: [PATCH 04/14] why did i find replace --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index b4f7832b44..657da46461 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -486,7 +486,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null end_time = REALTIMEOFDAY state = SDQL2_STATE_IDLE finished = TRUE - . += TRUE + . = TRUE if(show_next_to_key) var/client/C = GLOB.directory[show_next_to_key] if(C) @@ -511,9 +511,9 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null state = SDQL2_STATE_HALTING return if("call") - . += query_tree["on"] + . = query_tree["on"] if("select", "delete", "update") - . += query_tree[query_tree[1]] + . = query_tree[query_tree[1]] state = SDQL2_STATE_SWITCHING /datum/SDQL2_query/proc/Search(list/tree) @@ -554,7 +554,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null obj_count_eligible = objs.len else obj_count_eligible = obj_count_all - . += objs + . = objs state = SDQL2_STATE_SWITCHING /datum/SDQL2_query/proc/SDQL_from_objs(list/tree) From 3cf14f4fad54a65d525ef04181c5abdbfb014b2e Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 16:48:22 -0700 Subject: [PATCH 05/14] prettier --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 26 ++++++++++++++---------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 657da46461..7e4c973e6f 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -701,18 +701,22 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null if(!islist(object)) text_list += "[REF(object)]([object.type]): [object]" if(istype(object, /atom)) - var/atom/A = object - var/atom/container = A.loc - if(isturf(container)) - text_list += " in [container] [ADMIN_COORDJMP(container)] at [container.loc]" - else if(container) - var/turf/T = get_turf(container) - var/cref = REF(container) - text_list += " in [container]([cref])" - if(T) - text_list += " on [T] [ADMIN_COORDJMP(T)] at[T.loc]" + if(istype(object, /turf)) + var/turf/T = object + text_list += " at [T.loc]" else - text_list += " in nullspace" + var/atom/A = object + var/atom/container = A.loc + if(isturf(container)) + text_list += " in [container] [ADMIN_COORDJMP(container)] at [container.loc]" + else if(container) + var/turf/T = get_turf(container) + var/cref = REF(container) + text_list += " in [container]([cref])" + if(T) + text_list += " on [T] [ADMIN_COORDJMP(T)] at[T.loc]" + else + text_list += " in nullspace" if(linebreak) text_list += "
    " return From 52ab6e557bd7de152e7e7b303e85c71ca24ea19e Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 17:00:01 -0700 Subject: [PATCH 06/14] fix --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 7e4c973e6f..e59c74ef22 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -699,11 +699,11 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null text_list += "RECURSION LIMIT REACHED." if(is_object_datatype(object)) if(!islist(object)) - text_list += "[REF(object)]([object.type]): [object]" + text_list += "[object.type] [REF(object)]: [object]" if(istype(object, /atom)) if(istype(object, /turf)) var/turf/T = object - text_list += " at [T.loc]" + text_list += " [ADMIN_COORDJMP(T)] at [T.loc]" else var/atom/A = object var/atom/container = A.loc @@ -723,7 +723,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null else // lists are snowflake and get special treatment. for(var/t in 1 to recursion) text_list += "\t" - text_list += "[REF(object)] \[" + text_list += "/list [REF(object)] \[
    " var/first = TRUE var/list/L = object for(var/key in object) @@ -734,17 +734,18 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null if(IS_VALID_ASSOC_KEY(key) && !isnull(L[key])) text_list += " --> " SDQL_print(L[key], text_list, TRUE, recursion + 1, FALSE) - text_list += "\]" + text_list += "
    + text_list += "\]
    " else if(isnull(object)) if(print_nulls) - text_list += "NULL
    " + text_list += "NULL" else if(istext(object)) - text_list += "STRING: [object]
    " + text_list += "STRING: [object]" else if(isnum(object)) - text_list += "NUM: [object]
    " + text_list += "NUM: [object]" else - text_list += "UNKNOWN: [object]
    " + text_list += "UNKNOWN: [object]" if(linebreak) text_list += "
    " From c42894ddd96ddffc6c2cd22213620b0e0eee4390 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 17:07:10 -0700 Subject: [PATCH 07/14] css? --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index e59c74ef22..1a7cd66f3b 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -695,6 +695,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null * Seriously, if you hit those limits, you're doing something wrong. */ /datum/SDQL2_query/proc/SDQL_print(datum/object, list/text_list, print_nulls = TRUE, recursion = 0, linebreak = TRUE) + text_list += " if(recursion > 50) text_list += "RECURSION LIMIT REACHED." if(is_object_datatype(object)) @@ -717,13 +718,8 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null text_list += " on [T] [ADMIN_COORDJMP(T)] at[T.loc]" else text_list += " in nullspace" - if(linebreak) - text_list += "
    " - return else // lists are snowflake and get special treatment. - for(var/t in 1 to recursion) - text_list += "\t" - text_list += "/list [REF(object)] \[
    " + text_list += "/list [REF(object)] \[" var/first = TRUE var/list/L = object for(var/key in object) @@ -734,8 +730,8 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null if(IS_VALID_ASSOC_KEY(key) && !isnull(L[key])) text_list += " --> " SDQL_print(L[key], text_list, TRUE, recursion + 1, FALSE) - text_list += "
    - text_list += "\]
    " + text_list += "
    " + text_list += "\]" else if(isnull(object)) if(print_nulls) @@ -746,8 +742,9 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null text_list += "NUM: [object]" else text_list += "UNKNOWN: [object]" - if(linebreak) - text_list += "
    " + text_list += "
    + if(linebreak) + text_list += "
    " /datum/SDQL2_query/CanProcCall() if(!allow_admin_interact) From be6ea51f1936eeb6dbae1617b7e86ed4bdd7de28 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 17:11:29 -0700 Subject: [PATCH 08/14] closing --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 1a7cd66f3b..2eb0d64e12 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -695,7 +695,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null * Seriously, if you hit those limits, you're doing something wrong. */ /datum/SDQL2_query/proc/SDQL_print(datum/object, list/text_list, print_nulls = TRUE, recursion = 0, linebreak = TRUE) - text_list += " + text_list += "" if(recursion > 50) text_list += "RECURSION LIMIT REACHED." if(is_object_datatype(object)) @@ -742,7 +742,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null text_list += "NUM: [object]" else text_list += "UNKNOWN: [object]" - text_list += " + text_list += "" if(linebreak) text_list += "
    " From 8e6dee515a790a7001b6bf1557bf846b99f39061 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 17:16:36 -0700 Subject: [PATCH 09/14] null isn't an object --- code/__DEFINES/is_helpers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 1bd18776af..ced05633b4 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -1,5 +1,5 @@ /// Checks if something is a BYOND object datatype rather than a primitive, or whatever's closest to one. -#define is_object_datatype(object) (!istext(object) && !isnum(object)) +#define is_object_datatype(object) (object && !istext(object) && !isnum(object)) // simple is_type and similar inline helpers From 78e153cbe4889817844c7c107dd62bef4d0404f7 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 17:32:17 -0700 Subject: [PATCH 10/14] is this better --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 2eb0d64e12..6e29bc853f 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -498,7 +498,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null if(length(select_text)) var/text = islist(select_text)? select_text.Join() : select_text var/static/result_offset = 0 - showmob << browse(text, "window=SDQL-result-[result_offset++]") + showmob << browse(text, "window=SDQL-result-[result_offset++];size=300x800") show_next_to_key = null if(qdel_on_finish) qdel(src) @@ -695,7 +695,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null * Seriously, if you hit those limits, you're doing something wrong. */ /datum/SDQL2_query/proc/SDQL_print(datum/object, list/text_list, print_nulls = TRUE, recursion = 0, linebreak = TRUE) - text_list += "" + text_list += "" if(recursion > 50) text_list += "RECURSION LIMIT REACHED." if(is_object_datatype(object)) @@ -720,17 +720,17 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null text_list += " in nullspace" else // lists are snowflake and get special treatment. text_list += "/list [REF(object)] \[" - var/first = TRUE var/list/L = object - for(var/key in object) - if(!first) - text_list += ", " - first = FALSE - SDQL_print(key, text_list, TRUE, recursion + 1, FALSE) - if(IS_VALID_ASSOC_KEY(key) && !isnull(L[key])) - text_list += " --> " - SDQL_print(L[key], text_list, TRUE, recursion + 1, FALSE) - text_list += "
    " + if(length(L)) + var/lastkey = L[length(L)] + for(var/key in object) + SDQL_print(key, text_list, TRUE, recursion + 1, FALSE) + if(IS_VALID_ASSOC_KEY(key) && !isnull(L[key])) + text_list += " --> " + SDQL_print(L[key], text_list, TRUE, recursion + 1, FALSE) + text_list += "
    " + if(lastkey != key) + text_list += ", " text_list += "\]" else if(isnull(object)) From e1a1dc61f669d5a99389e5c16bdfdff827172bd8 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 17:50:23 -0700 Subject: [PATCH 11/14] this is ugly and i hate it --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 6e29bc853f..6977735d54 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -498,7 +498,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null if(length(select_text)) var/text = islist(select_text)? select_text.Join() : select_text var/static/result_offset = 0 - showmob << browse(text, "window=SDQL-result-[result_offset++];size=300x800") + showmob << browse(text, "window=SDQL-result-[result_offset++];size=800x1200") show_next_to_key = null if(qdel_on_finish) qdel(src) @@ -695,7 +695,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null * Seriously, if you hit those limits, you're doing something wrong. */ /datum/SDQL2_query/proc/SDQL_print(datum/object, list/text_list, print_nulls = TRUE, recursion = 0, linebreak = TRUE) - text_list += "" + text_list += "" if(recursion > 50) text_list += "RECURSION LIMIT REACHED." if(is_object_datatype(object)) @@ -729,8 +729,6 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null text_list += " --> " SDQL_print(L[key], text_list, TRUE, recursion + 1, FALSE) text_list += "
    " - if(lastkey != key) - text_list += ", " text_list += "\]" else if(isnull(object)) From e2aab5c1a53bebfd2c882acc539fc2b74c6122a6 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 18:01:53 -0700 Subject: [PATCH 12/14] css is really hard folks --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 6977735d54..4bb0c7d76d 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -694,8 +694,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null * Limit imposed by callers should be around 10000 objects * Seriously, if you hit those limits, you're doing something wrong. */ -/datum/SDQL2_query/proc/SDQL_print(datum/object, list/text_list, print_nulls = TRUE, recursion = 0, linebreak = TRUE) - text_list += "" +/datum/SDQL2_query/proc/SDQL_print(datum/object, list/text_list, print_nulls = TRUE, recursion = 1, linebreak = TRUE) if(recursion > 50) text_list += "RECURSION LIMIT REACHED." if(is_object_datatype(object)) @@ -719,15 +718,25 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null else text_list += " in nullspace" else // lists are snowflake and get special treatment. - text_list += "/list [REF(object)] \[" + text_list += "/list [REF(object)] \[
    " var/list/L = object if(length(L)) - var/lastkey = L[length(L)] for(var/key in object) - SDQL_print(key, text_list, TRUE, recursion + 1, FALSE) + if(islist(key)) + text_list += "" + SDQL_print(key, text_list, TRUE, recursion + 1, FALSE) + text_list += "" + else + SDQL_print(key, text_list, TRUE, recursion, FALSE) if(IS_VALID_ASSOC_KEY(key) && !isnull(L[key])) + var/value = L[key] text_list += " --> " - SDQL_print(L[key], text_list, TRUE, recursion + 1, FALSE) + if(islist(value)) + text_list += "" + SDQL_print(value, text_list, TRUE, recursion + 1, FALSE) + text_list += "" + else + SDQL_print(value, text_list, TRUE, recursion, FALSE) text_list += "
    " text_list += "\]" else @@ -740,7 +749,6 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null text_list += "NUM: [object]" else text_list += "UNKNOWN: [object]" - text_list += "
    " if(linebreak) text_list += "
    " From 9a086233080f382e5e454ffbcb90d57ce063d32a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 18:39:45 -0700 Subject: [PATCH 13/14] sigh --- code/__DEFINES/is_helpers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index ced05633b4..c55662e86f 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -1,5 +1,5 @@ /// Checks if something is a BYOND object datatype rather than a primitive, or whatever's closest to one. -#define is_object_datatype(object) (object && !istext(object) && !isnum(object)) +#define is_object_datatype(object) (object && !ispath(object) && !istext(object) && !isnum(object)) // simple is_type and similar inline helpers From 3dbfc6ddf23f201d7d5caae265278659053fa3b0 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 12 Jun 2020 18:50:57 -0700 Subject: [PATCH 14/14] better support --- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 4bb0c7d76d..bff431a6c7 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -696,7 +696,8 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null */ /datum/SDQL2_query/proc/SDQL_print(datum/object, list/text_list, print_nulls = TRUE, recursion = 1, linebreak = TRUE) if(recursion > 50) - text_list += "RECURSION LIMIT REACHED." + text_list += "
    RECURSION LIMIT REACHED.
    " + return if(is_object_datatype(object)) if(!islist(object)) text_list += "[object.type] [REF(object)]: [object]" @@ -739,18 +740,20 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null SDQL_print(value, text_list, TRUE, recursion, FALSE) text_list += "
    " text_list += "\]" + if(linebreak) + text_list += "
    " else if(isnull(object)) if(print_nulls) text_list += "NULL" else if(istext(object)) - text_list += "STRING: [object]" - else if(isnum(object)) - text_list += "NUM: [object]" + text_list += "\"[object]\"" + else if(isnum(object) || ispath(object)) + text_list += "[object]" else text_list += "UNKNOWN: [object]" - if(linebreak) - text_list += "
    " + if(linebreak) + text_list += "
    " /datum/SDQL2_query/CanProcCall() if(!allow_admin_interact)