Query results. YESSS
This commit is contained in:
@@ -2,8 +2,9 @@
|
|||||||
* Esqlite -- an erlang sqlite nif.
|
* Esqlite -- an erlang sqlite nif.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <erl_nif.h>
|
#include <erl_nif.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <stdio.h> /* for debugging */
|
#include <stdio.h> /* for debugging */
|
||||||
|
|
||||||
@@ -243,6 +244,46 @@ do_prepare(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg)
|
|||||||
return make_ok_tuple(env, esqlite_stmt);
|
return make_ok_tuple(env, esqlite_stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ERL_NIF_TERM
|
||||||
|
make_binary(ErlNifEnv *env, const void *bytes, unsigned int size)
|
||||||
|
{
|
||||||
|
ErlNifBinary blob;
|
||||||
|
ERL_NIF_TERM term;
|
||||||
|
|
||||||
|
if(!enif_alloc_binary(size, &blob)) {
|
||||||
|
/* TODO: fix this */
|
||||||
|
return _atom_error;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(blob.data, bytes, size);
|
||||||
|
term = enif_make_binary(env, &blob);
|
||||||
|
enif_release_binary(&blob);
|
||||||
|
|
||||||
|
return term;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ERL_NIF_TERM
|
||||||
|
make_cell(ErlNifEnv *env, sqlite3_stmt *statement, unsigned int i)
|
||||||
|
{
|
||||||
|
int type = sqlite3_column_type(statement, i);
|
||||||
|
|
||||||
|
switch(type) {
|
||||||
|
case SQLITE_INTEGER:
|
||||||
|
return enif_make_int(env, sqlite3_column_int(statement, i));
|
||||||
|
case SQLITE_FLOAT:
|
||||||
|
return enif_make_double(env, sqlite3_column_double(statement, i));
|
||||||
|
case SQLITE_BLOB:
|
||||||
|
return make_binary(env, sqlite3_column_blob(statement, i), sqlite3_column_bytes(statement, i));
|
||||||
|
case SQLITE_NULL:
|
||||||
|
return make_atom(env, "undefined");
|
||||||
|
case SQLITE_TEXT:
|
||||||
|
/* TODO, make some tests to see what happens when you insert a utf-8 string */
|
||||||
|
return enif_make_string(env, (char *) sqlite3_column_text(statement, i), ERL_NIF_LATIN1);
|
||||||
|
default:
|
||||||
|
return make_atom(env, "should_not_happen");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static ERL_NIF_TERM
|
static ERL_NIF_TERM
|
||||||
make_row(ErlNifEnv *env, sqlite3_stmt *statement)
|
make_row(ErlNifEnv *env, sqlite3_stmt *statement)
|
||||||
{
|
{
|
||||||
@@ -256,10 +297,8 @@ make_row(ErlNifEnv *env, sqlite3_stmt *statement)
|
|||||||
if(!array)
|
if(!array)
|
||||||
return make_error_tuple(env, "no_memory");
|
return make_error_tuple(env, "no_memory");
|
||||||
|
|
||||||
for(i = 0; i < size; i++) {
|
for(i = 0; i < size; i++)
|
||||||
/* todo get the value, and transform it */
|
array[i] = make_cell(env, statement, i);
|
||||||
array[i] = _atom_ok;
|
|
||||||
};
|
|
||||||
|
|
||||||
row = enif_make_tuple_from_array(env, array, size);
|
row = enif_make_tuple_from_array(env, array, size);
|
||||||
free(array);
|
free(array);
|
||||||
@@ -269,18 +308,12 @@ make_row(ErlNifEnv *env, sqlite3_stmt *statement)
|
|||||||
static ERL_NIF_TERM
|
static ERL_NIF_TERM
|
||||||
do_step(ErlNifEnv *env, esqlite_connection *conn, sqlite3_stmt *stmt)
|
do_step(ErlNifEnv *env, esqlite_connection *conn, sqlite3_stmt *stmt)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc = sqlite3_step(stmt);
|
||||||
|
|
||||||
fprintf(stderr, "step\n");
|
|
||||||
|
|
||||||
rc = sqlite3_step(stmt);
|
|
||||||
fprintf(stderr, "step returned: %d\n", rc);
|
|
||||||
|
|
||||||
if(rc == SQLITE_DONE)
|
if(rc == SQLITE_DONE)
|
||||||
return make_atom(env, "$done");
|
return make_atom(env, "$done");
|
||||||
if(rc == SQLITE_BUSY)
|
if(rc == SQLITE_BUSY)
|
||||||
return make_atom(env, "$busy");
|
return make_atom(env, "$busy");
|
||||||
|
|
||||||
if(rc == SQLITE_ROW)
|
if(rc == SQLITE_ROW)
|
||||||
return make_row(env, stmt);
|
return make_row(env, stmt);
|
||||||
|
|
||||||
|
|||||||
@@ -39,10 +39,12 @@ prepare_test() ->
|
|||||||
{ok, Statement} = esqlite:prepare(Db, "insert into test_table values(\"one\", 2)"),
|
{ok, Statement} = esqlite:prepare(Db, "insert into test_table values(\"one\", 2)"),
|
||||||
|
|
||||||
'$done' = esqlite:step(Statement),
|
'$done' = esqlite:step(Statement),
|
||||||
|
|
||||||
{ok, St2} = esqlite:prepare(Db, "select * from test_table"),
|
|
||||||
|
|
||||||
[{ok, ok}] = exec(St2),
|
ok = esqlite:exec(Db, ["insert into test_table values(", "\"hello4\"", ",", "13" ");"]),
|
||||||
|
|
||||||
|
{ok, St2} = esqlite:prepare(Db, "select * from test_table order by two"),
|
||||||
|
|
||||||
|
[{"one", 2}, {"hello4", 13}] = exec(St2),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
exec(Statement) ->
|
exec(Statement) ->
|
||||||
|
|||||||
Reference in New Issue
Block a user