aboutsummaryrefslogtreecommitdiff
path: root/src/nodetree_tree_sql.erl
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-10-24 14:59:47 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-10-24 14:59:47 +0300
commitc604bdb897974d743f08577d76d5800c76ee2d90 (patch)
tree795f2b4f8ca1722f5b005aa86e53951401e8161f /src/nodetree_tree_sql.erl
parentFix 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.erl50
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];
_ ->