10 Appendix C: The Activity Access Call Back Interface
10.1 mnesia_access callback behavior
-module(mnesia_frag).
-author('hakan@erix.ericsson.se').
-behaviour(mnesia_access).
%% Callback functions which provides transparent
%% access of fragmented tables from any activity
%% access context.
lock(ActivityId, Opaque, LockItem, LockKind) ->
mnesia:lock(ActivityId, Opaque, LockItem, LockKind).
write(ActivityId, Opaque, Tab, Rec, LockKind) ->
Key = element(2, Rec),
Frag = key_to_frag_name(Tab, Key),
mnesia:write(ActivityId, Opaque, Frag, Rec, LockKind).
delete(ActivityId, Opaque, Tab, Key, LockKind) ->
Frag = key_to_frag_name(Tab, Key),
mnesia:delete(ActivityId, Opaque, Frag, Key, LockKind).
delete_object(ActivityId, Opaque, Tab, Rec, LockKind) ->
Key = element(2, Rec),
Frag = key_to_frag_name(Tab, Key),
mnesia:delete_object(ActivityId, Opaque, Frag, Rec, LockKind).
read(ActivityId, Opaque, Tab, Key, LockKind) ->
Frag = key_to_frag_name(Tab, Key),
mnesia:read(ActivityId, Opaque, Frag, Key, LockKind).
match_object(ActivityId, Opaque, Tab, Pat, LockKind) ->
Match = [mnesia:match_object(ActivityId, Opaque, Frag, Pat, LockKind)
|| Frag <- frag_names(Tab)],
lists:flatten(Match).
all_keys(ActivityId, Opaque, Tab, LockKind) ->
Match = [mnesia:all_keys(ActivityId, Opaque, Frag, LockKind)
|| Frag <- frag_names(Tab)],
lists:flatten(Match).
index_match_object(ActivityId, Opaque, Tab, Pat, Attr, LockKind) ->
Match =
[mnesia:index_match_object(ActivityId, Opaque, Frag, Pat, Attr, LockKind)
|| Frag <- frag_names(Tab)],
lists:flatten(Match).
index_read(ActivityId, Opaque, Tab, Key, Attr, LockKind) ->
Match =
[mnesia:index_read(ActivityId, Opaque, Frag, Key, Attr, LockKind)
|| Frag <- frag_names(Tab)],
lists:flatten(Match).
table_info(ActivityId, Opaque, {Tab, Key}, Item) ->
Frag = key_to_frag_name(Tab, Key),
table_info2(ActivityId, Opaque, Tab, Frag, Item);
table_info(ActivityId, Opaque, Tab, Item) ->
table_info2(ActivityId, Opaque, Tab, Tab, Item).
table_info2(ActivityId, Opaque, Tab, Frag, Item) ->
case Item of
n_fragments ->
FH = lookup_fragment_hash(Tab),
FH#mnesia_fragment_hash.n_fragments;
n_replicas ->
F = lookup_fragment(Tab),
F#mnesia_fragment.n_replicas;
node_pool ->
F = lookup_fragment(Tab),
F#mnesia_fragment.node_pool;
size ->
Sizes = [mnesia:table_info(ActivityId, Opaque, F, Item)
|| F <- frag_names(Tab)],
lists:sum(Sizes);
memory ->
Memories = [mnesia:table_info(ActivityId, Opaque, F, Item)
|| F <- frag_names(Tab)],
lists:sum(Memories);
fragments ->
frag_names(Tab);
distribution ->
frag_distribution(Tab);
_ ->
mnesia:table_info(ActivityId, Opaque, Frag, Item)
end.