add insert function to get last insert rowid

This commit is contained in:
qingliangcn
2013-11-28 00:22:40 +08:00
parent b2d1f7ed9f
commit a921bd65b2
3 changed files with 89 additions and 14 deletions

View File

@@ -57,7 +57,8 @@ typedef enum {
cmd_step,
cmd_column_names,
cmd_close,
cmd_stop
cmd_stop,
cmd_insert
} command_type;
typedef struct {
@@ -277,6 +278,27 @@ do_exec(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg)
return make_atom(env, "ok");
}
/*
* insert action
*/
static ERL_NIF_TERM
do_insert(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg)
{
ErlNifBinary bin;
int rc;
ERL_NIF_TERM eos = enif_make_int(env, 0);
enif_inspect_iolist_as_binary(env,
enif_make_list2(env, arg, eos), &bin);
rc = sqlite3_exec(conn->db, (char *) bin.data, NULL, NULL, NULL);
if(rc != SQLITE_OK)
return make_sqlite3_error_tuple(env, rc, conn->db);
sqlite3_int64 last_rowid = sqlite3_last_insert_rowid(conn->db);
ERL_NIF_TERM last_rowid_term = enif_make_int(env, last_rowid);
return make_ok_tuple(env, last_rowid_term);
}
/*
*/
static ERL_NIF_TERM
@@ -530,6 +552,8 @@ evaluate_command(esqlite_command *cmd, esqlite_connection *conn)
return do_column_names(cmd->env, cmd->stmt);
case cmd_close:
return do_close(cmd->env, conn, cmd->arg);
case cmd_insert:
return do_insert(cmd->env, conn, cmd->arg);
default:
return make_error_tuple(cmd->env, "invalid_command");
}
@@ -673,6 +697,35 @@ esqlite_exec(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
return push_command(env, db, cmd);
}
static ERL_NIF_TERM
esqlite_insert(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
esqlite_connection *db;
esqlite_command *cmd = NULL;
ErlNifPid pid;
if(argc != 4)
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_insert;
cmd->ref = enif_make_copy(cmd->env, argv[1]);
cmd->pid = pid;
cmd->arg = enif_make_copy(cmd->env, argv[3]);
return push_command(env, db, cmd);
}
/*
* Prepare the sql statement
@@ -884,6 +937,7 @@ static ErlNifFunc nif_funcs[] = {
{"open", 4, esqlite_open},
{"exec", 4, esqlite_exec},
{"prepare", 4, esqlite_prepare},
{"insert", 4, esqlite_insert},
{"step", 3, esqlite_step},
// TODO: {"esqlite_bind", 3, esqlite_bind_named},
{"bind", 4, esqlite_bind},