From ee9c2ac044cc77b80f30420c8f0788cad4281084 Mon Sep 17 00:00:00 2001 From: nsensfel Date: Wed, 6 Jun 2018 15:54:18 +0200 Subject: Figuring out how to organize the src folder(s)... --- src/db/Makefile | 71 ---------------------- src/db/db_node.erl | 31 ++++++++++ src/db/include/db_item.hrl | 15 ----- src/db/include/db_query.hrl | 63 -------------------- src/db/include/db_user.hrl | 7 --- src/db/logic/storage_access.erl | 54 +++++++++++++++++ src/db/mk/debug.mk | 40 ------------- src/db/mk/erlang.mk | 28 --------- src/db/mk/preprocessor.mk | 34 ----------- src/db/module.conf | 6 -- src/db/src/db_node.erl | 31 ---------- src/db/src/logic/storage_access.erl | 54 ----------------- src/db/src/struct/db_item.erl | 70 ---------------------- src/db/src/struct/db_model.erl | 71 ---------------------- src/db/src/struct/db_query.erl | 109 ---------------------------------- src/db/src/struct/db_user.erl | 28 --------- src/db/struct/db_model.erl | 71 ++++++++++++++++++++++ src/db/struct/db_query.erl | 114 ++++++++++++++++++++++++++++++++++++ 18 files changed, 270 insertions(+), 627 deletions(-) delete mode 100644 src/db/Makefile create mode 100644 src/db/db_node.erl delete mode 100644 src/db/include/db_item.hrl delete mode 100644 src/db/include/db_query.hrl delete mode 100644 src/db/include/db_user.hrl create mode 100644 src/db/logic/storage_access.erl delete mode 100644 src/db/mk/debug.mk delete mode 100644 src/db/mk/erlang.mk delete mode 100644 src/db/mk/preprocessor.mk delete mode 100644 src/db/module.conf delete mode 100644 src/db/src/db_node.erl delete mode 100644 src/db/src/logic/storage_access.erl delete mode 100644 src/db/src/struct/db_item.erl delete mode 100644 src/db/src/struct/db_model.erl delete mode 100644 src/db/src/struct/db_query.erl delete mode 100644 src/db/src/struct/db_user.erl create mode 100644 src/db/struct/db_model.erl create mode 100644 src/db/struct/db_query.erl (limited to 'src/db') diff --git a/src/db/Makefile b/src/db/Makefile deleted file mode 100644 index 206a332..0000000 --- a/src/db/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -################################################################################ -## CONFIG ###################################################################### -################################################################################ -MODULE_NAME ?= $ $(shell basename ${CURDIR}) -MODULE_PORT ?= 8002 - -DIALYZER_PLT_FILE ?= tacticians-server.plt - -## Main Directories -SRC_DIR ?= ${CURDIR}/src -CONF_DIR ?= ${CURDIR}/conf - -#### Optional Dirs -BIN_DIR ?= ${CURDIR}/ebin -INCLUDE_DIR ?= ${CURDIR}/include - -## Binaries -ERLC ?= erlc -ERLC_OPTS ?= -ERL ?= erl -ERL_OPTS ?= \ - -connect_all false \ - -name db_node \ - -pa $(BIN_DIR) \ - -run db_node start - -DIALYZER ?= dialyzer - -################################################################################ -## MAKEFILE MAGIC ############################################################## -################################################################################ -OPTIONAL_DIRS = $(BIN_DIR) $(INCLUDE_DIR) - -################################################################################ -## SANITY CHECKS ############################################################### -################################################################################ -DIALYZER_PLT_FILE ?= tacticians-server.plt - -## Main Directories -SRC_DIR ?= src -CONF_DIR ?= conf - -################################################################################ -## INCLUDES #################################################################### -################################################################################ -main_target: all - -include ${CURDIR}/mk/debug.mk -include ${CURDIR}/mk/erlang.mk -include ${CURDIR}/mk/preprocessor.mk - -################################################################################ -## TARGET RULES ################################################################ -################################################################################ -all: build - -debug: debug_run - -build: $(REQUIRED_HEADERS) $(PREPROCESSOR_RESULT) $(ERLANG_RESULT) - -run: - $(ERL) $(ERL_OPTS) - -clean: - rm -rf $(PREPROCESSOR_RESULT) $(ERLANG_RESULT) - -################################################################################ -## INTERNAL RULES ############################################################## -################################################################################ -$(OPTIONAL_DIRS): %: - mkdir -p $@ diff --git a/src/db/db_node.erl b/src/db/db_node.erl new file mode 100644 index 0000000..be295c6 --- /dev/null +++ b/src/db/db_node.erl @@ -0,0 +1,31 @@ +-module(db_node). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([start/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec wait_for_stop () -> 'ok'. +wait_for_stop () -> + receive + stop -> ok; + {ping, Pid} -> Pid ! pong; + _ -> wait_for_stop() + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec start () -> 'ok'. +start () -> + DB = db_model:new(battle_db, "/tmp/battle_db.mnesia", []), + db_model:start(DB), + wait_for_stop(), + ok. diff --git a/src/db/include/db_item.hrl b/src/db/include/db_item.hrl deleted file mode 100644 index 86d5863..0000000 --- a/src/db/include/db_item.hrl +++ /dev/null @@ -1,15 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --record -( - db_item, - { - id :: any(), - perm :: db_user:permission(), - val :: any() - } -). - --type db_item() :: #db_item{}. - diff --git a/src/db/include/db_query.hrl b/src/db/include/db_query.hrl deleted file mode 100644 index 7e5a5b0..0000000 --- a/src/db/include/db_query.hrl +++ /dev/null @@ -1,63 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --record -( - set_field, - { - field :: non_neg_integer(), - value :: any() - } -). - --record -( - add_to_field, - { - field :: non_neg_integer(), - values :: list(any()), - head :: boolean() - } -). - --record -( - update_indexed, - { - field :: non_neg_integer(), - ix :: non_neg_integer(), - ops :: list(db_query_op()) - } -). - --record -( - set_perm, - { - perm :: db_user:permission() - } -). - --record -( - set_val, - { - val :: any() - } -). - --record -( - db_query, - { - db :: atom(), - id :: any(), - user :: db_user:user(), - ops :: list(db_query_master_op()) - } -). - --type db_query_op() :: (#set_field{} | #add_to_field{} | #update_indexed{}). --type db_query_master_op() :: (db_query_op() | #set_perm{} | #set_val{}). --type db_query() :: #db_query{}. - diff --git a/src/db/include/db_user.hrl b/src/db/include/db_user.hrl deleted file mode 100644 index c5b033e..0000000 --- a/src/db/include/db_user.hrl +++ /dev/null @@ -1,7 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --type db_named_user() :: {'user', any()}. --type db_user() :: (db_named_user() | 'admin' | 'any'). --type db_permission() :: (list(db_named_user()) | 'any'). - diff --git a/src/db/logic/storage_access.erl b/src/db/logic/storage_access.erl new file mode 100644 index 0000000..437294f --- /dev/null +++ b/src/db/logic/storage_access.erl @@ -0,0 +1,54 @@ +-module(storage_access). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( + [ + read/2, + insert/4, + query/1 + ] +). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +get_value ([]) -> not_found; +get_value ([Regval]) -> {ok, db_item:get_value(Regval)}. + +read_transaction (DB, ID) -> + get_value(mnesia:read(DB, ID)). + +insert_transaction (DB, ID, Perm, Value) -> + StoredItem = db_item:new(ID, Perm, Value), + % FIXME: handle return value, mnesia:write -> (transaction abort | ok). + % FIXME: is this an atomic OP? Is the lock freed afterwards? + mnesia:write(DB, StoredItem, sticky_write), + ok. + +query_transaction (Query) -> + DB = db_query:get_database(Query), + ID = db_query:get_entry_id(Query), + [Item] = mnesia:read(DB, ID), + {ok, UpdatedItem} = db_query:apply_to(Query, Item), + % FIXME: handle return value, mnesia:write -> (transaction abort | ok). + % FIXME: is this an atomic OP? Is the lock freed afterwards? + mnesia:write(DB, UpdatedItem, sticky_write), + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +read (DB, ID) -> + mnesia:transaction(fun read_transaction/2, [DB, ID]). + +insert (DB, ID, Perm, Value) -> + mnesia:transaction(fun insert_transaction/4, [DB, ID, Perm, Value]). + +query (Query) -> + mnesia:transaction(fun query_transaction/1, [Query]). diff --git a/src/db/mk/debug.mk b/src/db/mk/debug.mk deleted file mode 100644 index bd93669..0000000 --- a/src/db/mk/debug.mk +++ /dev/null @@ -1,40 +0,0 @@ -################################################################################ -## CONFIG ###################################################################### -################################################################################ -DIALYZER_PLT_FILE ?= tacticians-server.plt -DIALYZER ?= dialyzer - -################################################################################ -## MAKEFILE MAGIC ############################################################## -################################################################################ -SRC_FILES ?= $(wildcard $(SRC_DIR)/*.erl $(SRC_DIR)/*/*.erl) - -################################################################################ -## SANITY CHECKS ############################################################### -################################################################################ - -################################################################################ -## TARGET RULES ################################################################ -################################################################################ -DEBUG_RESULT = $(DIALYZER_PLT_FILE) - -debug_rebuild: - $(MAKE) clean - $(MAKE) ERLC_OPTS=+debug_info - -################################################################################ -## INTERNAL RULES ############################################################## -################################################################################ -ifeq ($(wildcard $(DIALYZER_PLT_FILE)),) -debug_run: - $(DIALYZER) --build_plt --apps erts kernel stdlib --output_plt \ - $(DIALYZER_PLT_FILE) - $(MAKE) debug_rebuild - $(DIALYZER) --add_to_plt --plt $(DIALYZER_PLT_FILE) -r $(BIN_DIR) -else -debug_run: - $(MAKE) debug_rebuild - $(DIALYZER) --check_plt --plt $(DIALYZER_PLT_FILE) - $(DIALYZER) --get_warnings $(SRC_DIR)/*.erl $(SRC_DIR)/*/*.erl \ - --src --plt $(DIALYZER_PLT_FILE) -endif diff --git a/src/db/mk/erlang.mk b/src/db/mk/erlang.mk deleted file mode 100644 index 9150f63..0000000 --- a/src/db/mk/erlang.mk +++ /dev/null @@ -1,28 +0,0 @@ -################################################################################ -## CONFIG ###################################################################### -################################################################################ -ERLC ?= erlc -ERLC_OPTS ?= - -################################################################################ -## MAKEFILE MAGIC ############################################################## -################################################################################ -SRC_FILES ?= $(wildcard $(SRC_DIR)/*.erl $(SRC_DIR)/*/*.erl) -BIN_FILES = \ - $(patsubst %.erl,$(BIN_DIR)/%.beam,$(notdir $(SRC_FILES))) - -################################################################################ -## SANITY CHECKS ############################################################### -################################################################################ - -################################################################################ -## TARGET RULES ################################################################ -################################################################################ -ERLANG_RESULT = $(BIN_DIR) $(BIN_FILES) - -################################################################################ -## INTERNAL RULES ############################################################## -################################################################################ -.SECONDEXPANSION: -$(BIN_FILES): $(BIN_DIR)/%.beam : $$(wildcard $(SRC_DIR)/*/%.erl $(SRC_DIR)/%.erl) - $(ERLC) $(ERLC_OPTS) -o $(BIN_DIR) $< diff --git a/src/db/mk/preprocessor.mk b/src/db/mk/preprocessor.mk deleted file mode 100644 index 74f66ba..0000000 --- a/src/db/mk/preprocessor.mk +++ /dev/null @@ -1,34 +0,0 @@ -################################################################################ -## CONFIG ###################################################################### -################################################################################ -CONFIG_FILE ?= ${CURDIR}/module.conf - -################################################################################ -## MAKEFILE MAGIC ############################################################## -################################################################################ -PREPROCESSOR_FILES = $(shell find ${CURDIR} -name "*.m4") -PREPROCESSED_FILES = $(patsubst %.m4,%,$(PREPROCESSOR_FILES)) - -MAKEFILE_TO_M4 = \ - --define=__MAKEFILE_MODULE_NAME=$(MODULE_NAME) \ - --define=__MAKEFILE_MODULE_PORT=$(MODULE_PORT) \ - --define=__MAKEFILE_BIN_DIR=$(BIN_DIR) \ - --define=__MAKEFILE_INCLUDE_DIR=$(INCLUDE_DIR) - -################################################################################ -## SANITY CHECKS ############################################################### -################################################################################ -ifeq ($(wildcard $(CONFIG_FILE)),) -$(error "Missing CONFIG_FILE ($(CONFIG_FILE)).") -endif - -################################################################################ -## TARGET RULES ################################################################ -################################################################################ -PREPROCESSOR_RESULT = $(PREPROCESSED_FILES) - -################################################################################ -## INTERNAL RULES ############################################################## -################################################################################ -$(PREPROCESSED_FILES): %: $(CONFIG_FILE) %.m4 - m4 -P $^ > $@ diff --git a/src/db/module.conf b/src/db/module.conf deleted file mode 100644 index 08714a1..0000000 --- a/src/db/module.conf +++ /dev/null @@ -1,6 +0,0 @@ -m4_define(`__MODULE_NAME', `__MAKEFILE_MODULE_NAME')m4_dnl -m4_define(`__MODULE_PORT', `__MAKEFILE_MODULE_PORT')m4_dnl -m4_dnl -m4_define(`__MODULE_BIN_DIR', `__MAKEFILE_BIN_DIR')m4_dnl -m4_define(`__MODULE_INCLUDE_DIR', `__MAKEFILE_INCLUDE_DIR')m4_dnl -m4_dnl diff --git a/src/db/src/db_node.erl b/src/db/src/db_node.erl deleted file mode 100644 index be295c6..0000000 --- a/src/db/src/db_node.erl +++ /dev/null @@ -1,31 +0,0 @@ --module(db_node). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export([start/0]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec wait_for_stop () -> 'ok'. -wait_for_stop () -> - receive - stop -> ok; - {ping, Pid} -> Pid ! pong; - _ -> wait_for_stop() - end. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec start () -> 'ok'. -start () -> - DB = db_model:new(battle_db, "/tmp/battle_db.mnesia", []), - db_model:start(DB), - wait_for_stop(), - ok. diff --git a/src/db/src/logic/storage_access.erl b/src/db/src/logic/storage_access.erl deleted file mode 100644 index 437294f..0000000 --- a/src/db/src/logic/storage_access.erl +++ /dev/null @@ -1,54 +0,0 @@ --module(storage_access). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - read/2, - insert/4, - query/1 - ] -). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -get_value ([]) -> not_found; -get_value ([Regval]) -> {ok, db_item:get_value(Regval)}. - -read_transaction (DB, ID) -> - get_value(mnesia:read(DB, ID)). - -insert_transaction (DB, ID, Perm, Value) -> - StoredItem = db_item:new(ID, Perm, Value), - % FIXME: handle return value, mnesia:write -> (transaction abort | ok). - % FIXME: is this an atomic OP? Is the lock freed afterwards? - mnesia:write(DB, StoredItem, sticky_write), - ok. - -query_transaction (Query) -> - DB = db_query:get_database(Query), - ID = db_query:get_entry_id(Query), - [Item] = mnesia:read(DB, ID), - {ok, UpdatedItem} = db_query:apply_to(Query, Item), - % FIXME: handle return value, mnesia:write -> (transaction abort | ok). - % FIXME: is this an atomic OP? Is the lock freed afterwards? - mnesia:write(DB, UpdatedItem, sticky_write), - ok. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -read (DB, ID) -> - mnesia:transaction(fun read_transaction/2, [DB, ID]). - -insert (DB, ID, Perm, Value) -> - mnesia:transaction(fun insert_transaction/4, [DB, ID, Perm, Value]). - -query (Query) -> - mnesia:transaction(fun query_transaction/1, [Query]). diff --git a/src/db/src/struct/db_item.erl b/src/db/src/struct/db_item.erl deleted file mode 100644 index 0ce7630..0000000 --- a/src/db/src/struct/db_item.erl +++ /dev/null @@ -1,70 +0,0 @@ --module(db_item). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --include("../../include/db_item.hrl"). - --type type() :: db_item(). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export_type([type/0]). - --export -( - [ - new/3, - - get_id/1, - get_permission/1, - get_value/1, - - set_permission/2, - set_value/2, - - get_id_field/0, - get_record_info/0, - get_record_name/0 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec new (any(), db_user:permission(), any()) -> type(). -new (ID, Permission, Value) -> - #db_item - { - id = ID, - perm = Permission, - val = Value - }. - --spec get_id (type()) -> any(). -get_id (#db_item { id = Result }) -> Result. - --spec get_permission (type()) -> db_user:permission(). -get_permission (#db_item { perm = Result }) -> Result. - --spec get_value (type()) -> any(). -get_value (#db_item { val = Result }) -> Result. - --spec set_permission (db_user:permission(), type()) -> type(). -set_permission (Perm, Item) -> Item#db_item{ perm = Perm }. - --spec set_value (any(), type()) -> type(). -set_value (Value, Item) -> Item#db_item{ val = Value }. - --spec get_id_field () -> non_neg_integer(). -get_id_field () -> #db_item.id. - -get_record_info () -> record_info(fields, db_item). - -get_record_name () -> db_item. - diff --git a/src/db/src/struct/db_model.erl b/src/db/src/struct/db_model.erl deleted file mode 100644 index 1b21629..0000000 --- a/src/db/src/struct/db_model.erl +++ /dev/null @@ -1,71 +0,0 @@ --module(db_model). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - --record -( - db_model, - { - name :: atom(), - store_file :: string(), - neighbors :: list(node()) - } -). - --type type() :: #db_model{}. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export_type([type/0]). - --export -( - [ - new/3, - start/1 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec new (atom(), string(), list(node())) -> type(). -new (DBName, StorageFile, Neighbors) -> - #db_model - { - name = DBName, - store_file = StorageFile, - neighbors = Neighbors - }. - -start (Model) -> - DBName = Model#db_model.name, - StorageFile = Model#db_model.store_file, - Neighbors = Model#db_model.neighbors, - - ok = application:set_env(mnesia, dir, StorageFile), - case mnesia:create_schema([node()|Neighbors]) of - {error, {Name, {already_exists, Name}}} -> ok; - ok -> ok - end, - ok = mnesia:start(), - mnesia:create_table - ( - DBName, - [ - {record_name, db_item:get_record_name()}, - {attributes, db_item:get_record_info()}, - {disc_copies, [node()|Neighbors]}, - {disc_only_copies, []}, - {ram_copies, []}, - {type, ordered_set}, - {local_content, false} - ] - ). diff --git a/src/db/src/struct/db_query.erl b/src/db/src/struct/db_query.erl deleted file mode 100644 index f8ad310..0000000 --- a/src/db/src/struct/db_query.erl +++ /dev/null @@ -1,109 +0,0 @@ --module(db_query). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --include("../../include/db_query.hrl"). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - get_database/1, - get_entry_id/1 - ] -). --export([apply_to/2]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec get_user (db_query()) -> 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 = 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 = db_user:can_access(db_item:get_permission(DBItem), get_user(DBQuery)), - MOps = DBQuery#db_query.ops, - {ok, lists:foldl(fun apply_master_op_to/2, DBItem, MOps)}. - diff --git a/src/db/src/struct/db_user.erl b/src/db/src/struct/db_user.erl deleted file mode 100644 index 983013c..0000000 --- a/src/db/src/struct/db_user.erl +++ /dev/null @@ -1,28 +0,0 @@ --module(db_user). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --include("../../include/db_user.hrl"). - --type user() :: db_user(). --type permission() :: db_permission(). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export_type([user/0, permission/0]). - --export([can_access/2]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec can_access (permission(), user()) -> boolean(). -can_access (_, admin) -> true; -can_access (any, _) -> true; -can_access (List, {'user', User}) -> - lists:member(User, List). diff --git a/src/db/struct/db_model.erl b/src/db/struct/db_model.erl new file mode 100644 index 0000000..1b21629 --- /dev/null +++ b/src/db/struct/db_model.erl @@ -0,0 +1,71 @@ +-module(db_model). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +-record +( + db_model, + { + name :: atom(), + store_file :: string(), + neighbors :: list(node()) + } +). + +-type type() :: #db_model{}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export_type([type/0]). + +-export +( + [ + new/3, + start/1 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec new (atom(), string(), list(node())) -> type(). +new (DBName, StorageFile, Neighbors) -> + #db_model + { + name = DBName, + store_file = StorageFile, + neighbors = Neighbors + }. + +start (Model) -> + DBName = Model#db_model.name, + StorageFile = Model#db_model.store_file, + Neighbors = Model#db_model.neighbors, + + ok = application:set_env(mnesia, dir, StorageFile), + case mnesia:create_schema([node()|Neighbors]) of + {error, {Name, {already_exists, Name}}} -> ok; + ok -> ok + end, + ok = mnesia:start(), + mnesia:create_table + ( + DBName, + [ + {record_name, db_item:get_record_name()}, + {attributes, db_item:get_record_info()}, + {disc_copies, [node()|Neighbors]}, + {disc_only_copies, []}, + {ram_copies, []}, + {type, ordered_set}, + {local_content, false} + ] + ). 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)}. + -- cgit v1.2.3-70-g09d2