diff options
author | Christophe Romain <christophe.romain@process-one.net> | 2016-12-09 12:01:42 +0100 |
---|---|---|
committer | Christophe Romain <christophe.romain@process-one.net> | 2016-12-09 12:51:08 +0100 |
commit | bcc04d93e1458d9258d065a92d6e0e597d346b66 (patch) | |
tree | 6ef116255134af4278205372900b7790198b9eae /src | |
parent | Enforce affiliation removal, remove corresponding items (#1320) (diff) |
Enforce pubsub node removal, revert previous commit (#1320)
This reverts commit 2976c2d921fcc4eb0c55abb54842351cc0adfb86.
and enforce node purge/removal instead
Diffstat (limited to 'src')
-rw-r--r-- | src/node_flat.erl | 29 | ||||
-rw-r--r-- | src/node_flat_sql.erl | 3 |
2 files changed, 25 insertions, 7 deletions
diff --git a/src/node_flat.erl b/src/node_flat.erl index f44f251e..7c7d344a 100644 --- a/src/node_flat.erl +++ b/src/node_flat.erl @@ -58,6 +58,9 @@ init(_Host, _ServerHost, _Opts) -> ejabberd_mnesia:create(?MODULE, pubsub_item, [{disc_only_copies, [node()]}, {attributes, record_info(fields, pubsub_item)}]), + ejabberd_mnesia:create(?MODULE, pubsub_orphan, + [{disc_copies, [node()]}, + {attributes, record_info(fields, pubsub_orphan)}]), ItemsFields = record_info(fields, pubsub_item), case mnesia:table_info(pubsub_item, attributes) of ItemsFields -> ok; @@ -138,8 +141,10 @@ delete_node(Nodes) -> Reply = lists:map(fun (#pubsub_node{id = Nidx} = PubsubNode) -> {result, States} = get_states(Nidx), lists:foreach(fun (State) -> - del_state(State) + del_items(Nidx, State#pubsub_state.items), + del_state(State#pubsub_state{items = []}) end, States), + del_orphan_items(Nidx), {PubsubNode, lists:flatmap(Tr, States)} end, Nodes), {result, {default, broadcast, Reply}}. @@ -472,6 +477,7 @@ purge_node(Nidx, Owner) -> set_state(S#pubsub_state{items = []}) end, States), + del_orphan_items(Nidx), {result, {default, broadcast}}; _ -> {error, xmpp:err_forbidden()} @@ -696,9 +702,15 @@ set_state(State) when is_record(State, pubsub_state) -> %set_state(_) -> {error, ?ERR_INTERNAL_SERVER_ERROR}. %% @doc <p>Delete a state from database.</p> -del_state(#pubsub_state{stateid = {LJID, Nidx}, items = Items}) -> - del_items(Nidx, Items), - mnesia:delete({pubsub_state, {LJID, Nidx}}). +del_state(#pubsub_state{stateid = {Key, Nidx}, items = Items}) -> + case Items of + [] -> + ok; + _ -> + Orphan = #pubsub_orphan{nodeid = Nidx, items = Items}, + mnesia:write(Orphan) + end, + mnesia:delete({pubsub_state, {Key, Nidx}}). %% @doc Returns the list of stored items for a given node. %% <p>For the default PubSub module, items are stored in Mnesia database.</p> @@ -801,6 +813,15 @@ del_items(Nidx, ItemIds) -> end, ItemIds). +del_orphan_items(Nidx) -> + case mnesia:read({pubsub_orphan, Nidx}) of + [#pubsub_orphan{items = ItemIds}] -> + del_items(Nidx, ItemIds), + mnesia:delete({pubsub_orphan, Nidx}); + _ -> + ok + end. + get_item_name(_Host, _Node, Id) -> Id. diff --git a/src/node_flat_sql.erl b/src/node_flat_sql.erl index 2372b535..7e5ce788 100644 --- a/src/node_flat_sql.erl +++ b/src/node_flat_sql.erl @@ -642,9 +642,6 @@ set_state(Nidx, State) -> del_state(Nidx, JID) -> J = encode_jid(JID), catch ejabberd_sql:sql_query_t( - ?SQL("delete from pubsub_item where publisher=%(J)s" - " and nodeid=%(Nidx)d")), - catch ejabberd_sql:sql_query_t( ?SQL("delete from pubsub_state" " where jid=%(J)s and nodeid=%(Nidx)d")), ok. |