summaryrefslogtreecommitdiff
blob: 9a86f983009e6edb1624fd7b3d1c8f471e31bbe7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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)}.