diff options
author | Evgeny Khramtsov <ekhramtsov@process-one.net> | 2019-10-24 14:59:47 +0300 |
---|---|---|
committer | Evgeny Khramtsov <ekhramtsov@process-one.net> | 2019-10-24 14:59:47 +0300 |
commit | c604bdb897974d743f08577d76d5800c76ee2d90 (patch) | |
tree | 795f2b4f8ca1722f5b005aa86e53951401e8161f /src/nodetree_tree_sql.erl | |
parent | Fix logger initialization on OTP<21.3 (diff) |
Limit result set of disco#items for mod_pubsub
The size of a list of nodes returned for disco#items request
is now controlled by option 'max_nodes_discoitems'. The default
value is 100. The name and the default value of the option is
chosen to be consistent with mod_muc's 'max_rooms_discoitems' option.
Diffstat (limited to 'src/nodetree_tree_sql.erl')
-rw-r--r-- | src/nodetree_tree_sql.erl | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/src/nodetree_tree_sql.erl b/src/nodetree_tree_sql.erl index efef656c5..bb9a27a61 100644 --- a/src/nodetree_tree_sql.erl +++ b/src/nodetree_tree_sql.erl @@ -140,16 +140,25 @@ get_node(Nidx) -> {error, xmpp:err_item_not_found(?T("Node not found"), ejabberd_option:language())} end. -get_nodes(Host, _From) -> - get_nodes(Host). - get_nodes(Host) -> + get_nodes(Host, infinity). + +get_nodes(Host, Limit) -> H = node_flat_sql:encode_host(Host), - case catch - ejabberd_sql:sql_query_t( - ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d from pubsub_node " - "where host=%(H)s")) - of + Query = fun(mssql, _) when is_integer(Limit), Limit>=0 -> + ejabberd_sql:sql_query_t( + ?SQL("select top %(Limit)d @(node)s, @(parent)s, @(plugin)s, @(nodeid)d " + "from pubsub_node where host=%(H)s")); + (_, _) when is_integer(Limit), Limit>=0 -> + ejabberd_sql:sql_query_t( + ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d " + "from pubsub_node where host=%(H)s limit %(Limit)d")); + (_, _) -> + ejabberd_sql:sql_query_t( + ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d " + "from pubsub_node where host=%(H)s")) + end, + case ejabberd_sql:sql_query_t(Query) of {selected, RItems} -> [raw_to_node(Host, Item) || Item <- RItems]; _ -> @@ -178,16 +187,23 @@ get_parentnodes_tree(Host, Node, Level, Acc) -> Acc end. -get_subnodes(Host, Node, _From) -> - get_subnodes(Host, Node). - -get_subnodes(Host, Node) -> +get_subnodes(Host, Node, Limit) -> H = node_flat_sql:encode_host(Host), - case catch - ejabberd_sql:sql_query_t( - ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d from pubsub_node " - "where host=%(H)s and parent=%(Node)s")) - of + Query = fun(mssql, _) when is_integer(Limit), Limit>=0 -> + ejabberd_sql:sql_query_t( + ?SQL("select top %(Limit)d @(node)s, @(parent)s, @(plugin)s, @(nodeid)d " + "from pubsub_node where host=%(H)s and parent=%(Node)s")); + (_, _) when is_integer(Limit), Limit>=0 -> + ejabberd_sql:sql_query_t( + ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d " + "from pubsub_node where host=%(H)s and parent=%(Node)s " + "limit %(Limit)d")); + (_, _) -> + ejabberd_sql:sql_query_t( + ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d " + "from pubsub_node where host=%(H)s and parent=%(Node)s")) + end, + case ejabberd_sql:sql_query_t(Query) of {selected, RItems} -> [raw_to_node(Host, Item) || Item <- RItems]; _ -> |