store_kai.erl 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. -module(store_kai).
  2. -author('Maxim Sokhatsky').
  3. -copyright('Synrc Research Center s.r.o.').
  4. -include("config.hrl").
  5. -include("metainfo.hrl").
  6. -include_lib("stdlib/include/qlc.hrl").
  7. -compile(export_all).
  8. -record(data, { key, bucket, last_modified, vector_clocks, checksum, flags, value }).
  9. start() -> kai:start(), ok.
  10. stop() -> kai_store:stop(), ok.
  11. version() -> {version,"KVS KAI"}.
  12. join(_Node) -> initialize(), ok.
  13. initialize() -> ok.
  14. dir() -> [{table,T}||T<-kvs:modules()].
  15. put(Records) when is_list(Records) -> lists:foreach(fun kai_put/1, Records);
  16. put(Record) -> kai_put(Record).
  17. kai_put(Record) ->
  18. Data = #data{key = element(2,Record), bucket = table_to_num(element(1,Record)),
  19. last_modified = os:timestamp(), checksum = erlang:md5(term_to_binary(Record)),
  20. vector_clocks = vclock:fresh(), value = Record },
  21. kai_store:put(Data).
  22. update(_Record, _Object) -> ok.
  23. get(Tab, Key) ->
  24. Data = #data{key=Key,bucket=table_to_num(Tab)},
  25. kai_get(Data).
  26. kai_get(Data) ->
  27. case kai_store:get(Data) of
  28. #data{value=Value} -> {ok,Value};
  29. undefined -> {error,not_found};
  30. E -> {error,E} end.
  31. delete(Tab, Key) ->
  32. Data = #data{key=Key,bucket=table_to_num(Tab)},
  33. kai_delete(Data).
  34. kai_delete(Data) ->
  35. case kai_store:delete(Data) of
  36. ok -> ok;
  37. E -> {error,E} end.
  38. key_to_bin(Key) ->
  39. if is_integer(Key) -> erlang:list_to_binary(integer_to_list(Key));
  40. is_list(Key) -> erlang:list_to_binary(Key);
  41. is_atom(Key) -> erlang:list_to_binary(erlang:atom_to_list(Key));
  42. is_binary(Key) -> Key;
  43. true -> [ListKey] = io_lib:format("~p", [Key]), erlang:list_to_binary(ListKey) end.
  44. all(RecordName) ->
  45. {list_of_data,List} = kai_store:list(table_to_num(RecordName)),
  46. [ begin {ok,Val}=kai_get(Data),Val end || Data <- List ].
  47. all_by_index(_Tab, _IndexId, _IndexVal) -> [].
  48. table_to_num(user) -> 10;
  49. table_to_num(subscription) -> 11;
  50. table_to_num(group) -> 12;
  51. table_to_num(id_seq) -> 13;
  52. table_to_num(product) -> 14;
  53. table_to_num(acl) -> 15;
  54. table_to_num(feed) -> 16;
  55. table_to_num(entry) -> 17;
  56. table_to_num(comment) -> 18;
  57. table_to_num(Name) -> case kvs:config(kvs,table_to_num) of
  58. [] -> unknown_table;
  59. Module -> Module:table_to_num(Name) end.