From cc76b4319f55f3485770958cb78f641d8538bf33 Mon Sep 17 00:00:00 2001 From: Maas-Maarten Zeeman Date: Sat, 21 May 2022 22:58:22 +0200 Subject: [PATCH] Fixed returning ok and errors for prepare and exec --- c_src/esqlite3_nif.c | 122 +++--------------------------------------- test/esqlite_test.erl | 26 ++++----- 2 files changed, 20 insertions(+), 128 deletions(-) diff --git a/c_src/esqlite3_nif.c b/c_src/esqlite3_nif.c index e964d25..b76c9d2 100644 --- a/c_src/esqlite3_nif.c +++ b/c_src/esqlite3_nif.c @@ -280,7 +280,7 @@ make_extended_error_tuple(ErlNifEnv *env, int code) { /* internal use only */ return make_two_atom_tuple(env, "ok", "symlink"); default: - return make_two_atom_tuple(env, "error", "unknown"); + return make_two_atom_tuple(env, "error", enif_make_int(env, code)); } } @@ -926,7 +926,7 @@ esqlite_prepare(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) unsigned int prep_flags; if(!enif_get_uint(env, argv[2], &prep_flags)) { - return make_error_tuple(env, "invalid_chunk_size"); + return enif_make_badarg(env); } stmt = enif_alloc_resource(esqlite3_stmt_type, sizeof(esqlite3_stmt)); @@ -984,38 +984,6 @@ set_update_hook(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) */ -/* - * Count the nr of changes of last statement -static ERL_NIF_TERM -esqlite_changes(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) -{ - esqlite3 *db; - esqlite_command *cmd = NULL; - ErlNifPid pid; - - if(argc != 3) - return enif_make_badarg(env); - if(!enif_get_resource(env, argv[0], esqlite3_type, (void **) &db)) - return enif_make_badarg(env); - if(!enif_is_ref(env, argv[1])) - return make_error_tuple(env, "invalid_ref"); - if(!enif_get_local_pid(env, argv[2], &pid)) - return make_error_tuple(env, "invalid_pid"); - - cmd = command_create(); - if(!cmd) - return make_error_tuple(env, "command_create_failed"); - - // command - cmd->type = cmd_changes; - cmd->ref = enif_make_copy(cmd->env, argv[1]); - cmd->pid = pid; - - return push_command(env, db, cmd); -} - */ - - /* * Bind a variable to a prepared statement static ERL_NIF_TERM @@ -1052,87 +1020,6 @@ esqlite_bind(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) } */ -/* - * Multi step to a prepared statement -static ERL_NIF_TERM -esqlite_multi_step(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) -{ - esqlite3 *conn; - esqlite3_stmt *stmt; - esqlite_command *cmd = NULL; - ErlNifPid pid; - int chunk_size = 0; - - if(argc != 5) - return enif_make_badarg(env); - - if(!enif_get_resource(env, argv[0], esqlite3_type, (void **) &conn)) - return enif_make_badarg(env); - - if(!enif_get_resource(env, argv[1], esqlite3_stmt_type, (void **) &stmt)) - return enif_make_badarg(env); - - if(!enif_get_int(env, argv[2], &chunk_size)) - return make_error_tuple(env, "invalid_chunk_size"); - - if(!enif_is_ref(env, argv[3])) - return make_error_tuple(env, "invalid_ref"); - - if(!enif_get_local_pid(env, argv[4], &pid)) - return make_error_tuple(env, "invalid_pid"); - - if(!stmt->statement) - return make_error_tuple(env, "no_prepared_statement"); - - cmd = command_create(); - if(!cmd) - return make_error_tuple(env, "command_create_failed"); - - cmd->type = cmd_multi_step; - cmd->ref = enif_make_copy(cmd->env, argv[3]); - cmd->pid = pid; - cmd->stmt = enif_make_copy(cmd->env, argv[1]); - cmd->arg = enif_make_copy(cmd->env, argv[2]); - - return push_command(env, conn, cmd); -} - */ - -/* - * Reset a prepared statement to its initial state -static ERL_NIF_TERM -esqlite_reset(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) -{ - esqlite3 *conn; - esqlite3_stmt *stmt; - esqlite_command *cmd = NULL; - ErlNifPid pid; - - if(argc != 4) - return enif_make_badarg(env); - if(!enif_get_resource(env, argv[0], esqlite3_type, (void **) &conn)) - return enif_make_badarg(env); - if(!enif_get_resource(env, argv[1], esqlite3_stmt_type, (void **) &stmt)) - return enif_make_badarg(env); - if(!enif_is_ref(env, argv[2])) - return make_error_tuple(env, "invalid_ref"); - if(!enif_get_local_pid(env, argv[3], &pid)) - return make_error_tuple(env, "invalid_pid"); - if(!stmt->statement) - return make_error_tuple(env, "no_prepared_statement"); - - cmd = command_create(); - if(!cmd) - return make_error_tuple(env, "command_create_failed"); - - cmd->type = cmd_reset; - cmd->ref = enif_make_copy(cmd->env, argv[2]); - cmd->pid = pid; - cmd->stmt = enif_make_copy(cmd->env, argv[1]); - - return push_command(env, conn, cmd); -} - */ /* * Get the column names of the prepared statement. @@ -1411,7 +1298,10 @@ esqlite_reset(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) } int rc = sqlite3_reset(stmt->statement); - return make_sqlite3_error_tuple(env, rc); + if(rc != SQLITE_OK) { + return make_sqlite3_error_tuple(env, rc); + } + return make_atom(env, "ok"); } diff --git a/test/esqlite_test.erl b/test/esqlite_test.erl index 9073427..1dfc544 100644 --- a/test/esqlite_test.erl +++ b/test/esqlite_test.erl @@ -22,19 +22,15 @@ close_test() -> %% Double close should also work. ok = esqlite3:close(C), - ok. - - %% Check if functions still return sensible values. % {error, closed} = esqlite3:set_update_hook(self(), C), -% {error, closed} = esqlite3:changes(C), -% {error, closed} = esqlite3:get_autocommit(C), -% {error, closed} = esqlite3:last_insert_rowid(C), + {error, closed} = esqlite3:changes(C), + {error, closed} = esqlite3:get_autocommit(C), + {error, closed} = esqlite3:last_insert_rowid(C), -% {error, _} = esqlite3:exec("create table test(one, two, three)", C), - -% ok. + ?assertEqual({error, {misuse, invoked_incorrectly}}, esqlite3:exec(C, "create table test(one, two, three)")), + ok. prepare_test() -> {ok, C} = esqlite3:open(":memory:"), @@ -45,9 +41,7 @@ prepare_test() -> prepare_after_close_test() -> {ok, C} = esqlite3:open(":memory:"), ?assertEqual(ok, esqlite3:close(C)), - - ?assertMatch({error, {misuse, _}}, esqlite3:prepare(C, "select 1")), - + ?assertMatch({error, {misuse, invoked_incorrectly}}, esqlite3:prepare(C, "select 1")), ok. column_names_test() -> @@ -119,13 +113,21 @@ open_multiple_different_databases_test() -> get_autocommit_test() -> {ok, Db} = esqlite3:open(":memory:"), + + %% By default, the database is in autocommit mode + true = esqlite3:get_autocommit(Db), ok = esqlite3:exec(Db, "CREATE TABLE test (id INTEGER PRIMARY KEY, val STRING);"), true = esqlite3:get_autocommit(Db), + + %% After a begin statement, the connection will not be in autocommit mode anymore ok = esqlite3:exec(Db, "BEGIN;"), false = esqlite3:get_autocommit(Db), ok = esqlite3:exec(Db, "INSERT INTO test (val) VALUES ('this is a test');"), ok = esqlite3:exec(Db, "COMMIT;"), + + %% After a commit statement, the connection will be in autocommit mode true = esqlite3:get_autocommit(Db), + ok. last_insert_rowid_test() ->