store_mnesia.erl 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. -module(store_mnesia).
  2. %%-copyright('Synrc Research Center s.r.o.').
  3. -include_lib("kvs/include/config.hrl").
  4. -include_lib("kvs/include/kvs.hrl").
  5. -include_lib("kvs/include/metainfo.hrl").
  6. -include_lib("stdlib/include/qlc.hrl").
  7. -export([
  8. start/0,
  9. stop/0,
  10. destroy/0,
  11. version/0,
  12. dir/0,
  13. join/1,
  14. change_storage/2,
  15. initialize/0,
  16. index/3,
  17. get/2,
  18. put/1,
  19. delete/2,
  20. count/1,
  21. all/1,
  22. next_id/2,
  23. many/1,
  24. void/1,
  25. info/1,
  26. create_table/2,
  27. add_table_index/2,
  28. exec/1,
  29. just_one/1,
  30. add/1,
  31. remove/2,
  32. context/0
  33. ]).
  34. start() -> mnesia:start().
  35. stop() -> mnesia:stop().
  36. destroy() -> [mnesia:delete_table(T)||{_,T}<-kvs:dir()], mnesia:delete_schema([node()]), ok.
  37. version() -> {version,"KVS MNESIA"}.
  38. dir() -> [{table,T}||T<-mnesia:system_info(local_tables)].
  39. join([]) -> mnesia:change_table_copy_type(schema, node(), disc_copies), initialize();
  40. join(Node) ->
  41. mnesia:change_config(extra_db_nodes, [Node]),
  42. mnesia:change_table_copy_type(schema, node(), disc_copies),
  43. [{Tb, mnesia:add_table_copy(Tb, node(), Type)}
  44. || {Tb, [{N, Type}]} <- [{T, mnesia:table_info(T, where_to_commit)}
  45. || T <- mnesia:system_info(tables)], Node==N].
  46. change_storage(Table,Type) -> mnesia:change_table_copy_type(Table, node(), Type).
  47. initialize() ->
  48. kvs:info(?MODULE,"mnesia init.~n",[]),
  49. mnesia:create_schema([node()]),
  50. Res = [ kvs:init(store_mnesia,Module) || Module <- kvs:modules() ],
  51. mnesia:wait_for_tables([ T#table.name || T <- kvs:tables()],infinity),
  52. Res.
  53. index(Tab,Key,Value) ->
  54. Table = kvs:table(Tab),
  55. Index = string:str(Table#table.fields,[Key]),
  56. lists:flatten(many(fun() -> mnesia:index_read(Tab,Value,Index+1) end)).
  57. get(RecordName, Key) -> just_one(fun() -> mnesia:read(RecordName, Key) end).
  58. put(Records) when is_list(Records) -> void(fun() -> lists:foreach(fun mnesia:write/1, Records) end);
  59. put(Record) -> put([Record]).
  60. delete(Tab, Key) ->
  61. case mnesia:activity(context(),fun()-> mnesia:delete({Tab, Key}) end) of
  62. {aborted,Reason} -> {error,Reason};
  63. {atomic,_Result} -> ok;
  64. X -> X end.
  65. count(RecordName) -> mnesia:table_info(RecordName, size).
  66. all(R) -> lists:flatten(many(fun() -> L= mnesia:all_keys(R), [ mnesia:read({R, G}) || G <- L ] end)).
  67. next_id(RecordName, Incr) -> mnesia:dirty_update_counter({id_seq, RecordName}, Incr).
  68. many(Fun) -> case mnesia:activity(context(),Fun) of {atomic, R} -> R; {aborted, Error} -> {error, Error}; X -> X end.
  69. void(Fun) -> case mnesia:activity(context(),Fun) of {atomic, ok} -> ok; {aborted, Error} -> {error, Error}; X -> X end.
  70. info(T) -> try mnesia:table_info(T,all) catch _:_ -> [] end.
  71. create_table(Name,Options) ->
  72. X = mnesia:create_table(Name, Options),
  73. kvs:info(?MODULE,"Create table ~p ~nOptions ~p~nReturn ~p~n",[Name, Options,X]),
  74. X.
  75. add_table_index(Record, Field) -> mnesia:add_table_index(Record, Field).
  76. exec(Q) -> F = fun() -> qlc:e(Q) end, {atomic, Val} = mnesia:activity(context(),F), Val.
  77. just_one(Fun) ->
  78. case mnesia:activity(context(),Fun) of
  79. {atomic, []} -> {error, not_found};
  80. {atomic, [R]} -> {ok, R};
  81. {atomic, [_|_]} -> {error, duplicated};
  82. [] -> {error, not_found};
  83. [R] -> {ok,R};
  84. [_|_] -> {error, duplicated};
  85. Error -> Error end.
  86. add(Record) -> mnesia:activity(context(),fun() -> kvs:append(Record,#kvs{mod=?MODULE}) end).
  87. remove(Record,Id) -> mnesia:activity(context(),fun() -> kvs:takeoff(Record,Id,#kvs{mod=?MODULE}) end).
  88. context() -> kvs:config(kvs,mnesia_context,async_dirty).