From 44700d91ba270a251b512c0b7ad8e4c4d8962ad2 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Thu, 16 Nov 2017 11:38:04 +0100 Subject: [PATCH] PubSub: Cleanup tree requests, rename pubsub_node.type->pubsub_node.plugin --- sql/lite.sql | 2 +- sql/mssql.sql | 2 +- sql/mysql.sql | 2 +- sql/pg.new.sql | 2 +- sql/pg.sql | 2 +- src/node_flat_sql.erl | 10 +++--- src/node_pep_sql.erl | 8 ++--- src/nodetree_tree_sql.erl | 76 ++++++++++++++++++--------------------- 8 files changed, 49 insertions(+), 55 deletions(-) diff --git a/sql/lite.sql b/sql/lite.sql index b0c8675f5..e9d2ac6f2 100644 --- a/sql/lite.sql +++ b/sql/lite.sql @@ -203,7 +203,7 @@ CREATE TABLE pubsub_node ( host text NOT NULL, node text NOT NULL, parent text NOT NULL DEFAULT '', - type text NOT NULL, + plugin text NOT NULL, nodeid INTEGER PRIMARY KEY AUTOINCREMENT ); CREATE INDEX i_pubsub_node_parent ON pubsub_node (parent); diff --git a/sql/mssql.sql b/sql/mssql.sql index 83b219298..8a24bd5d5 100644 --- a/sql/mssql.sql +++ b/sql/mssql.sql @@ -279,7 +279,7 @@ CREATE TABLE [dbo].[pubsub_node] ( [host] [varchar] (255) NOT NULL, [node] [varchar] (255) NOT NULL, [parent] [varchar] (255) NOT NULL DEFAULT '', - [type] [text] NOT NULL, + [plugin] [text] NOT NULL, [nodeid] [bigint] IDENTITY(1,1) NOT NULL, CONSTRAINT [pubsub_node_PRIMARY] PRIMARY KEY CLUSTERED ( diff --git a/sql/mysql.sql b/sql/mysql.sql index acf2bfe1a..3e34bbb32 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -215,7 +215,7 @@ CREATE TABLE pubsub_node ( host text NOT NULL, node text NOT NULL, parent VARCHAR(191) NOT NULL DEFAULT '', - type text NOT NULL, + plugin text NOT NULL, nodeid bigint auto_increment primary key ) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE INDEX i_pubsub_node_parent ON pubsub_node(parent(120)); diff --git a/sql/pg.new.sql b/sql/pg.new.sql index b155a4223..feb334779 100644 --- a/sql/pg.new.sql +++ b/sql/pg.new.sql @@ -396,7 +396,7 @@ CREATE TABLE pubsub_node ( host text NOT NULL, node text NOT NULL, parent text NOT NULL DEFAULT '', - "type" text NOT NULL, + plugin text NOT NULL, nodeid SERIAL UNIQUE ); CREATE INDEX i_pubsub_node_parent ON pubsub_node USING btree (parent); diff --git a/sql/pg.sql b/sql/pg.sql index fd56ba39d..48f4a85d4 100644 --- a/sql/pg.sql +++ b/sql/pg.sql @@ -221,7 +221,7 @@ CREATE TABLE pubsub_node ( host text NOT NULL, node text NOT NULL, parent text NOT NULL DEFAULT '', - "type" text NOT NULL, + plugin text NOT NULL, nodeid SERIAL UNIQUE ); CREATE INDEX i_pubsub_node_parent ON pubsub_node USING btree (parent); diff --git a/src/node_flat_sql.erl b/src/node_flat_sql.erl index 5995d9fa3..afbc050a8 100644 --- a/src/node_flat_sql.erl +++ b/src/node_flat_sql.erl @@ -337,7 +337,7 @@ get_entity_affiliations(Host, Owner) -> J = encode_jid(GenKey), {result, case ejabberd_sql:sql_query_t( - ?SQL("select @(node)s, @(type)s, @(i.nodeid)d, @(affiliation)s " + ?SQL("select @(node)s, @(plugin)s, @(i.nodeid)d, @(affiliation)s " "from pubsub_state i, pubsub_node n where " "i.nodeid = n.nodeid and jid=%(J)s and host=%(H)s")) of {selected, RItems} -> @@ -389,13 +389,13 @@ get_entity_subscriptions(Host, Owner) -> Query = case SubKey of GenKey -> GJLike = <<(encode_jid_like(GenKey))/binary, "/%">>, - ?SQL("select @(node)s, @(type)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " + ?SQL("select @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " "from pubsub_state i, pubsub_node n " "where i.nodeid = n.nodeid and " "(jid=%(GJ)s or jid like %(GJLike)s escape '^') and host=%(H)s"); _ -> SJ = encode_jid(SubKey), - ?SQL("select @(node)s, @(type)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " + ?SQL("select @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " "from pubsub_state i, pubsub_node n " "where i.nodeid = n.nodeid and " "jid in (%(SJ)s, %(GJ)s) and host=%(H)s") @@ -431,14 +431,14 @@ get_entity_subscriptions_for_send_last(Host, Owner) -> Query = case SubKey of GenKey -> GJLike = <<(encode_jid_like(GenKey))/binary, "/%">>, - ?SQL("select @(node)s, @(type)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " + ?SQL("select @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " "from pubsub_state i, pubsub_node n, pubsub_node_option o " "where i.nodeid = n.nodeid and n.nodeid = o.nodeid and " "name='send_last_published_item' and val='on_sub_and_presence' and " "(jid=%(GJ)s or jid like %(GJLike)s escape '^') and host=%(H)s"); _ -> SJ = encode_jid(SubKey), - ?SQL("select @(node)s, @(type)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " + ?SQL("select @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " "from pubsub_state i, pubsub_node n, pubsub_node_option o " "where i.nodeid = n.nodeid and n.nodeid = o.nodeid and " "name='send_last_published_item' and val='on_sub_and_presence' and " diff --git a/src/node_pep_sql.erl b/src/node_pep_sql.erl index 07ff24b51..4a2690c27 100644 --- a/src/node_pep_sql.erl +++ b/src/node_pep_sql.erl @@ -123,13 +123,13 @@ get_entity_subscriptions(_Host, Owner) -> Query = case SubKey of GenKey -> GJLike = <<(node_flat_sql:encode_jid_like(GenKey))/binary, "/%">>, - ?SQL("select @(host)s, @(node)s, @(type)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " + ?SQL("select @(host)s, @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " "from pubsub_state i, pubsub_node n " "where i.nodeid = n.nodeid and " "(jid=%(GJ)s or jid like %(GJLike)s escape '^') and host like %(HLike)s escape '^'"); _ -> SJ = node_flat_sql:encode_jid(SubKey), - ?SQL("select @(host)s, @(node)s, @(type)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " + ?SQL("select @(host)s, @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " "from pubsub_state i, pubsub_node n " "where i.nodeid = n.nodeid and " "jid in (%(SJ)s,%(GJ)s) and host like %(HLike)s escape '^'") @@ -159,14 +159,14 @@ get_entity_subscriptions_for_send_last(_Host, Owner) -> Query = case SubKey of GenKey -> GJLike = <<(node_flat_sql:encode_jid_like(GenKey))/binary, "/%">>, - ?SQL("select @(host)s, @(node)s, @(type)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " + ?SQL("select @(host)s, @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " "from pubsub_state i, pubsub_node n, pubsub_node_option o " "where i.nodeid = n.nodeid and n.nodeid = o.nodeid and " "name='send_last_published_item' and val='on_sub_and_presence' and " "(jid=%(GJ)s or jid like %(GJLike)s escape '^') and host like %(HLike)s escape '^'"); _ -> SJ = node_flat_sql:encode_jid(SubKey), - ?SQL("select @(host)s, @(node)s, @(type)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " + ?SQL("select @(host)s, @(node)s, @(plugin)s, @(i.nodeid)d, @(jid)s, @(subscriptions)s " "from pubsub_state i, pubsub_node n, pubsub_node_option o " "where i.nodeid = n.nodeid and n.nodeid = o.nodeid and " "name='send_last_published_item' and val='on_sub_and_presence' and " diff --git a/src/nodetree_tree_sql.erl b/src/nodetree_tree_sql.erl index 73ab74e8a..b310dd2d1 100644 --- a/src/nodetree_tree_sql.erl +++ b/src/nodetree_tree_sql.erl @@ -72,23 +72,20 @@ set_node(Record) when is_record(Record, pubsub_node) -> {result, OldNidx} -> catch ejabberd_sql:sql_query_t( - ?SQL("delete from pubsub_node_option where " - "nodeid=%(OldNidx)d")), + ?SQL("delete from pubsub_node_option " + "where nodeid=%(OldNidx)d")), catch ejabberd_sql:sql_query_t( - ?SQL("update pubsub_node set" - " host=%(H)s," - " node=%(Node)s," - " parent=%(Parent)s," - " type=%(Type)s " - "where nodeid=%(OldNidx)d")), + ?SQL("update pubsub_node set" + " host=%(H)s, node=%(Node)s," + " parent=%(Parent)s, plugin=%(Type)s " + "where nodeid=%(OldNidx)d")), OldNidx; _ -> catch ejabberd_sql:sql_query_t( - ?SQL("insert into pubsub_node(host, node, " - "parent, type) values(" - "%(H)s, %(Node)s, %(Parent)s, %(Type)s)")), + ?SQL("insert into pubsub_node(host, node, parent, plugin) " + "values(%(H)s, %(Node)s, %(Parent)s, %(Type)s)")), case nodeidx(Host, Node) of {result, NewNidx} -> NewNidx; _ -> none % this should not happen @@ -104,9 +101,8 @@ set_node(Record) when is_record(Record, pubsub_node) -> SValue = misc:term_to_expr(Value), catch ejabberd_sql:sql_query_t( - ?SQL("insert into pubsub_node_option(nodeid, " - "name, val) values (" - "%(Nidx)d, %(SKey)s, %(SValue)s)")) + ?SQL("insert into pubsub_node_option(nodeid, name, val) " + "values (%(Nidx)d, %(SKey)s, %(SValue)s)")) end, Record#pubsub_node.options), {result, Nidx} @@ -119,8 +115,8 @@ get_node(Host, Node) -> H = node_flat_sql:encode_host(Host), case catch ejabberd_sql:sql_query_t( - ?SQL("select @(node)s, @(parent)s, @(type)s, @(nodeid)d from " - "pubsub_node where host=%(H)s and node=%(Node)s")) + ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d from pubsub_node " + "where host=%(H)s and node=%(Node)s")) of {selected, [RItem]} -> raw_to_node(Host, RItem); @@ -133,8 +129,8 @@ get_node(Host, Node) -> get_node(Nidx) -> case catch ejabberd_sql:sql_query_t( - ?SQL("select @(host)s, @(node)s, @(parent)s, @(type)s from " - "pubsub_node where nodeid=%(Nidx)d")) + ?SQL("select @(host)s, @(node)s, @(parent)s, @(plugin)s from pubsub_node " + "where nodeid=%(Nidx)d")) of {selected, [{Host, Node, Parent, Type}]} -> raw_to_node(Host, {Node, Parent, Type, Nidx}); @@ -151,8 +147,8 @@ get_nodes(Host) -> H = node_flat_sql:encode_host(Host), case catch ejabberd_sql:sql_query_t( - ?SQL("select @(node)s, @(parent)s, @(type)s, @(nodeid)d from " - "pubsub_node where host=%(H)s")) + ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d from pubsub_node " + "where host=%(H)s")) of {selected, RItems} -> [raw_to_node(Host, Item) || Item <- RItems]; @@ -189,8 +185,8 @@ get_subnodes(Host, Node) -> H = node_flat_sql:encode_host(Host), case catch ejabberd_sql:sql_query_t( - ?SQL("select @(node)s, @(parent)s, @(type)s, @(nodeid)d from " - "pubsub_node where host=%(H)s and parent=%(Node)s")) + ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d from pubsub_node " + "where host=%(H)s and parent=%(Node)s")) of {selected, RItems} -> [raw_to_node(Host, Item) || Item <- RItems]; @@ -206,14 +202,14 @@ get_subnodes_tree(Host, Node) -> {error, _} -> []; Rec -> + Type = Rec#pubsub_node.type, H = node_flat_sql:encode_host(Host), N = <<(ejabberd_sql:escape_like_arg_circumflex(Node))/binary, "/%">>, Sub = case catch ejabberd_sql:sql_query_t( - ?SQL("select @(node)s, @(parent)s, @(type)s, @(nodeid)d from " - "pubsub_node where host=%(H)s" - " and node like %(N)s escape '^'" - " and \"type\"='hometree'")) + ?SQL("select @(node)s, @(parent)s, @(plugin)s, @(nodeid)d from pubsub_node " + "where host=%(H)s and plugin=%(Type)s and" + " (parent=%(Node)s or parent like %(N)s escape '^')")) of {selected, RItems} -> [raw_to_node(Host, Item) || Item <- RItems]; @@ -269,14 +265,13 @@ create_node(Host, Node, Type, Owner, Options, Parents) -> end. delete_node(Host, Node) -> - H = node_flat_sql:encode_host(Host), - N = <<(ejabberd_sql:escape_like_arg_circumflex(Node))/binary, "/%">>, - Removed = get_subnodes_tree(Host, Node), - catch ejabberd_sql:sql_query_t( - ?SQL("delete from pubsub_node where host=%(H)s" - " and (node=%(Node)s" - " or (\"type\"='hometree' and node like %(N)s escape '^'))")), - Removed. + lists:map( + fun(Rec) -> + Nidx = Rec#pubsub_node.id, + catch ejabberd_sql:sql_query_t( + ?SQL("delete from pubsub_node where nodeid=%(Nidx)d")), + Rec + end, get_subnodes_tree(Host, Node)). %% helpers raw_to_node(Host, [Node, Parent, Type, Nidx]) -> @@ -284,8 +279,8 @@ raw_to_node(Host, [Node, Parent, Type, Nidx]) -> raw_to_node(Host, {Node, Parent, Type, Nidx}) -> Options = case catch ejabberd_sql:sql_query_t( - ?SQL("select @(name)s, @(val)s from pubsub_node_option " - "where nodeid=%(Nidx)d")) + ?SQL("select @(name)s, @(val)s from pubsub_node_option " + "where nodeid=%(Nidx)d")) of {selected, ROptions} -> DbOpts = lists:map(fun ({Key, Value}) -> @@ -308,16 +303,15 @@ raw_to_node(Host, {Node, Parent, Type, Nidx}) -> <<>> -> []; _ -> [Parent] end, - #pubsub_node{nodeid = {Host, Node}, - parents = Parents, - id = Nidx, type = Type, options = Options}. + #pubsub_node{nodeid = {Host, Node}, id = Nidx, + parents = Parents, type = Type, options = Options}. nodeidx(Host, Node) -> H = node_flat_sql:encode_host(Host), case catch ejabberd_sql:sql_query_t( - ?SQL("select @(nodeid)d from pubsub_node where " - "host=%(H)s and node=%(Node)s")) + ?SQL("select @(nodeid)d from pubsub_node " + "where host=%(H)s and node=%(Node)s")) of {selected, [{Nidx}]} -> {result, Nidx};