| summaryrefslogtreecommitdiff | 
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2018-06-06 15:54:18 +0200 | 
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2018-06-06 15:54:18 +0200 | 
| commit | ee9c2ac044cc77b80f30420c8f0788cad4281084 (patch) | |
| tree | 6ce9c45b6c0f0c556839b6f462f84eab06e26594 /src/db/struct/db_query.erl | |
| parent | 97f7511e61cebae3676a83aa9c0dc2efb15d8d8c (diff) | |
Figuring out how to organize the src folder(s)...
Diffstat (limited to 'src/db/struct/db_query.erl')
| -rw-r--r-- | src/db/struct/db_query.erl | 114 | 
1 files changed, 114 insertions, 0 deletions
diff --git a/src/db/struct/db_query.erl b/src/db/struct/db_query.erl new file mode 100644 index 0000000..9a86f98 --- /dev/null +++ b/src/db/struct/db_query.erl @@ -0,0 +1,114 @@ +-module(db_query). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-include("../../shared/include/db_query.hrl"). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( +   [ +      get_database/1, +      get_entry_id/1 +   ] +). +-export([apply_to/2]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_user (db_query()) -> sh_db_user:user(). +get_user (#db_query{ user = Result }) -> Result. + +-spec apply_update_indexed (#update_indexed{}, any()) -> any(). +apply_update_indexed (Op, Elem) -> +   FieldNumber = Op#update_indexed.field, +   IX = Op#update_indexed.ix, +   Ops = Op#update_indexed.ops, + +   IndexedFieldValue = element(FieldNumber, Elem), +   ArrayValue = array:get(IX, IndexedFieldValue), +   UpdatedArrayValue = lists:foldl(fun apply_op_to/2, ArrayValue, Ops), +   UpdatedIndexedFieldValue = +      array:set(IX, UpdatedArrayValue, IndexedFieldValue), + +   setelement(FieldNumber, Elem, UpdatedIndexedFieldValue). + +-spec apply_add_to_field (#add_to_field{}, any()) -> any(). +apply_add_to_field (Op, Elem) -> +   FieldNumber = Op#add_to_field.field, +   NewValues = Op#add_to_field.values, +   AddToHead = Op#add_to_field.head, + +   CurrentValues = element(FieldNumber, Elem), +   UpdatedValues = +      case AddToHead of +         true -> (NewValues ++ CurrentValues); +         _ -> (CurrentValues ++ NewValues) +      end, + +   setelement(FieldNumber, Elem, UpdatedValues). + +-spec apply_set_field (#set_field{}, any()) -> any(). +apply_set_field (Op, Elem) -> +   FieldNumber = Op#set_field.field, +   NewValue = Op#set_field.value, + +   setelement(FieldNumber, Elem, NewValue). + +-spec apply_op_to (db_query_op(), any()) -> any(). +apply_op_to (Op, Elem) when is_record(Op, set_field) -> +   apply_set_field(Op, Elem); +apply_op_to (Op, Elem) when is_record(Op, add_to_field) -> +   apply_add_to_field(Op, Elem); +apply_op_to (Op, Elem) when is_record(Op, update_indexed) -> +   apply_update_indexed(Op, Elem). + +-spec apply_master_op_to +   ( +      db_query_master_op(), +      db_item:type() +   ) +   -> db_item:type(). +apply_master_op_to (MOp, Elem) when is_record(MOp, set_perm) -> +   NewPerm = MOp#set_perm.perm, + +   db_item:set_perm(NewPerm, Elem); +apply_master_op_to (MOp, Elem) when is_record(MOp, set_val) -> +   NewVal = MOp#set_val.val, + +   db_item:set_value(NewVal, Elem); +apply_master_op_to (MOp, Elem) -> +   OldValue = sh_db_item:get_value(Elem), +   NewValue = apply_op_to(MOp, OldValue), + +   db_item:set_value(NewValue, Elem). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_database (db_query()) -> atom(). +get_database (#db_query{ db = Result }) -> Result. + +-spec get_entry_id (db_query()) -> any(). +get_entry_id (#db_query{ id = Result }) -> Result. + +-spec apply_to +   ( +      db_query(), +      db_item:type() +   ) +   -> ({'ok', db_item:type()} | 'error'). +apply_to (DBQuery, DBItem) -> +   true = +      sh_db_user:can_access +      ( +         sh_db_item:get_permission(DBItem), +         get_user(DBQuery) +      ), +   MOps = DBQuery#db_query.ops, +   {ok, lists:foldl(fun apply_master_op_to/2, DBItem, MOps)}. +  | 


