| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/ataxia_server.erl')
| -rw-r--r-- | src/ataxia_server.erl | 136 | 
1 files changed, 136 insertions, 0 deletions
| diff --git a/src/ataxia_server.erl b/src/ataxia_server.erl new file mode 100644 index 0000000..206a6d9 --- /dev/null +++ b/src/ataxia_server.erl @@ -0,0 +1,136 @@ +-module(ataxia_server). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( +   [ +      read/4, +      remove/3, +      reserve/3, +      insert_at/5, +      insert/4, +      query/1 +   ] +). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +-spec query_transaction (shr_db_query:type()) -> 'ok'. +query_transaction (Query) -> +   DB = shr_db_query:get_database(Query), +   ID = shr_db_query:get_entry_id(Query), +   [Item] = mnesia:read(DB, ID), +   {ok, UpdatedItem} = shr_db_query:apply_to(Query, Item), + +   mnesia:write(DB, UpdatedItem, sticky_write), + +   ok. + +-spec add_new_item (atom(), ataxia_entry:type()) -> 'ok'. +add_new_item (DB, Item) -> +   ID = ataxia_entry:get_id(Item), +   [] = mnesia:read(DB, ID), + +   mnesia:write(DB, Item, sticky_write), + +   ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec read +   ( +      atom(), +      ataxic:type(), +      binary(), +      ataxia_security:user() +   ) +   -> ({'aborted', any()} | {'ok', any()} | 'not_found'). +read (ID, Selector, User, DB) -> +   case mnesia:transaction(fun mnesia:read/2, [DB, ID]) of +      {'atomic', []} -> 'not_found'; +      {'atomic', [Item]} -> +         true = +            ataxia_security:can_access +            ( +               User, +               ataxia_entry:get_read_permission(Item) +            ), +         {ok, ataxic:apply_to(Selector, ataxia_entry:get_value(Item))}; + +      Other -> {'aborted', Other} +   end. + +-spec insert_at +   ( +      atom(), +      binary(), +      ataxia_security:permission(), +      ataxia_security:permission(), +      any()) +   -> ({'aborted', any()} | 'ok'). +insert_at (DB, ID, ReadPerm, WritePerm, Value) -> +   Item = ataxia_entry:new(ID, ReadPerm, WritePerm, Value), +   case mnesia:transaction(fun add_new_item/2, [DB, Item]) of +      {'atomic', 'ok'} -> 'ok'; +      {aborted, Val} -> {aborted, Val} +   end. + +-spec insert +   ( +      atom(), +      ataxia_security:permission(), +      ataxia_security:permission(), +      any()) +   -> ({'aborted', any()} | {'ok', binary()}). +insert (DB, ReadPerm, WritePerm, Value) -> +   ID = db_item_ids_manager:allocate(DB), +   case insert_at(DB, ID, ReadPerm, WritePerm, Value) of +      {'atomic', 'ok'} -> {'ok', ID}; +      {aborted, Val} -> {aborted, Val} +   end. + +-spec query (shr_db_query:type()) -> ({'aborted', any()} | {'atomic', 'ok'}). +query (Query) -> +   mnesia:transaction(fun query_transaction/1, [Query]). + +-spec reserve +   ( +      atom(), +      binary(), +      ataxia_security:user() +   ) +   -> ({'aborted', any()} | {'atomic', 'ok'}). +reserve (DB, ID, Cred) -> +   insert_at +   ( +      DB, +      ID, +      [Cred], +      [Cred], +      { +         reserved, +         <<"?">> %% TODO [FUNCTION: db][LOW]: timestamp +      } +   ). + +-spec remove +   ( +      atom(), +      binary(), +      ataxia_security:user() +   ) +   -> ({'aborted', any()} | 'ok' | 'not_found'). +remove (_DB, _ID, _Cred) -> +   %% TODO [FUNCTION: db][MEDIUM]: unimplemented +   %% Don't forget to checkt that Cred has write access before removing the +   %% value. +   {'aborted', 'unimplemented'}. | 


