aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2008-12-16 17:44:48 +0000
committerBadlop <badlop@process-one.net>2008-12-16 17:44:48 +0000
commit8f4386709125b8df818e6c6fac9503f1806d2224 (patch)
tree7793cd5a1d8474121fdb4726986ce3db7443b379
parent* doc/guide.tex: Fix capitalization of some section titles (diff)
* src/mod_pubsub/mod_pubsub.erl: Fix update pubsub tables from
ejabberd 1.x to 2.x (EJAB-817) SVN Revision: 1734
-rw-r--r--ChangeLog3
-rw-r--r--src/mod_pubsub/mod_pubsub.erl112
2 files changed, 62 insertions, 53 deletions
diff --git a/ChangeLog b/ChangeLog
index 3825f1987..00d5dfa0e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2008-12-16 Badlop <badlop@process-one.net>
+ * src/mod_pubsub/mod_pubsub.erl: Fix update pubsub tables from
+ ejabberd 1.x to 2.x (EJAB-817)
+
* doc/guide.tex: Fix capitalization of some section titles
* doc/guide.tex: Mention as optional Requirements: mysql, pgsql
diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl
index 0306e331e..61002daec 100644
--- a/src/mod_pubsub/mod_pubsub.erl
+++ b/src/mod_pubsub/mod_pubsub.erl
@@ -241,60 +241,66 @@ update_database(Host) ->
[host_node, host_parent, info] ->
?INFO_MSG("upgrade pubsub tables",[]),
F = fun() ->
- NewRecords =
- lists:foldl(
- fun({pubsub_node, NodeId, ParentId, {nodeinfo, Items, Options, Entities}}, RecList) ->
- ItemsList =
- lists:foldl(
- fun({item, IID, Publisher, Payload}, Acc) ->
- C = {Publisher, unknown},
- M = {Publisher, now()},
- mnesia:write(
- #pubsub_item{itemid = {IID, NodeId},
- creation = C,
- modification = M,
- payload = Payload}),
- [{Publisher, IID} | Acc]
- end, [], Items),
- Owners =
- dict:fold(
- fun(JID, {entity, Aff, Sub}, Acc) ->
- UsrItems =
- lists:foldl(
- fun({P, I}, IAcc) ->
- case P of
- JID -> [I | IAcc];
- _ -> IAcc
- end
- end, [], ItemsList),
- mnesia:write(
- #pubsub_state{stateid = {JID, NodeId},
- items = UsrItems,
- affiliation = Aff,
- subscription = Sub}),
- case Aff of
- owner -> [JID | Acc];
- _ -> Acc
- end
- end, [], Entities),
- mnesia:delete({pubsub_node, NodeId}),
- [#pubsub_node{nodeid = NodeId,
- parentid = ParentId,
- owners = Owners,
- options = Options} |
- RecList]
- end, [],
- mnesia:match_object(
- {pubsub_node, {Host, '_'}, '_', '_'})),
- mnesia:delete_table(pubsub_node),
- mnesia:create_table(pubsub_node,
- [{disc_copies, [node()]},
- {attributes, record_info(fields, pubsub_node)}]),
- lists:foreach(fun(Record) ->
- mnesia:write(Record)
- end, NewRecords)
+ lists:foldl(
+ fun({pubsub_node, NodeId, ParentId, {nodeinfo, Items, Options, Entities}}, RecList) ->
+ ItemsList =
+ lists:foldl(
+ fun({item, IID, Publisher, Payload}, Acc) ->
+ C = {Publisher, unknown},
+ M = {Publisher, now()},
+ mnesia:write(
+ #pubsub_item{itemid = {IID, NodeId},
+ creation = C,
+ modification = M,
+ payload = Payload}),
+ [{Publisher, IID} | Acc]
+ end, [], Items),
+ Owners =
+ dict:fold(
+ fun(JID, {entity, Aff, Sub}, Acc) ->
+ UsrItems =
+ lists:foldl(
+ fun({P, I}, IAcc) ->
+ case P of
+ JID -> [I | IAcc];
+ _ -> IAcc
+ end
+ end, [], ItemsList),
+ mnesia:write(
+ #pubsub_state{stateid = {JID, NodeId},
+ items = UsrItems,
+ affiliation = Aff,
+ subscription = Sub}),
+ case Aff of
+ owner -> [JID | Acc];
+ _ -> Acc
+ end
+ end, [], Entities),
+ mnesia:delete({pubsub_node, NodeId}),
+ [#pubsub_node{nodeid = NodeId,
+ parentid = ParentId,
+ owners = Owners,
+ options = Options} |
+ RecList]
+ end, [],
+ mnesia:match_object(
+ {pubsub_node, {Host, '_'}, '_', '_'}))
end,
- mnesia:transaction(F);
+ {atomic, NewRecords} = mnesia:transaction(F),
+ {atomic, ok} = mnesia:delete_table(pubsub_node),
+ {atomic, ok} = mnesia:create_table(pubsub_node,
+ [{disc_copies, [node()]},
+ {attributes, record_info(fields, pubsub_node)}]),
+ FNew = fun() -> lists:foreach(fun(Record) ->
+ mnesia:write(Record)
+ end, NewRecords)
+ end,
+ case mnesia:transaction(FNew) of
+ {atomic, Result} ->
+ ?INFO_MSG("Pubsub tables updated correctly: ~p", [Result]);
+ {aborted, Reason} ->
+ ?ERROR_MSG("Problem updating Pubsub tables:~n~p", [Reason])
+ end;
_ ->
ok
end.