summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2018-12-12 16:57:44 +0100
committernsensfel <SpamShield0@noot-noot.org>2018-12-12 16:57:44 +0100
commit7ff80825a16b91ef2c0374776f0d140068153d0b (patch)
treeaacbcb41435790e429417eb43813205378c3e2b5 /src
Moving TO's DB system to its own repository.
Diffstat (limited to 'src')
-rw-r--r--src/ataxia_client.erl158
-rw-r--r--src/ataxia_entry.erl96
-rw-r--r--src/ataxia_security.erl36
3 files changed, 290 insertions, 0 deletions
diff --git a/src/ataxia_client.erl b/src/ataxia_client.erl
new file mode 100644
index 0000000..f1b96e1
--- /dev/null
+++ b/src/ataxia_client.erl
@@ -0,0 +1,158 @@
+-module(ataxia_client).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export
+(
+ [
+ insert_at/5,
+ insert/4,
+ remove/3,
+ fetch/3,
+ reserve/3,
+ commit/1
+ ]
+).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec get_debug_db_node () -> node().
+get_debug_db_node () -> list_to_atom("db_node@" ++ net_adm:localhost()).
+
+-spec get_random_db_node () -> node().
+get_random_db_node () ->
+ get_debug_db_node().
+
+-spec get_db_node_for (binary()) -> node().
+get_db_node_for (_ObjectID) ->
+ get_debug_db_node().
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec insert_at
+ (
+ atom(),
+ binary(),
+ ataxia_security:permission(),
+ ataxia_security:permission(),
+ any()
+ )
+ -> 'ok'.
+insert_at (DB, ObjectID, ReadPerm, WritePerm, Value) ->
+ DBNode = get_db_node_for(ObjectID),
+
+ {atomic, _} =
+ rpc:call
+ (
+ DBNode,
+ db_access,
+ insert_at,
+ [DB, ObjectID, ReadPerm, WritePerm, Value]
+ ),
+
+ io:format
+ (
+ "~nshr_database:insert_at(~p) ! ~p -> ok.~n",
+ [{DB, ObjectID, ReadPerm, WritePerm, Value}, DBNode]
+ ),
+
+ ok.
+
+-spec insert
+ (
+ atom(),
+ ataxia_security:permission(),
+ ataxia_security:permission(),
+ any()
+ )
+ -> {'ok', binary()}.
+insert (DB, ReadPerm, WritePerm, Value) ->
+ DBNode = get_random_db_node(),
+
+ {atomic, {ok, ID}} =
+ rpc:call(DBNode, db_access, insert, [DB, ReadPerm, WritePerm, Value]),
+
+ io:format
+ (
+ "~nshr_database:insert(~p) ! ~p -> ok.~n",
+ [{DB, ReadPerm, WritePerm, Value}, DBNode]
+ ),
+
+ {ok, ID}.
+
+-spec fetch
+ (
+ atom(),
+ binary(),
+ ataxia_security:user()
+ )
+ -> ({'ok', any()} | 'not_found').
+fetch (DB, ObjectID, Cred) ->
+ DBNode = get_db_node_for(ObjectID),
+
+ {atomic, Reply} = rpc:call(DBNode, db_access, read, [DB, ObjectID, Cred]),
+
+ io:format
+ (
+ "~nshr_database:fetch(~p) ! ~p -> ~p.~n",
+ [{DB, ObjectID, Cred}, DBNode, Reply]
+ ),
+
+ Reply.
+
+-spec commit (shr_db_query:type()) -> 'ok'.
+commit (Query) ->
+ DBNode = get_db_node_for(shr_db_query:get_entry_id(Query)),
+
+ {atomic, ok} = rpc:call(DBNode, db_access, query, [Query]),
+
+ io:format("~nshr_database:commit(~p) ! ~p -> ok.~n", [Query, DBNode]),
+
+ ok.
+
+-spec remove
+ (
+ atom(),
+ binary(),
+ ataxia_security:user()
+ )
+ -> ('ok' | 'not_found').
+remove (DB, ObjectID, Cred) ->
+ DBNode = get_db_node_for(ObjectID),
+
+ {atomic, _} = rpc:call(DBNode, db_access, remove, [DB, ObjectID, Cred]),
+
+ io:format
+ (
+ "~nshr_database:remove(~p) ! ~p -> ok.~n",
+ [{DB, ObjectID, Cred}, DBNode]
+ ),
+
+ ok.
+
+-spec reserve
+ (
+ atom(),
+ binary(),
+ ataxia_security:user()
+ )
+ -> ('ok' | 'not_found').
+reserve (DB, ObjectID, Cred) ->
+ DBNode = get_db_node_for(ObjectID),
+
+ {atomic, _} = rpc:call(DBNode, db_access, reserve, [DB, ObjectID, Cred]),
+
+ io:format
+ (
+ "~nshr_database:reserve(~p) ! ~p -> ok.~n",
+ [{DB, ObjectID, Cred}, DBNode]
+ ),
+
+ ok.
diff --git a/src/ataxia_entry.erl b/src/ataxia_entry.erl
new file mode 100644
index 0000000..a0a48e2
--- /dev/null
+++ b/src/ataxia_entry.erl
@@ -0,0 +1,96 @@
+-module(ataxia_entry).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-record
+(
+ entry,
+ {
+ id :: any(),
+ read_perm :: ataxia_security:permission(),
+ write_perm :: ataxia_security:permission(),
+ lock :: ataxia_security:lock(),
+ val :: any()
+ }
+).
+
+-type type() :: #entry{}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export_type([type/0]).
+
+-export
+(
+ [
+ new/4,
+
+ get_id/1,
+ get_read_permission/1,
+ get_write_permission/1,
+ get_value/1,
+
+ set_read_permission/2,
+ set_write_permission/2,
+ set_value/2,
+
+ get_id_field/0,
+ get_record_info/0,
+ get_record_name/0
+ ]
+).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec new
+ (
+ any(),
+ ataxia_security:permission(),
+ ataxia_security:permission(),
+ any()
+ ) -> type().
+new (ID, ReadPermission, WritePermission, Value) ->
+ #entry
+ {
+ id = ID,
+ read_perm = ReadPermission,
+ write_perm = WritePermission,
+ lock = ataxia_security:unlocked(),
+ val = Value
+ }.
+
+-spec get_id (type()) -> any().
+get_id (#entry { id = Result }) -> Result.
+
+-spec get_read_permission (type()) -> ataxia_security:permission().
+get_read_permission (#entry { read_perm = Result }) -> Result.
+
+-spec get_write_permission (type()) -> ataxia_security:permission().
+get_write_permission (#entry { write_perm = Result }) -> Result.
+
+-spec get_value (type()) -> any().
+get_value (#entry { val = Result }) -> Result.
+
+-spec set_read_permission (ataxia_security:permission(), type()) -> type().
+set_read_permission (Perm, Item) -> Item#entry{ read_perm = Perm }.
+
+-spec set_write_permission (ataxia_security:permission(), type()) -> type().
+set_write_permission (Perm, Item) -> Item#entry{ write_perm = Perm }.
+
+-spec set_value (any(), type()) -> type().
+set_value (Value, Item) -> Item#entry{ val = Value }.
+
+-spec get_id_field () -> non_neg_integer().
+get_id_field () -> #entry.id.
+
+get_record_info () -> record_info(fields, entry).
+
+get_record_name () -> entry.
+
diff --git a/src/ataxia_security.erl b/src/ataxia_security.erl
new file mode 100644
index 0000000..6fbc7d1
--- /dev/null
+++ b/src/ataxia_security.erl
@@ -0,0 +1,36 @@
+-module(ataxia_security).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-type named_user() :: {'user', any()}.
+-type user() :: (named_user() | 'admin' | 'any' | 'janitor').
+-type permission() :: (list(named_user()) | 'any' | 'janitor').
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export_type([user/0, permission/0]).
+
+-export([can_access/2, user_from_id/1]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec user_from_id (any()) -> user().
+user_from_id (ID) -> {user, ID}.
+
+-spec can_access (permission(), user()) -> boolean().
+can_access (_, admin) -> true;
+can_access (any, _) -> true;
+can_access (janitor, janitor) -> true;
+can_access (List, {user, User}) ->
+ lists:member({user, User}, List);
+can_access (List, janitor) ->
+ lists:member(janitor, List);
+can_access (List, User) ->
+ can_access(List, {user, User}).