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.