backport TECH-1293(mnesia)

This commit is contained in:
Matthias Rieber 2012-10-17 01:12:13 +02:00
parent cdb2ebe4bd
commit edbb30babd
4 changed files with 28 additions and 19 deletions

View File

@ -2623,13 +2623,15 @@ get_options_helper(JID, Lang, Node, NodeID, SubID, Type) ->
read_sub(Subscriber, Node, NodeID, SubID, Lang) -> read_sub(Subscriber, Node, NodeID, SubID, Lang) ->
case pubsub_subscription:get_subscription(Subscriber, NodeID, SubID) of case pubsub_subscription:get_subscription(Subscriber, NodeID, SubID) of
{error, notfound} ->
{error, extended_error(?ERR_NOT_ACCEPTABLE, "invalid-subid")};
{result, #pubsub_subscription{options = Options}} -> {result, #pubsub_subscription{options = Options}} ->
{result, XdataEl} = pubsub_subscription:get_options_xform(Lang, Options), {result, XdataEl} = pubsub_subscription:get_options_xform(Lang, Options),
OptionsEl = {xmlelement, "options", [{"jid", jlib:jid_to_string(Subscriber)}, OptionsEl = {xmlelement, "options", [{"jid", jlib:jid_to_string(Subscriber)},
{"subid", SubID}|nodeAttr(Node)], {"subid", SubID}|nodeAttr(Node)],
[XdataEl]}, [XdataEl]},
PubsubEl = {xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [OptionsEl]},
{result, PubsubEl};
_ -> OptionsEl = {xmlelement, "options", [{"jid", jlib:jid_to_string(Subscriber)},
{"subid", SubID}|nodeAttr(Node)]},
PubsubEl = {xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [OptionsEl]}, PubsubEl = {xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [OptionsEl]},
{result, PubsubEl} {result, PubsubEl}
end. end.
@ -2680,12 +2682,14 @@ set_options_helper(Configuration, JID, NodeID, SubID, Type) ->
write_sub(_Subscriber, _NodeID, _SubID, invalid) -> write_sub(_Subscriber, _NodeID, _SubID, invalid) ->
{error, extended_error(?ERR_BAD_REQUEST, "invalid-options")}; {error, extended_error(?ERR_BAD_REQUEST, "invalid-options")};
write_sub(_Subscriber, _NodeID, _SubID, []) ->
{result, []};
write_sub(Subscriber, NodeID, SubID, Options) -> write_sub(Subscriber, NodeID, SubID, Options) ->
case pubsub_subscription:set_subscription(Subscriber, NodeID, SubID, Options) of case pubsub_subscription:set_subscription(Subscriber, NodeID, SubID, Options) of
{error, notfound} ->
{error, extended_error(?ERR_NOT_ACCEPTABLE, "invalid-subid")};
{result, _} -> {result, _} ->
{result, []} {result, []};
{error, _} ->
{error, extended_error('not-acceptable', "invalid-subid")}
end. end.
%% @spec (Host, Node, JID, Plugins) -> {error, Reason} | {result, Response} %% @spec (Host, Node, JID, Plugins) -> {error, Reason} | {result, Response}

View File

@ -97,9 +97,11 @@ init(_Host, _ServerHost, _Options) ->
pubsub_subscription:init(), pubsub_subscription:init(),
mnesia:create_table(pubsub_state, mnesia:create_table(pubsub_state,
[{disc_copies, [node()]}, [{disc_copies, [node()]},
{index, [nodeidx]},
{attributes, record_info(fields, pubsub_state)}]), {attributes, record_info(fields, pubsub_state)}]),
mnesia:create_table(pubsub_item, mnesia:create_table(pubsub_item,
[{disc_only_copies, [node()]}, [{disc_only_copies, [node()]},
{index, [nodeidx]},
{attributes, record_info(fields, pubsub_item)}]), {attributes, record_info(fields, pubsub_item)}]),
ItemsFields = record_info(fields, pubsub_item), ItemsFields = record_info(fields, pubsub_item),
case mnesia:table_info(pubsub_item, attributes) of case mnesia:table_info(pubsub_item, attributes) of
@ -224,7 +226,7 @@ create_node_permission(Host, ServerHost, NodeId, _ParentNodeId, Owner, Access) -
%% @doc <p></p> %% @doc <p></p>
create_node(NodeIdx, Owner) -> create_node(NodeIdx, Owner) ->
OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)), OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
set_state(#pubsub_state{stateid = {OwnerKey, NodeIdx}, affiliation = owner}), set_state(#pubsub_state{stateid = {OwnerKey, NodeIdx}, nodeidx = NodeIdx, affiliation = owner}),
{result, {default, broadcast}}. {result, {default, broadcast}}.
%% @spec (Nodes) -> {result, {default, broadcast, Reply}} %% @spec (Nodes) -> {result, {default, broadcast, Reply}}
@ -507,6 +509,7 @@ publish_item(NodeIdx, Publisher, PublishModel, MaxItems, ItemId, Payload) ->
payload = Payload}; payload = Payload};
_ -> _ ->
#pubsub_item{itemid = {ItemId, NodeIdx}, #pubsub_item{itemid = {ItemId, NodeIdx},
nodeidx = NodeIdx,
creation = {Now, GenKey}, creation = {Now, GenKey},
modification = PubId, modification = PubId,
payload = Payload} payload = Payload}
@ -860,8 +863,8 @@ get_nodes_helper(NodeTree,
%% ```get_states(NodeIdx) -> %% ```get_states(NodeIdx) ->
%% node_default:get_states(NodeIdx).'''</p> %% node_default:get_states(NodeIdx).'''</p>
get_states(NodeIdx) -> get_states(NodeIdx) ->
States = case catch mnesia:match_object( States = case catch mnesia:index_read(
#pubsub_state{stateid = {'_', NodeIdx}, _ = '_'}) of pubsub_state, NodeIdx, #pubsub_state.nodeidx) of
List when is_list(List) -> List; List when is_list(List) -> List;
_ -> [] _ -> []
end, end,
@ -875,8 +878,8 @@ get_states(NodeIdx) ->
get_state(NodeIdx, JID) -> get_state(NodeIdx, JID) ->
StateId = {JID, NodeIdx}, StateId = {JID, NodeIdx},
case catch mnesia:read({pubsub_state, StateId}) of case catch mnesia:read({pubsub_state, StateId}) of
[State] when is_record(State, pubsub_state) -> State; [#pubsub_state{} = State] -> State;
_ -> #pubsub_state{stateid=StateId} _ -> #pubsub_state{stateid=StateId, nodeidx=NodeIdx}
end. end.
%% @spec (State) -> ok | {error, Reason} %% @spec (State) -> ok | {error, Reason}
@ -911,7 +914,7 @@ del_state(NodeIdx, JID) ->
%% ```get_items(NodeIdx, From) -> %% ```get_items(NodeIdx, From) ->
%% node_default:get_items(NodeIdx, From).'''</p> %% node_default:get_items(NodeIdx, From).'''</p>
get_items(NodeIdx, _From) -> get_items(NodeIdx, _From) ->
Items = mnesia:match_object(#pubsub_item{itemid = {'_', NodeIdx}, _ = '_'}), Items = mnesia:index_read(pubsub_item, NodeIdx, #pubsub_item.nodeidx),
{result, lists:reverse(lists:keysort(#pubsub_item.modification, Items))}. {result, lists:reverse(lists:keysort(#pubsub_item.modification, Items))}.
get_items(NodeIdx, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) -> get_items(NodeIdx, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) ->

View File

@ -136,8 +136,9 @@
options = [] options = []
}). }).
%% @type pubsubState() = {pubsub_state, StateId, Items, Affiliation, Subscriptions} %% @type pubsubState() = {pubsub_state, StateId, NodeIdx, Items, Affiliation, Subscriptions}
%% StateId = {ljid(), nodeIdx()} %% StateId = {ljid(), nodeIdx()}
%% NodeIdx = nodeIdx(),
%% Items = [itemId()] %% Items = [itemId()]
%% Affiliation = affiliation() %% Affiliation = affiliation()
%% Subscriptions = [{subscription(), subId()}]. %% Subscriptions = [{subscription(), subId()}].
@ -146,6 +147,7 @@
-record(pubsub_state, -record(pubsub_state,
{ {
stateid, stateid,
nodeidx,
items = [], items = [],
affiliation = 'none', affiliation = 'none',
subscriptions = [] subscriptions = []
@ -161,6 +163,7 @@
-record(pubsub_item, -record(pubsub_item,
{ {
itemid, itemid,
nodeidx,
creation = {'unknown','unknown'}, creation = {'unknown','unknown'},
modification = {'unknown','unknown'}, modification = {'unknown','unknown'},
payload = [] payload = []

View File

@ -160,6 +160,8 @@ create_table() ->
Other -> Other Other -> Other
end. end.
add_subscription(_JID, _NodeID, []) ->
make_subid();
add_subscription(_JID, _NodeID, Options) -> add_subscription(_JID, _NodeID, Options) ->
SubID = make_subid(), SubID = make_subid(),
mnesia:write(#pubsub_subscription{subid = SubID, options = Options}), mnesia:write(#pubsub_subscription{subid = SubID, options = Options}),
@ -174,11 +176,8 @@ read_subscription(_JID, _NodeID, SubID) ->
_ -> {error, notfound} _ -> {error, notfound}
end. end.
write_subscription(JID, NodeID, SubID, Options) -> write_subscription(_JID, _NodeID, SubID, Options) ->
case read_subscription(JID, NodeID, SubID) of mnesia:write(#pubsub_subscription{subid = SubID, options = Options}).
{error, notfound} -> {error, notfound};
Sub -> mnesia:write(Sub#pubsub_subscription{options = Options})
end.
make_subid() -> make_subid() ->
{T1, T2, T3} = now(), {T1, T2, T3} = now(),