* src/mod_pubsub/mod_pubsub.erl: Fix update pubsub tables from

ejabberd 1.x to 2.x (EJAB-817)

SVN Revision: 1734
This commit is contained in:
Badlop 2008-12-16 17:44:48 +00:00
parent a61b838ad9
commit cd1eddde1a
2 changed files with 62 additions and 53 deletions

View File

@ -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

View File

@ -238,60 +238,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.