table() = atom(nonempty,nonundefined); key() = binary(); %% ts = timestamp = usually an int64: time_t * 1000000 + usecs ts() = integer(); val() = binary(); exp_time() = time_t(); flags_list() = [do_op_flag()]; do_op_flag() = {testset, ts()} | witness | get_all_attribs | %% Flags for get_many {max_num, integer()} | {binary_prefix, binary()} | must_exist | must_not_exist | value_in_ram | ....
add() = {add, key(), ts(), val(), exp_time(), flags_list()}; replace() = {replace, key(), ts(), val(), exp_time(), flags_list()}; set() = {set, key(), ts(), val(), exp_time(), flags_list()}; add_res() = do1_res_ok() | do1_res_fail(); do1_res_ok() = ok | key_not_exist | {ok, ts()} | {ok, ts(), val()} | .... do1_res_fail() = {key_exists, ts()} | key_not_exist | {ts_error, ts()} | invalid_flag_present | %% The responsible brick is unavailable/crashed/whatever. brick_not_available;
get() = {get, key(), flags_list()}; get_many() = {get_many, key(), flags_list()}; get_res() = key_not_exist | {ok, ts()} | {ok, ts(), val()} | {ok, ts(), val(), time_t(), flags_list()} .... get_many_res() = {ok, {[{key(), ts()}], boolean()}} | {ok, {[{key(), ts(), flags_list()}], boolean()}} | {ok, {[{key(), ts(), val(), time_t(), flags_list()}], boolean()}} |
CREATE TABLE foo ( BLOB key; BLOB value; INTEGER timestamp; INTEGER expiration_time; -- 0 = no expiry ERLANG_PROPERTY_LIST proplist; -- Usually empty ) UNIQUE PRIMARY KEY key;
[txn, {op = replace, key = "string1", value = "Hello, world!"}, {op = delete, key = "string4"} ]
[txn, {op = replace, key = "string1", value = "Hello, world!"}, {op = delete, key = "string2"} ]
Sample key | Data stored in value blob |
/42/1 | Text of post #1 |
/42/1/1 | Text of comment #1 on post #1 |
/42/1/2 | Text of comment #2 on post #1 |
/42/2 | Text of post #2 |
/42/summary | Next post number, number of active posts, number of deleted posts, . . . |
add_new_post(UserID, PostText) -> Prefix = "/" ++ integer_to_list(UserID) ++ "/", MetaKey = Prefix ++ "summary", {ok, OldTS, OldVal} = brick_simple:get(posts, MetaKey), #post{next_id = NextID, active = Active} = OldMeta = binary_to_term(OldVal), PostKey = Prefix ++ integer_to_list(NextID), NewMeta = OldMeta#post{next_id = NextID + 1, active = Active + 1}, %% replace op: Abort if the key does not exist %% or if current timestamp /= OldTS. %% add op: Abort if the key already exists. Txn = [brick_server:make_txn(), brick_server:make_replace(MetaKey, term_to_binary(NewMeta), 0, [{testset, OldTS}]), brick_server:make_add(PostKey, PostText)], [ok, ok] = brick_simple:do(posts, Txn).