Allow temporary and in-memory databases

This commit is contained in:
Alexey Romanov
2010-11-18 14:06:04 +03:00
parent fca4596295
commit 466e0332f4
2 changed files with 24 additions and 10 deletions

View File

@@ -8,7 +8,7 @@ compile:
$(REBAR_COMPILE) $(REBAR_COMPILE)
test: test:
$(REBAR_COMPILE) skip_deps=true eunit $(REBAR) eunit
clean: clean:
-rm -rf deps ebin priv doc/* .eunit c_src/*.o -rm -rf deps ebin priv doc/* .eunit c_src/*.o

View File

@@ -57,7 +57,7 @@
-spec start_link(atom()) -> result(). -spec start_link(atom()) -> result().
start_link(Db) -> start_link(Db) ->
open(Db, [{db, "./" ++ atom_to_list(Db) ++ ".db"}]). open(Db, []).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% @spec start_link(Db :: atom(), Options) -> {ok, Pid :: pid()} | ignore | {error, Error} %% @spec start_link(Db :: atom(), Options) -> {ok, Pid :: pid()} | ignore | {error, Error}
@@ -75,11 +75,7 @@ start_link(Db) ->
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
-spec start_link(atom(), [{atom(), any()}]) -> result(). -spec start_link(atom(), [{atom(), any()}]) -> result().
start_link(Db, Options) -> start_link(Db, Options) ->
Opts = case proplists:get_value(db, Options) of open(Db, Options).
undefined -> [{db, "./" ++ atom_to_list(Db) ++ ".db"} | Options];
_ -> Options
end,
open(Db, Opts).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% @spec open(Db :: atom()) -> {ok, Pid :: pid()} | ignore | {error, Error} %% @spec open(Db :: atom()) -> {ok, Pid :: pid()} | ignore | {error, Error}
@@ -93,7 +89,7 @@ start_link(Db, Options) ->
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
-spec open(atom()) -> result(). -spec open(atom()) -> result().
open(Db) -> open(Db) ->
open(Db, [{db, "./" ++ atom_to_list(Db) ++ ".db"}]). open(Db, []).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% @spec open(Db :: atom(), Options :: [{atom(), any()}]) -> {ok, Pid :: pid()} | ignore | {error, Error} %% @spec open(Db :: atom(), Options :: [{atom(), any()}]) -> {ok, Pid :: pid()} | ignore | {error, Error}
@@ -109,7 +105,24 @@ open(Db) ->
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
-spec open(atom(), [{atom(), any()}]) -> result(). -spec open(atom(), [{atom(), any()}]) -> result().
open(Db, Options) -> open(Db, Options) ->
gen_server:start_link({local, Db}, ?MODULE, Options, []). Opts = case proplists:lookup(db, Options) of
none ->
DbName = case proplists:is_defined(temporary, Options) of
true ->
"";
false ->
case proplists:is_defined(in_memory, Options) of
true ->
":memory:";
false ->
"./" ++ atom_to_list(Db) ++ ".db"
end
end,
[{db, DbName} | Options];
{db, _} ->
Options
end,
gen_server:start_link({local, Db}, ?MODULE, Opts, []).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% @spec close(Db :: atom()) -> ok %% @spec close(Db :: atom()) -> ok
@@ -520,9 +533,11 @@ value_to_sql(X) -> sqlite3_lib:value_to_sql(X).
-spec init([any()]) -> {'ok', #state{}} | {'stop', string()}. -spec init([any()]) -> {'ok', #state{}} | {'stop', string()}.
init(Options) -> init(Options) ->
Dbase = proplists:get_value(db, Options), Dbase = proplists:get_value(db, Options),
io:format(user, "Dbase: ~p", [Dbase]),
PrivDir = get_priv_dir(), PrivDir = get_priv_dir(),
case erl_ddll:load(PrivDir, atom_to_list(?DRIVER_NAME)) of case erl_ddll:load(PrivDir, atom_to_list(?DRIVER_NAME)) of
ok -> ok ->
io:format(user, "~p", [create_port_cmd(Dbase)]),
Port = open_port({spawn, create_port_cmd(Dbase)}, [binary]), Port = open_port({spawn, create_port_cmd(Dbase)}, [binary]),
{ok, #state{port = Port, ops = Options}}; {ok, #state{port = Port, ops = Options}};
{error, Error} -> {error, Error} ->
@@ -787,5 +802,4 @@ build_primary_key_constraint(Tail, Acc) ->
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
-ifdef(TEST). -ifdef(TEST).
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
-endif. -endif.