diff --git a/src/sqlite3.erl b/src/sqlite3.erl index 915db59..5a33801 100644 --- a/src/sqlite3.erl +++ b/src/sqlite3.erl @@ -671,18 +671,6 @@ handle_call({bind, Ref, Params}, _From, State = #state{port = Port, refs = Refs} Index = dict:fetch(Ref, Refs), Reply = exec(Port, {bind, Index, Params}), {reply, Reply, State}; -handle_call({next, Ref}, _From, State = #state{port = Port, refs = Refs}) -> - Index = dict:fetch(Ref, Refs), - Reply = exec(Port, {next, Index}), - {reply, Reply, State}; -handle_call({reset, Ref}, _From, State = #state{port = Port, refs = Refs}) -> - Index = dict:fetch(Ref, Refs), - Reply = exec(Port, {reset, Index}), - {reply, Reply, State}; -handle_call({clear_bindings, Ref}, _From, State = #state{port = Port, refs = Refs}) -> - Index = dict:fetch(Ref, Refs), - Reply = exec(Port, {clear_bindings, Index}), - {reply, Reply, State}; handle_call({finalize, Ref}, _From, State = #state{port = Port, refs = Refs}) -> Index = dict:fetch(Ref, Refs), case exec(Port, {finalize, Index}) of @@ -694,6 +682,16 @@ handle_call({finalize, Ref}, _From, State = #state{port = Port, refs = Refs}) -> NewState = State end, {reply, Reply, NewState}; +handle_call({Cmd, Ref}, _From, State = #state{port = Port, refs = Refs}) -> + Reply = case dict:find(Ref, Refs) of + {ok, Index} -> + exec(Port, {Cmd, Index}); + error -> + {error, -1, + "Bad reference to prepared statement; it is already finalized or doesn't exist"} + end, + {reply, Reply, State}; + handle_call(_Request, _From, State) -> Reply = unknown_request, {reply, Reply, State}. diff --git a/test/sqlite3_test.erl b/test/sqlite3_test.erl index 8173132..8541e4a 100644 --- a/test/sqlite3_test.erl +++ b/test/sqlite3_test.erl @@ -165,21 +165,21 @@ select_many_records() -> N, length(rows(sqlite3:sql_exec(ct, "select * from many_records;")))). -%% note that inserts are actually serialized by gen_server -concurrent_inserts_test() -> - N = 1024, - sqlite3:open(concurrent, [in_memory]), %% doing this test not in memory is much slower! - drop_table_if_exists(concurrent, t), - sqlite3:create_table(concurrent, t, [{id0, integer}]), - Self = self(), - [spawn(fun () -> - sqlite3:write(concurrent, t, [{id0, X}]), - Self ! {finished, N} - end) || X <- lists:seq(1, N)], - loop_concurrent_inserts(N), - ?assertEqual( - N, length(rows(sqlite3:read_all(concurrent, t)))), - sqlite3:close(concurrent). +%% %% note that inserts are actually serialized by gen_server +%% concurrent_inserts_test() -> +%% N = 1024, +%% sqlite3:open(concurrent, [in_memory]), %% doing this test not in memory is much slower! +%% drop_table_if_exists(concurrent, t), +%% sqlite3:create_table(concurrent, t, [{id0, integer}]), +%% Self = self(), +%% [spawn(fun () -> +%% sqlite3:write(concurrent, t, [{id0, X}]), +%% Self ! {finished, N} +%% end) || X <- lists:seq(1, N)], +%% loop_concurrent_inserts(N), +%% ?assertEqual( +%% N, length(rows(sqlite3:read_all(concurrent, t)))), +%% sqlite3:close(concurrent). loop_concurrent_inserts(0) -> ok; @@ -213,9 +213,12 @@ prepared_test() -> sqlite3:write(prepared, user, [{name, "marge"}, {age, 30}, {wage, 2000}]), {ok, Ref} = sqlite3:prepare(prepared, "SELECT * FROM user"), ?assertEqual(Abby, sqlite3:next(prepared, Ref)), + ?assertEqual(ok, sqlite3:reset(prepared, Ref)), + ?assertEqual(Abby, sqlite3:next(prepared, Ref)), ?assertEqual(Marge, sqlite3:next(prepared, Ref)), ?assertEqual(done, sqlite3:next(prepared, Ref)), ?assertEqual(ok, sqlite3:finalize(prepared, Ref)), + ?assertMatch({error, _, _}, sqlite3:next(prepared, Ref)), sqlite3:close(prepared). % create, read, update, delete