driver working and passes its test
This commit is contained in:
@@ -95,6 +95,7 @@ static int sql_exec(sqlite3_drv_t *drv, char *command, int command_size) {
|
|||||||
char *rest = NULL;
|
char *rest = NULL;
|
||||||
sqlite3_stmt *statement;
|
sqlite3_stmt *statement;
|
||||||
|
|
||||||
|
// fprintf(stderr, "Preexec: %.*s\n", command_size, command);
|
||||||
result = sqlite3_prepare_v2(drv->db, command, command_size, &statement, (const char **)&rest);
|
result = sqlite3_prepare_v2(drv->db, command, command_size, &statement, (const char **)&rest);
|
||||||
if(result != SQLITE_OK) {
|
if(result != SQLITE_OK) {
|
||||||
ErlDrvTermData *dataset;
|
ErlDrvTermData *dataset;
|
||||||
@@ -192,7 +193,7 @@ static void sql_exec_async(void *_async_command) {
|
|||||||
dataset[base + 2 + column_count*2 + 6] = driver_mk_atom("rows");
|
dataset[base + 2 + column_count*2 + 6] = driver_mk_atom("rows");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr, "Exec: %s\n", sqlite3_sql(statement));
|
// fprintf(stderr, "Exec: %s\n", sqlite3_sql(statement));
|
||||||
|
|
||||||
while ((next_row = sqlite3_step(statement)) == SQLITE_ROW) {
|
while ((next_row = sqlite3_step(statement)) == SQLITE_ROW) {
|
||||||
|
|
||||||
@@ -313,7 +314,7 @@ static void sql_exec_async(void *_async_command) {
|
|||||||
|
|
||||||
async_command->dataset = dataset;
|
async_command->dataset = dataset;
|
||||||
async_command->term_count = term_count;
|
async_command->term_count = term_count;
|
||||||
fprintf(stderr, "Total term count: %p %d, rows count: %dx%d\n", statement, term_count, column_count, row_count);
|
// fprintf(stderr, "Total term count: %p %d, rows count: %dx%d\n", statement, term_count, column_count, row_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ready_async(ErlDrvData drv_data, ErlDrvThreadData thread_data)
|
static void ready_async(ErlDrvData drv_data, ErlDrvThreadData thread_data)
|
||||||
@@ -322,7 +323,7 @@ static void ready_async(ErlDrvData drv_data, ErlDrvThreadData thread_data)
|
|||||||
sqlite3_drv_t *drv = async_command->driver_data;
|
sqlite3_drv_t *drv = async_command->driver_data;
|
||||||
|
|
||||||
int res = driver_output_term(drv->port, async_command->dataset, async_command->term_count);
|
int res = driver_output_term(drv->port, async_command->dataset, async_command->term_count);
|
||||||
fprintf(stderr, "Total term count: %p %d, rows count: %d (%d)\n", async_command->statement, async_command->term_count, async_command->row_count, res);
|
// fprintf(stderr, "Total term count: %p %d, rows count: %d (%d)\n", async_command->statement, async_command->term_count, async_command->row_count, res);
|
||||||
sql_free_async(async_command);
|
sql_free_async(async_command);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -461,7 +461,7 @@ create_cmd(Dbase) ->
|
|||||||
wait_result(Port) ->
|
wait_result(Port) ->
|
||||||
receive
|
receive
|
||||||
{Port, Reply} ->
|
{Port, Reply} ->
|
||||||
io:format("Reply: ~p~n", [Reply]),
|
% io:format("Reply: ~p~n", [Reply]),
|
||||||
Reply;
|
Reply;
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
io:format("Error: ~p~n", [Reason]),
|
io:format("Error: ~p~n", [Reason]),
|
||||||
@@ -488,5 +488,5 @@ build_table_info([], Acc) ->
|
|||||||
build_table_info([[ColName, ColType] | Tl], Acc) ->
|
build_table_info([[ColName, ColType] | Tl], Acc) ->
|
||||||
build_table_info(Tl, [{list_to_atom(ColName), sqlite3_lib:col_type(ColType)}| Acc]);
|
build_table_info(Tl, [{list_to_atom(ColName), sqlite3_lib:col_type(ColType)}| Acc]);
|
||||||
build_table_info([[ColName, ColType, "PRIMARY", "KEY"] | Tl], Acc) ->
|
build_table_info([[ColName, ColType, "PRIMARY", "KEY"] | Tl], Acc) ->
|
||||||
build_table_info(Tl, [{list_to_atom(ColName), sqlite3_lib:col_type(ColType)}| Acc]).
|
build_table_info(Tl, [{list_to_atom(ColName), primary_key}| Acc]).
|
||||||
|
|
||||||
|
|||||||
8
test.erl
8
test.erl
@@ -6,12 +6,14 @@
|
|||||||
test() ->
|
test() ->
|
||||||
file:delete("store.db"),
|
file:delete("store.db"),
|
||||||
sqlite3:open(ct),
|
sqlite3:open(ct),
|
||||||
sqlite3:create_table(ct, user, [{name, text}, {age, integer}, {wage, integer}]),
|
sqlite3:create_table(ct, user, [{id, integer}, {name, text}, {age, integer}, {wage, integer}]),
|
||||||
[user] = sqlite3:list_tables(ct),
|
[user] = sqlite3:list_tables(ct),
|
||||||
[{name, text}, {age, integer}, {wage, integer}] = sqlite3:table_info(ct, user),
|
[{id, primary_key}, {name, text}, {age, integer}, {wage, integer}] = sqlite3:table_info(ct, user),
|
||||||
{id, Id1} = sqlite3:write(ct, user, [{name, "abby"}, {age, 20}, {wage, 2000}]),
|
{id, Id1} = sqlite3:write(ct, user, [{name, "abby"}, {age, 20}, {wage, 2000}]),
|
||||||
|
Id1 = 1,
|
||||||
{id, Id2} = sqlite3:write(ct, user, [{name, "marge"}, {age, 30}, {wage, 3000}]),
|
{id, Id2} = sqlite3:write(ct, user, [{name, "marge"}, {age, 30}, {wage, 3000}]),
|
||||||
[{columns, [name, age, wage]}, {rows, [{<<"abby">>, 20, 2000}, {<<"marge">>, 30, 3000}]}] = sqlite3:sql_exec(ct, "select * from user;"),
|
Id2 = 2,
|
||||||
|
[{columns, [id, name, age, wage]}, {rows, [{1, <<"abby">>, 20, 2000}, {2, <<"marge">>, 30, 3000}]}] = sqlite3:sql_exec(ct, "select * from user;"),
|
||||||
sqlite3:read(ct, user, {name, "abby"}),
|
sqlite3:read(ct, user, {name, "abby"}),
|
||||||
sqlite3:delete(ct, user, {name, "abby"}),
|
sqlite3:delete(ct, user, {name, "abby"}),
|
||||||
sqlite3:drop_table(ct, user),
|
sqlite3:drop_table(ct, user),
|
||||||
|
|||||||
Reference in New Issue
Block a user