From 983ed9d0e8da15cb8c304fea62c25d3b053e712b Mon Sep 17 00:00:00 2001 From: nsensfel Date: Tue, 5 Jun 2018 14:33:27 +0200 Subject: Has the DB run as a separate node. I am still figuring out how Erlang handles node connections... It would seem that spawn(NODE, ...) automatically initiates the connection to NODE (i.e. no need to use net_kernel:connect_node before). --- src/db/Makefile | 8 +++++ src/db/src/db_node.erl | 31 ++++++++++++++++++ src/db/src/struct/db_model.erl | 71 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 src/db/src/db_node.erl create mode 100644 src/db/src/struct/db_model.erl (limited to 'src/db') diff --git a/src/db/Makefile b/src/db/Makefile index d7b6eed..206a332 100644 --- a/src/db/Makefile +++ b/src/db/Makefile @@ -17,6 +17,13 @@ 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 ################################################################################ @@ -52,6 +59,7 @@ debug: debug_run build: $(REQUIRED_HEADERS) $(PREPROCESSOR_RESULT) $(ERLANG_RESULT) run: + $(ERL) $(ERL_OPTS) clean: rm -rf $(PREPROCESSOR_RESULT) $(ERLANG_RESULT) diff --git a/src/db/src/db_node.erl b/src/db/src/db_node.erl new file mode 100644 index 0000000..be295c6 --- /dev/null +++ b/src/db/src/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/src/struct/db_model.erl b/src/db/src/struct/db_model.erl new file mode 100644 index 0000000..0f8c872 --- /dev/null +++ b/src/db/src/struct/db_model.erl @@ -0,0 +1,71 @@ +-module(db_model). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-include("../../include/db_item.hrl"). + +-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, + [ + {attributes, record_info(fields, db_item)}, + {disc_copies, [node()|Neighbors]}, + {disc_only_copies, []}, + {ram_copies, []}, + {type, ordered_set}, + {local_content, false} + ] + ). -- cgit v1.2.3-70-g09d2