This commit is contained in:
Maas-Maarten Zeeman
2014-06-15 21:19:25 +02:00
6 changed files with 95 additions and 3 deletions

View File

@@ -53,6 +53,7 @@ typedef enum {
cmd_unknown,
cmd_open,
cmd_exec,
cmd_changes,
cmd_prepare,
cmd_bind,
cmd_step,
@@ -281,6 +282,18 @@ do_exec(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg)
return make_atom(env, "ok");
}
/*
* Nr of changes
*/
static ERL_NIF_TERM
do_changes(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg)
{
int changes = sqlite3_changes(conn->db);
ERL_NIF_TERM changes_term = enif_make_int64(env, changes);
return make_ok_tuple(env, changes_term);
}
/*
* insert action
*/
@@ -492,7 +505,14 @@ do_step(ErlNifEnv *env, sqlite3 *db, sqlite3_stmt *stmt)
if(rc == SQLITE_BUSY)
return make_atom(env, "$busy");
return make_sqlite3_error_tuple(env, rc, db);
if(rc == SQLITE_ERROR)
return make_sqlite3_error_tuple(env, rc, db);
if(rc == SQLITE_MISUSE)
return make_error_tuple(env, "misuse");
if(rc == SQLITE_CONSTRAINT)
return make_sqlite3_error_tuple(env, rc, db);
return make_error_tuple(env, "unexpected_return_value");
}
static ERL_NIF_TERM
@@ -540,6 +560,8 @@ evaluate_command(esqlite_command *cmd, esqlite_connection *conn)
return do_open(cmd->env, conn, cmd->arg);
case cmd_exec:
return do_exec(cmd->env, conn, cmd->arg);
case cmd_changes:
return do_changes(cmd->env, conn, cmd->arg);
case cmd_prepare:
return do_prepare(cmd->env, conn, cmd->arg);
case cmd_step:
@@ -695,6 +717,37 @@ esqlite_exec(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
return push_command(env, db, cmd);
}
/*
* Count the nr of changes of last statement
*/
static ERL_NIF_TERM
esqlite_changes(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
esqlite_connection *db;
esqlite_command *cmd = NULL;
ErlNifPid pid;
if(argc != 3)
return enif_make_badarg(env);
if(!enif_get_resource(env, argv[0], esqlite_connection_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);
}
static ERL_NIF_TERM
esqlite_insert(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
@@ -936,6 +989,7 @@ static ErlNifFunc nif_funcs[] = {
{"start", 0, esqlite_start},
{"open", 4, esqlite_open},
{"exec", 4, esqlite_exec},
{"changes", 3, esqlite_changes},
{"prepare", 4, esqlite_prepare},
{"insert", 4, esqlite_insert},
{"step", 3, esqlite_step},