From 2fe48855c8932a9dec280a3287bbc5e056ea1874 Mon Sep 17 00:00:00 2001 From: Jordie <4343468+Jordie0608@users.noreply.github.com> Date: Tue, 7 Apr 2020 06:11:16 +1000 Subject: [PATCH] Basic pagination for library visitor console (#50427) Fixes #45284 Some simple pagination for the library visitor console to stop it from hanging the server by trying to retrieve too much data. The UI hasn't been made any better, I just wanted to stop us needing #49065 to be testmerged indefinitely. I went into this thinking I'd improve the UI and code but that was before I had read any of it and lost my motivation. Bonus points for this code having allowed unsanitized arbitrary queries for at least 10 years. --- code/modules/library/lib_machines.dm | 50 +++++++++++++++++++--------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index c658c906fd8..c216acc6ba1 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -25,11 +25,11 @@ var/title var/category = "Any" var/author - var/SQLquery + var/search_page = 0 /obj/machinery/computer/libraryconsole/ui_interact(mob/user) . = ..() - var/dat = "" // + var/list/dat = list() // switch(screenstate) if(0) dat += "

Search Settings


" @@ -42,13 +42,38 @@ dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance.
" else if(QDELETED(user)) return - else if(!SQLquery) - dat += "ERROR: Malformed search request. Please contact your system administrator for assistance.
" else dat += "" dat += "" - - var/datum/DBQuery/query_library_list_books = SSdbcore.NewQuery(SQLquery) + author = sanitizeSQL(author) + title = sanitizeSQL(title) + category = sanitizeSQL(category) + var/SQLsearch = "isnull(deleted) AND " + if(category == "Any") + SQLsearch += "author LIKE '%[author]%' AND title LIKE '%[title]%'" + else + SQLsearch += "author LIKE '%[author]%' AND title LIKE '%[title]%' AND category='[category]'" + var/bookcount = 0 + var/booksperpage = 20 + var/datum/DBQuery/query_library_count_books = SSdbcore.NewQuery("SELECT COUNT(id) FROM [format_table_name("library")] WHERE [SQLsearch]") + if(!query_library_count_books.warn_execute()) + qdel(query_library_count_books) + return + if(query_library_count_books.NextRow()) + bookcount = text2num(query_library_count_books.item[1]) + qdel(query_library_count_books) + if(bookcount > booksperpage) + dat += "Page: " + var/pagecount = 1 + var/list/pagelist = list() + while(bookcount > 0) + pagelist += "[pagecount == search_page + 1 ? "\[[pagecount]\]" : "\[[pagecount]\]"]" + bookcount -= booksperpage + pagecount++ + dat += pagelist.Join(" | ") + search_page = text2num(sanitizeSQL(search_page)) + var/limit = " LIMIT [booksperpage * search_page], [booksperpage]" + var/datum/DBQuery/query_library_list_books = SSdbcore.NewQuery("SELECT author, title, category, id FROM [format_table_name("library")] WHERE [SQLsearch][limit]") if(!query_library_list_books.Execute()) dat += "ERROR: Unable to retrieve book listings. Please contact your system administrator for assistance.
" else @@ -64,7 +89,7 @@ dat += "
AUTHORTITLECATEGORYSS13BN

" dat += "\[Go Back\]
" var/datum/browser/popup = new(user, "publiclibrary", name, 600, 400) - popup.set_content(dat) + popup.set_content(jointext(dat, "")) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() @@ -81,29 +106,24 @@ title = sanitize(newtitle) else title = null - title = sanitizeSQL(title) if(href_list["setcategory"]) var/newcategory = input("Choose a category to search for:") in list("Any", "Fiction", "Non-Fiction", "Adult", "Reference", "Religion") if(newcategory) category = sanitize(newcategory) else category = "Any" - category = sanitizeSQL(category) if(href_list["setauthor"]) var/newauthor = input("Enter an author to search for:") as text|null if(newauthor) author = sanitize(newauthor) else author = null - author = sanitizeSQL(author) if(href_list["search"]) - SQLquery = "SELECT author, title, category, id FROM [format_table_name("library")] WHERE isnull(deleted) AND " - if(category == "Any") - SQLquery += "author LIKE '%[author]%' AND title LIKE '%[title]%'" - else - SQLquery += "author LIKE '%[author]%' AND title LIKE '%[title]%' AND category='[category]'" screenstate = 1 + if(href_list["bookpagecount"]) + search_page = text2num(href_list["bookpagecount"]) + if(href_list["back"]) screenstate = 0