diff --git a/c_src/esqlite_nif.c b/c_src/esqlite_nif.c index c2e47ab..c11e260 100644 --- a/c_src/esqlite_nif.c +++ b/c_src/esqlite_nif.c @@ -159,7 +159,6 @@ esqlite_db_run(void *arg) { esqlite_db *db = (esqlite_db *) arg; esqlite_command *cmd; - ERL_NIF_TERM answer; int continue_running = 1; db->alive = 1; @@ -170,10 +169,11 @@ esqlite_db_run(void *arg) if(cmd->type == cmd_stop) { continue_running = 0; } else { - answer = evaluate_command(cmd->env, cmd->type, db, NULL); - enif_send(NULL, &cmd->pid, cmd->env, enif_make_tuple2(cmd->env, cmd->ref, answer)); + enif_send(NULL, &cmd->pid, cmd->env, + enif_make_tuple2(cmd->env, cmd->ref, + evaluate_command(cmd->env, cmd->type, db, NULL))); } - + command_destroy(cmd); } @@ -252,15 +252,42 @@ esqlite_open_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) return _atom_ok; } - - /* * Execute the sql statement */ static ERL_NIF_TERM esqlite_exec_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { - return _atom_ok; + esqlite_db *db; + esqlite_command *cmd = NULL; + ErlNifPid pid; + + if(argc != 4) + return enif_make_badarg(env); + + if(!enif_get_resource(env, argv[0], esqlite_db_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_exec; + cmd->ref = enif_make_copy(cmd->env, argv[1]); + cmd->pid = pid; + /* TODO add the query as an argument */ + + if(!queue_push(db->commands, cmd)) + return make_error_tuple(env, "command_push_failed"); + + return _atom_ok; } /* @@ -278,7 +305,7 @@ esqlite_close_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) static int on_load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info) { - ErlNifResourceType *rt = enif_open_resource_type(env, "esqlite", "esqlite_sqlite3_type", + ErlNifResourceType *rt = enif_open_resource_type(env, "esqlite", "esqlite_sqlite3_db", descruct_esqlite_db, ERL_NIF_RT_CREATE, NULL); if(!rt) return -1; diff --git a/src/esqlite.erl b/src/esqlite.erl index 614a81f..2a0b3a4 100644 --- a/src/esqlite.erl +++ b/src/esqlite.erl @@ -35,10 +35,10 @@ open(Filename, Timeout) -> %% @doc Execute Sql statement %% -exec(Sql, Db) -> - exec(Sql, Db, ?DEFAULT_TIMEOUT). +exec(Db, Sql) -> + exec(Db, Sql, ?DEFAULT_TIMEOUT). -exec(Sql, Db, Timeout) -> +exec(Db, Sql, Timeout) -> Ref = make_ref(), ok = esqlite_exec(Db, Ref, self(), Sql), receive_answer(Ref, Timeout). diff --git a/test/esqlite_test.erl b/test/esqlite_test.erl index de8d422..1dc4eef 100644 --- a/test/esqlite_test.erl +++ b/test/esqlite_test.erl @@ -10,9 +10,22 @@ open_single_database_test() -> {ok, _C1} = esqlite:open("test.db"), ok. -open_multiple_databases_test() -> +open_multiple_same_databases_test() -> {ok, _C1} = esqlite:open("test.db"), {ok, _C2} = esqlite:open("test.db"), - ok. +open_multiple_different_databases_test() -> + {ok, _C1} = esqlite:open("test1.db"), + {ok, _C2} = esqlite:open("test2.db"), + ok. + +simple_query_test() -> + {ok, Db} = esqlite:open("test.db"), + esqlite:exec(Db, "create table test_table(one varchar(10), two, smallint);"), + esqlite:exec(Db, ["insert into test_table values(", "hello", ",", "10" ");"]), + ok. + + + +