[Erlang Systems]

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.


Copyright © 1991-98 Ericsson Telecom AB