diff options
author | Christophe Romain <christophe.romain@process-one.net> | 2015-04-08 17:12:05 +0200 |
---|---|---|
committer | Christophe Romain <christophe.romain@process-one.net> | 2015-04-21 15:24:16 +0200 |
commit | e0563e3918984d151fbea45a5f6fc8255913726d (patch) | |
tree | e62bcc5cc538a722f81c3f53291e02594e576711 /src/nodetree_virtual.erl | |
parent | Improve join/leave cluster scripts (diff) |
PubSub improvements
This commit contains
- code cleanup
- use of db_type instead of old mod_pubsub_odbc
- some minor optimizations
- some minor bugfixes
Diffstat (limited to 'src/nodetree_virtual.erl')
-rw-r--r-- | src/nodetree_virtual.erl | 177 |
1 files changed, 59 insertions, 118 deletions
diff --git a/src/nodetree_virtual.erl b/src/nodetree_virtual.erl index abe88560f..d56be860f 100644 --- a/src/nodetree_virtual.erl +++ b/src/nodetree_virtual.erl @@ -26,143 +26,84 @@ %%% ==================================================================== %%% @doc The module <strong>{@module}</strong> is the PubSub node tree plugin that -%%% allow virtual nodes handling. +%%% allow virtual nodes handling. This prevent storage of nodes. %%% <p>PubSub node tree plugins are using the {@link gen_nodetree} behaviour.</p> %%% <p>This plugin development is still a work in progress. Due to optimizations in %%% mod_pubsub, this plugin can not work anymore without altering functioning. %%% Please, send us comments, feedback and improvements.</p> -module(nodetree_virtual). - +-behaviour(gen_pubsub_nodetree). -author('christophe.romain@process-one.net'). -include("pubsub.hrl"). - -include("jlib.hrl"). --behaviour(gen_pubsub_nodetree). - -export([init/3, terminate/2, options/0, set_node/1, - get_node/3, get_node/2, get_node/1, get_nodes/2, - get_nodes/1, get_parentnodes/3, get_parentnodes_tree/3, - get_subnodes/3, get_subnodes_tree/3, create_node/6, - delete_node/2]). - -%% ================ -%% API definition -%% ================ - -%% @spec (Host, ServerHost, Opts) -> any() -%% Host = mod_pubsub:host() -%% ServerHost = host() -%% Opts = list() -%% @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> -%% @spec () -> [Option] -%% Option = mod_pubsub:nodetreeOption() -%% @doc <p>Returns the default pubsub node tree options.</p> -%% @spec (NodeRecord) -> ok | {error, Reason} -%% NodeRecord = mod_pubsub:pubsub_node() -%% @doc <p>No node record is stored on database. Just do nothing.</p> -%% @spec (Host, Node, From) -> pubsubNode() -%% Host = mod_pubsub:host() -%% Node = mod_pubsub:pubsubNode() -%% From = mod_pubsub:jid() -%% @doc <p>Virtual node tree does not handle a node database. Any node is considered -%% as existing. Node record contains default values.</p> -init(_Host, _ServerHost, _Opts) -> ok. - -terminate(_Host, _ServerHost) -> ok. - -options() -> [{virtual_tree, true}]. - -set_node(_NodeRecord) -> ok. - -get_node(Host, Node, _From) -> get_node(Host, Node). - -get_node(Host, Node) -> get_node({Host, Node}). - -get_node({Host, _} = NodeId) -> - Record = #pubsub_node{nodeid = NodeId, id = NodeId}, - Module = jlib:binary_to_atom(<<"node_", - (Record#pubsub_node.type)/binary>>), - Options = Module:options(), - Owners = [{<<"">>, Host, <<"">>}], - Record#pubsub_node{owners = Owners, options = Options}. - -%% @spec (Host, From) -> [pubsubNode()] -%% Host = mod_pubsub:host() | mod_pubsub:jid() -%% From = mod_pubsub:jid() -%% @doc <p>Virtual node tree does not handle a node database. Any node is considered -%% as existing. Nodes list can not be determined.</p> -%% @spec (Host, Node, From) -> [pubsubNode()] -%% Host = mod_pubsub:host() -%% Node = mod_pubsub:pubsubNode() -%% From = mod_pubsub:jid() -%% @doc <p>Virtual node tree does not handle parent/child. Child list is empty.</p> -%% @spec (Host, Node, From) -> [pubsubNode()] -%% Host = mod_pubsub:host() -%% Node = mod_pubsub:pubsubNode() -%% From = mod_pubsub:jid() -%% @doc <p>Virtual node tree does not handle parent/child. Child list is empty.</p> -%% @spec (Host, Node, From) -> [pubsubNode()] -%% Host = mod_pubsub:host() -%% Node = mod_pubsub:pubsubNode() -%% From = mod_pubsub:jid() -%% @doc <p>Virtual node tree does not handle parent/child. Child list is empty.</p> -get_nodes(Host, _From) -> get_nodes(Host). - -get_nodes(_Host) -> []. - -get_parentnodes(_Host, _Node, _From) -> []. - --spec(get_parentnodes_tree/3 :: -( - Host :: mod_pubsub:host(), - NodeId :: mod_pubsub:nodeId(), - From :: jid()) - -> [{0, [mod_pubsub:pubsubNode(),...]}] -). -get_parentnodes_tree(Host, NodeId, From) -> - case get_node(Host, NodeId, From) of - Node when is_record(Node, pubsub_node) -> [{0, [Node]}]; - _Error -> [] + get_node/3, get_node/2, get_node/1, get_nodes/2, + get_nodes/1, get_parentnodes/3, get_parentnodes_tree/3, + get_subnodes/3, get_subnodes_tree/3, create_node/6, + delete_node/2]). + +init(_Host, _ServerHost, _Opts) -> + ok. + +terminate(_Host, _ServerHost) -> + ok. + +options() -> + [{virtual_tree, true}]. + +set_node(_Node) -> + ok. + +get_node(Host, Node, _From) -> + get_node(Host, Node). + +get_node(Host, Node) -> + get_node(nodeidx(Host, Node)). + +get_node(Nidx) -> + {Host, Node} = nodeid(Nidx), + Record = #pubsub_node{nodeid = Node, id = Nidx}, + Module = jlib:binary_to_atom(<<"node_", (Record#pubsub_node.type)/binary>>), + Record#pubsub_node{owners = [{<<"">>, Host, <<"">>}], + options = Module:options()}. + +get_nodes(Host, _From) -> + get_nodes(Host). + +get_nodes(_Host) -> + []. + +get_parentnodes(_Host, _Node, _From) -> + []. + +get_parentnodes_tree(Host, Node, From) -> + case get_node(Host, Node, From) of + Node when is_record(Node, pubsub_node) -> [{0, [Node]}]; + _Error -> [] end. get_subnodes(Host, Node, _From) -> get_subnodes(Host, Node). -%% @spec (Host, Node, From) -> [pubsubNode()] -%% Host = mod_pubsub:host() -%% Node = mod_pubsub:pubsubNode() -%% From = mod_pubsub:jid() -%% @doc <p>Virtual node tree does not handle parent/child. Child list is empty.</p> -get_subnodes(_Host, _Node) -> []. +get_subnodes(_Host, _Node) -> + []. get_subnodes_tree(Host, Node, _From) -> get_subnodes_tree(Host, Node). -%% @spec (Host, Node, Type, Owner, Options, Parents) -> ok -%% Host = mod_pubsub:host() -%% Node = mod_pubsub:pubsubNode() -%% Type = mod_pubsub:nodeType() -%% Owner = mod_pubsub:jid() -%% Options = list() -%% @doc <p>No node record is stored on database. Any valid node -%% is considered as already created.</p> -%% <p>default allowed nodes: /home/host/user/any/node/name</p> -%% @spec (Host, Node) -> [mod_pubsub:node()] -%% Host = mod_pubsub:host() -%% Node = mod_pubsub:pubsubNode() -%% @doc <p>Virtual node tree does not handle parent/child. -%% node deletion just affects the corresponding node.</p> - -get_subnodes_tree(_Host, _Node) -> []. - -create_node(Host, Node, _Type, _Owner, _Options, - _Parents) -> + +get_subnodes_tree(_Host, _Node) -> + []. + +create_node(Host, Node, _Type, _Owner, _Options, _Parents) -> {error, {virtual, {Host, Node}}}. -delete_node(Host, Node) -> [get_node(Host, Node)]. +delete_node(Host, Node) -> + [get_node(Host, Node)]. + +%% internal helper + +nodeidx(Host, Node) -> term_to_binary({Host, Node}). +nodeid(Nidx) -> binary_to_term(Nidx). |