From 5f385bb1c155578f67c10e575644182c03492353 Mon Sep 17 00:00:00 2001 From: NotCompsky Date: Thu, 23 Jul 2020 20:35:18 +0100 Subject: [PATCH] Attempt #1 to get multiple parameter packs in one function. I knew this would fail, given past experience, but I wanted to demonstrate what the goal is of the (almost certainly far more complex) code that will replace this. --- wangle-server/src/server.cpp | 58 ++++++++---------------------------- 1 file changed, 13 insertions(+), 45 deletions(-) diff --git a/wangle-server/src/server.cpp b/wangle-server/src/server.cpp index 7e5b0f53..43504962 100644 --- a/wangle-server/src/server.cpp +++ b/wangle-server/src/server.cpp @@ -664,49 +664,15 @@ class RTaggerHandler : public wangle::HandlerAdapterasciify(','); // List of all parent directories - this->mysql_query_after_itr( - "SELECT d.id, d.name " - "FROM dir d " - "JOIN dir2parent_tree dt ON dt.parent=d.id " - "WHERE dt.id=", id, " " - "AND d.id NOT IN" USER_DISALLOWED_DIRS(user_id) - "ORDER BY depth DESC" - ); - this->init_json_rows( - this->itr, - _r::flag::arr, - _r::flag::quote_no_escape, // id_str - _r::flag::quote_and_escape // name - ); + this->dirs_given_ids(this->itr, user_id, 0, "SELECT parent FROM dir2parent_tree WHERE id=", id, nullptr, "JOIN dir2parent_tree d2pt ON d2pt.id=d.id AND d2pt.parent=", id, nullptr, "d2pt.depth DESC"); this->asciify(','); // List of all IMMEDIATE child directories - this->mysql_query_after_itr( - "SELECT d.id, d.name " - "FROM dir d " - "WHERE d.parent=", id, " " - "AND d.id NOT IN" USER_DISALLOWED_DIRS(user_id) - "ORDER BY name ASC" - ); - this->init_json_rows( - this->itr, - _r::flag::arr, - _r::flag::quote_no_escape, // id_str - _r::flag::quote_and_escape // name - ); + this->dirs_given_ids(this->itr, user_id, 0, "SELECT id FROM dir WHERE parent=", id, nullptr, nullptr, "d.name"); this->asciify(','); - this->mysql_query_after_itr( - "SELECT tag " - "FROM dir2tag " - "WHERE dir=", id - // No tags are blacklisted, otherwise the directory would have been rejected above - ); - this->init_json_rows( - this->itr, - _r::flag::arr, - _r::flag::quote_no_escape // tag id - ); + this->tags_given_ids(this->itr, 0, "SELECT tag FROM dir2tag WHERE dir=", id); + // No tags are blacklisted, otherwise the directory would have been rejected above this->asciify(']'); *this->itr = 0; @@ -1653,8 +1619,8 @@ class RTaggerHandler : public wangle::HandlerAdapterasciify_tags_arr_or_dict(itr, _r::flag::arr); } - template - void dirs_given_ids(char*& itr, const UserIDIntType user_id, const unsigned page_n, Args... ids_args){ + template + void dirs_given_ids(char*& itr, const UserIDIntType user_id, const unsigned page_n, IDsArgs... ids_args, std::nullptr_t, JoinArgs... join_args, std::nullptr_t, OrderArgs... order_args){ this->mysql_query2_after_itr( TAGS_INFOS("SELECT DISTINCT tag FROM dir2tag WHERE dir IN(", ids_args..., ")") ); @@ -1667,11 +1633,13 @@ class RTaggerHandler : public wangle::HandlerAdapter std::string_view X_given_ids(const char tbl_alias, const UserIDIntType user_id, const unsigned page_n, Args... ids_args){ - this->reset_buf_index(); + char* const itr_init = this->itr; switch(tbl_alias){ case 'f': this->files_given_ids(this->itr, user_id, 0, ids_args...); @@ -1707,7 +1675,7 @@ class RTaggerHandler : public wangle::HandlerAdaptereras_w_file_infos_given_ids(this->itr, user_id, 0, ids_args...); break; case 'd': - this->dirs_given_ids (this->itr, user_id, 0, ids_args...); + this->dirs_given_ids (this->itr, user_id, 0, ids_args..., nullptr, nullptr, "FIELD(d.id,", ids_args..., ")"); break; case 't': this->tags_given_ids (this->itr, user_id, 0, ids_args...); @@ -1715,8 +1683,8 @@ class RTaggerHandler : public wangle::HandlerAdapterget_buf_as_string_view(); + *this->itr = 0; + return std::string_view(itr_init, (uintptr_t)this->itr - (uintptr_t)itr_init); } std::string_view get__X_given_ids(const char tbl_alias, const char* s){