diff options
Diffstat (limited to 'src/mod_pubsub/nodetree_tree.erl')
-rw-r--r-- | src/mod_pubsub/nodetree_tree.erl | 142 |
1 files changed, 78 insertions, 64 deletions
diff --git a/src/mod_pubsub/nodetree_tree.erl b/src/mod_pubsub/nodetree_tree.erl index e49186668..99185628e 100644 --- a/src/mod_pubsub/nodetree_tree.erl +++ b/src/mod_pubsub/nodetree_tree.erl @@ -65,16 +65,16 @@ %% API definition %% ================ -%% @spec (Host, ServerHost, Opts) -> any() -%% Host = mod_pubsub:host() -%% ServerHost = host() -%% Opts = list() +%% @spec (Host, ServerHost, Options) -> ok +%% Host = string() +%% ServerHost = string() +%% Options = [{atom(), term()}] %% @doc <p>Called during pubsub modules initialisation. Any pubsub plugin must %% implement this function. It can return anything.</p> %% <p>This function is mainly used to trigger the setup task necessary for the %% plugin. It can be used for example by the developer to create the specific %% module database schema if it does not exists yet.</p> -init(_Host, _ServerHost, _Opts) -> +init(_Host, _ServerHost, _Options) -> mnesia:create_table(pubsub_node, [{disc_copies, [node()]}, {attributes, record_info(fields, pubsub_node)}]), @@ -87,34 +87,41 @@ init(_Host, _ServerHost, _Opts) -> %% mnesia:transform_table(pubsub_state, ignore, StatesFields) end, ok. +%% @spec (Host, ServerHost) -> ok +%% Host = string() +%% ServerHost = string() terminate(_Host, _ServerHost) -> ok. -%% @spec () -> [Option] -%% Option = mod_pubsub:nodetreeOption() +%% @spec () -> Options +%% Options = [mod_pubsub:nodeOption()] %% @doc Returns the default pubsub node tree options. options() -> [{virtual_tree, false}]. -%% @spec (NodeRecord) -> ok | {error, Reason} -%% Record = mod_pubsub:pubsub_node() -set_node(Record) when is_record(Record, pubsub_node) -> - mnesia:write(Record); +%% @spec (Node) -> ok | {error, Reason} +%% Node = mod_pubsub:pubsubNode() +%% Reason = mod_pubsub:stanzaError() +set_node(Node) when is_record(Node, pubsub_node) -> + mnesia:write(Node); set_node(_) -> {error, ?ERR_INTERNAL_SERVER_ERROR}. get_node(Host, Node, _From) -> get_node(Host, Node). -%% @spec (Host, Node) -> pubsubNode() | {error, Reason} -%% Host = mod_pubsub:host() -%% Node = mod_pubsub:pubsubNode() -get_node(Host, Node) -> - case catch mnesia:read({pubsub_node, {Host, Node}}) of +%% @spec (Host, NodeId) -> Node | {error, Reason} +%% Host = mod_pubsub:host() +%% NodeId = mod_pubsub:nodeId() +%% Node = mod_pubsub:pubsubNode() +%% Reason = mod_pubsub:stanzaError() +get_node(Host, NodeId) -> + case catch mnesia:read({pubsub_node, {Host, NodeId}}) of [Record] when is_record(Record, pubsub_node) -> Record; [] -> {error, ?ERR_ITEM_NOT_FOUND}; Error -> Error end. + get_node(NodeId) -> case catch mnesia:index_read(pubsub_node, NodeId, #pubsub_node.id) of [Record] when is_record(Record, pubsub_node) -> Record; @@ -125,41 +132,43 @@ get_node(NodeId) -> get_nodes(Host, _From) -> get_nodes(Host). -%% @spec (Host) -> [pubsubNode()] | {error, Reason} -%% Host = mod_pubsub:host() | mod_pubsub:jid() +%% @spec (Host) -> Nodes | {error, Reason} +%% Host = mod_pubsub:host() +%% Nodes = [mod_pubsub:pubsubNode()] +%% Reason = {aborted, atom()} get_nodes(Host) -> mnesia:match_object(#pubsub_node{nodeid = {Host, '_'}, _ = '_'}). -%% @spec (Host, Node, From) -> [{Depth, Record}] | {error, Reason} -%% Host = mod_pubsub:host() | mod_pubsub:jid() -%% Node = mod_pubsub:pubsubNode() +%% @spec (Host, Node, From) -> [] +%% Host = mod_pubsub:host() +%% NodeId = mod_pubsub:nodeId() %% From = mod_pubsub:jid() -%% Depth = integer() -%% Record = pubsubNode() %% @doc <p>Default node tree does not handle parents, return empty list.</p> -get_parentnodes(_Host, _Node, _From) -> +get_parentnodes(_Host, _NodeId, _From) -> []. -%% @spec (Host, Node, From) -> [{Depth, Record}] | {error, Reason} -%% Host = mod_pubsub:host() | mod_pubsub:jid() -%% Node = mod_pubsub:pubsubNode() +%% @spec (Host, NodeId, From) -> [{Depth, Node}] | [] +%% Host = mod_pubsub:host() +%% NodeId = mod_pubsub:nodeId() %% From = mod_pubsub:jid() %% Depth = integer() -%% Record = pubsubNode() +%% Node = mod_pubsub:pubsubNode() %% @doc <p>Default node tree does not handle parents, return a list %% containing just this node.</p> -get_parentnodes_tree(Host, Node, From) -> - case get_node(Host, Node, From) of - N when is_record(N, pubsub_node) -> [{0, [N]}]; +get_parentnodes_tree(Host, NodeId, From) -> + case get_node(Host, NodeId, From) of + Node when is_record(Node, pubsub_node) -> [{0, [Node]}]; _Error -> [] end. -%% @spec (Host, Node, From) -> [pubsubNode()] | {error, Reason} -%% Host = mod_pubsub:host() -%% Node = mod_pubsub:pubsubNode() -%% From = mod_pubsub:jid() -get_subnodes(Host, Node, _From) -> - get_subnodes(Host, Node). +%% @spec (Host, NodeId, From) -> Nodes +%% Host = mod_pubsub:host() +%% NodeId = mod_pubsub:nodeId() +%% From = mod_pubsub:jid() +%% Nodes = [mod_pubsub:pubsubNode()] +get_subnodes(Host, NodeId, _From) -> + get_subnodes(Host, NodeId). + get_subnodes(Host, <<>>) -> Q = qlc:q([N || #pubsub_node{nodeid = {NHost, _}, parents = Parents} = N <- mnesia:table(pubsub_node), @@ -176,17 +185,17 @@ get_subnodes(Host, Node) -> get_subnodes_tree(Host, Node, _From) -> get_subnodes_tree(Host, Node). -%% @spec (Host, Index) -> [pubsubNodeIdx()] | {error, Reason} -%% Host = mod_pubsub:host() -%% Node = mod_pubsub:pubsubNode() -%% From = mod_pubsub:jid() -get_subnodes_tree(Host, Node) -> - case get_node(Host, Node) of +%% @spec (Host, NodeId) -> Nodes +%% Host = mod_pubsub:host() +%% NodeId = mod_pubsub:nodeId() +%% Nodes = [] | [mod_pubsub:pubsubNode()] +get_subnodes_tree(Host, NodeId) -> + case get_node(Host, NodeId) of {error, _} -> []; Rec -> BasePlugin = list_to_atom("node_"++Rec#pubsub_node.type), - BasePath = BasePlugin:node_to_path(Node), + BasePath = BasePlugin:node_to_path(NodeId), mnesia:foldl(fun(#pubsub_node{nodeid = {H, N}} = R, Acc) -> Plugin = list_to_atom("node_"++R#pubsub_node.type), Path = Plugin:node_to_path(N), @@ -197,15 +206,19 @@ get_subnodes_tree(Host, Node) -> end, [], pubsub_node) end. -%% @spec (Host, Node, Type, Owner, Options, Parents) -> ok | {error, Reason} -%% Host = mod_pubsub:host() | mod_pubsub:jid() -%% Node = mod_pubsub:pubsubNode() -%% NodeType = mod_pubsub:nodeType() -%% Owner = mod_pubsub:jid() -%% Options = list() -create_node(Host, Node, Type, Owner, Options, Parents) -> +%% @spec (Host, NodeId, Type, Owner, Options, Parents) -> +%% {ok, NodeIdx} | {error, Reason} +%% Host = mod_pubsub:host() +%% NodeId = mod_pubsub:nodeId() +%% Type = mod_pubsub:nodeType() +%% Owner = mod_pubsub:jid() +%% Options = [mod_pubsub:nodeOption()] +%% Parents = [] | [mod_pubsub:nodeId()] +%% NodeIdx = mod_pubsub:nodeIdx() +%% Reason = mod_pubsub:stanzaError() +create_node(Host, NodeId, Type, Owner, Options, Parents) -> BJID = jlib:jid_tolower(jlib:jid_remove_resource(Owner)), - case catch mnesia:read({pubsub_node, {Host, Node}}) of + case catch mnesia:read({pubsub_node, {Host, NodeId}}) of [] -> ParentExists = case Host of @@ -228,14 +241,14 @@ create_node(Host, Node, Type, Owner, Options, Parents) -> end, case ParentExists of true -> - NodeId = pubsub_index:new(node), - mnesia:write(#pubsub_node{nodeid = {Host, Node}, - id = NodeId, + NodeIdx = pubsub_index:new(node), + mnesia:write(#pubsub_node{nodeid = {Host, NodeId}, + id = NodeIdx, parents = Parents, type = Type, owners = [BJID], options = Options}), - {ok, NodeId}; + {ok, NodeIdx}; false -> %% Requesting entity is prohibited from creating nodes {error, ?ERR_FORBIDDEN} @@ -245,13 +258,14 @@ create_node(Host, Node, Type, Owner, Options, Parents) -> {error, ?ERR_CONFLICT} end. -%% @spec (Host, Node) -> [mod_pubsub:node()] -%% Host = mod_pubsub:host() | mod_pubsub:jid() -%% Node = mod_pubsub:pubsubNode() -delete_node(Host, Node) -> - Removed = get_subnodes_tree(Host, Node), - lists:foreach(fun(#pubsub_node{nodeid = {_, N}, id = I}) -> - pubsub_index:free(node, I), - mnesia:delete({pubsub_node, {Host, N}}) +%% @spec (Host, NodeId) -> Removed +%% Host = mod_pubsub:host() +%% NodeId = mod_pubsub:nodeId() +%% Removed = [mod_pubsub:pubsubNode()] +delete_node(Host, NodeId) -> + Removed = get_subnodes_tree(Host, NodeId), + lists:foreach(fun(#pubsub_node{nodeid = {_, SubNodeId}, id = SubNodeIdx}) -> + pubsub_index:free(node, SubNodeIdx), + mnesia:delete({pubsub_node, {Host, SubNodeId}}) end, Removed), Removed. |