Fixed returning ok and errors for prepare and exec
This commit is contained in:
@@ -280,7 +280,7 @@ make_extended_error_tuple(ErlNifEnv *env, int code) {
|
|||||||
/* internal use only */
|
/* internal use only */
|
||||||
return make_two_atom_tuple(env, "ok", "symlink");
|
return make_two_atom_tuple(env, "ok", "symlink");
|
||||||
default:
|
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;
|
unsigned int prep_flags;
|
||||||
if(!enif_get_uint(env, argv[2], &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));
|
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
|
* Bind a variable to a prepared statement
|
||||||
static ERL_NIF_TERM
|
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.
|
* 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);
|
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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -22,19 +22,15 @@ close_test() ->
|
|||||||
%% Double close should also work.
|
%% Double close should also work.
|
||||||
ok = esqlite3:close(C),
|
ok = esqlite3:close(C),
|
||||||
|
|
||||||
ok.
|
|
||||||
|
|
||||||
|
|
||||||
%% Check if functions still return sensible values.
|
%% Check if functions still return sensible values.
|
||||||
% {error, closed} = esqlite3:set_update_hook(self(), C),
|
% {error, closed} = esqlite3:set_update_hook(self(), C),
|
||||||
% {error, closed} = esqlite3:changes(C),
|
{error, closed} = esqlite3:changes(C),
|
||||||
% {error, closed} = esqlite3:get_autocommit(C),
|
{error, closed} = esqlite3:get_autocommit(C),
|
||||||
% {error, closed} = esqlite3:last_insert_rowid(C),
|
{error, closed} = esqlite3:last_insert_rowid(C),
|
||||||
|
|
||||||
% {error, _} = esqlite3:exec("create table test(one, two, three)", C),
|
?assertEqual({error, {misuse, invoked_incorrectly}}, esqlite3:exec(C, "create table test(one, two, three)")),
|
||||||
|
|
||||||
% ok.
|
|
||||||
|
|
||||||
|
ok.
|
||||||
|
|
||||||
prepare_test() ->
|
prepare_test() ->
|
||||||
{ok, C} = esqlite3:open(":memory:"),
|
{ok, C} = esqlite3:open(":memory:"),
|
||||||
@@ -45,9 +41,7 @@ prepare_test() ->
|
|||||||
prepare_after_close_test() ->
|
prepare_after_close_test() ->
|
||||||
{ok, C} = esqlite3:open(":memory:"),
|
{ok, C} = esqlite3:open(":memory:"),
|
||||||
?assertEqual(ok, esqlite3:close(C)),
|
?assertEqual(ok, esqlite3:close(C)),
|
||||||
|
?assertMatch({error, {misuse, invoked_incorrectly}}, esqlite3:prepare(C, "select 1")),
|
||||||
?assertMatch({error, {misuse, _}}, esqlite3:prepare(C, "select 1")),
|
|
||||||
|
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
column_names_test() ->
|
column_names_test() ->
|
||||||
@@ -119,13 +113,21 @@ open_multiple_different_databases_test() ->
|
|||||||
|
|
||||||
get_autocommit_test() ->
|
get_autocommit_test() ->
|
||||||
{ok, Db} = esqlite3:open(":memory:"),
|
{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);"),
|
ok = esqlite3:exec(Db, "CREATE TABLE test (id INTEGER PRIMARY KEY, val STRING);"),
|
||||||
true = esqlite3:get_autocommit(Db),
|
true = esqlite3:get_autocommit(Db),
|
||||||
|
|
||||||
|
%% After a begin statement, the connection will not be in autocommit mode anymore
|
||||||
ok = esqlite3:exec(Db, "BEGIN;"),
|
ok = esqlite3:exec(Db, "BEGIN;"),
|
||||||
false = esqlite3:get_autocommit(Db),
|
false = esqlite3:get_autocommit(Db),
|
||||||
ok = esqlite3:exec(Db, "INSERT INTO test (val) VALUES ('this is a test');"),
|
ok = esqlite3:exec(Db, "INSERT INTO test (val) VALUES ('this is a test');"),
|
||||||
ok = esqlite3:exec(Db, "COMMIT;"),
|
ok = esqlite3:exec(Db, "COMMIT;"),
|
||||||
|
|
||||||
|
%% After a commit statement, the connection will be in autocommit mode
|
||||||
true = esqlite3:get_autocommit(Db),
|
true = esqlite3:get_autocommit(Db),
|
||||||
|
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
last_insert_rowid_test() ->
|
last_insert_rowid_test() ->
|
||||||
|
|||||||
Reference in New Issue
Block a user