From e9513fade8467abcbfe88434dfd6dd570b4fd4e6 Mon Sep 17 00:00:00 2001 From: sergey-miryanov Date: Fri, 12 Feb 2010 16:58:05 +0500 Subject: [PATCH] Return name of columns from select statement as strings Not as atoms --- priv/sqlite3_drv.c | 27 +++++++++++++++------------ test.erl | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/priv/sqlite3_drv.c b/priv/sqlite3_drv.c index 83c3e90..61c08b1 100644 --- a/priv/sqlite3_drv.c +++ b/priv/sqlite3_drv.c @@ -205,24 +205,27 @@ static void sql_exec_async(void *_async_command) { if (column_count > 0) { int base = term_count; - term_count += 2 + column_count*2 + 1 + 2 + 2 + 2; + term_count += 2 + column_count*3 + 1 + 2 + 2 + 2; dataset = realloc(dataset, sizeof(*dataset) * term_count); dataset[base] = ERL_DRV_ATOM; dataset[base + 1] = drv->atom_columns; for (i = 0; i < column_count; i++) { - dataset[base + 2 + (i*2)] = ERL_DRV_ATOM; - // fprintf(drv->log, "Column: %s\n", sqlite3_column_name(statement, i)); + char *column_name = (char *)sqlite3_column_name(statement, i); + // fprintf(drv->log, "Column: %s\n", column_name); // fflush (drv->log); - dataset[base + 2 + (i*2) + 1] = driver_mk_atom((char *)sqlite3_column_name(statement, i)); - } - dataset[base + 2 + column_count*2 + 0] = ERL_DRV_NIL; - dataset[base + 2 + column_count*2 + 1] = ERL_DRV_LIST; - dataset[base + 2 + column_count*2 + 2] = column_count + 1; - dataset[base + 2 + column_count*2 + 3] = ERL_DRV_TUPLE; - dataset[base + 2 + column_count*2 + 4] = 2; - dataset[base + 2 + column_count*2 + 5] = ERL_DRV_ATOM; - dataset[base + 2 + column_count*2 + 6] = drv->atom_rows; + dataset[base + 2 + (i*3)] = ERL_DRV_STRING; + dataset[base + 2 + (i*3) + 1] = (ErlDrvTermData) column_name; + dataset[base + 2 + (i*3) + 2] = strlen (column_name); + } + dataset[base + 2 + column_count*3 + 0] = ERL_DRV_NIL; + dataset[base + 2 + column_count*3 + 1] = ERL_DRV_LIST; + dataset[base + 2 + column_count*3 + 2] = column_count + 1; + dataset[base + 2 + column_count*3 + 3] = ERL_DRV_TUPLE; + dataset[base + 2 + column_count*3 + 4] = 2; + + dataset[base + 2 + column_count*3 + 5] = ERL_DRV_ATOM; + dataset[base + 2 + column_count*3 + 6] = drv->atom_rows; } // fprintf(drv->log, "Exec: %s\n", sqlite3_sql(statement)); diff --git a/test.erl b/test.erl index e40db3e..432b8b4 100755 --- a/test.erl +++ b/test.erl @@ -13,7 +13,7 @@ test() -> Id1 = 1, {id, Id2} = sqlite3:write(ct, user, [{name, "marge"}, {age, 30}, {wage, 3000}]), Id2 = 2, - [{columns, [id, name, age, wage]}, {rows, [{1, <<"abby">>, 20, 2000}, {2, <<"marge">>, 30, 3000}]}] = sqlite3:sql_exec(ct, "select * from user;"), + [{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:delete(ct, user, {name, "abby"}), sqlite3:drop_table(ct, user),