First cut of prepared statement support

This commit is contained in:
Alexey Romanov
2010-12-07 18:18:14 +03:00
parent 3c96c26c11
commit 51e9481aa7
3 changed files with 524 additions and 114 deletions

View File

@@ -20,6 +20,12 @@
#define CMD_SQL_EXEC 2
// #define CMD_DEL 3
#define CMD_SQL_BIND_AND_EXEC 4
#define CMD_PREPARE 5
#define CMD_PREPARED_BIND 6
#define CMD_PREPARED_STEP 7
#define CMD_PREPARED_RESET 8
#define CMD_PREPARED_CLEAR_BINDINGS 9
#define CMD_PREPARED_FINALIZE 10
// Number of bytes for each key
// (160 bits for SHA1 hash)
@@ -30,6 +36,8 @@ typedef struct ptr_list {
struct ptr_list *tail;
} ptr_list;
struct async_sqlite3_command;
// Define struct to hold state across calls
typedef struct sqlite3_drv_t {
ErlDrvPort port;
@@ -37,6 +45,9 @@ typedef struct sqlite3_drv_t {
struct sqlite3 *db;
long async_handle;
FILE *log;
struct async_sqlite3_command **prepared_commands;
unsigned int prepared_count;
unsigned int prepared_alloc;
ErlDrvTermData atom_blob;
ErlDrvTermData atom_error;
ErlDrvTermData atom_columns;
@@ -44,6 +55,7 @@ typedef struct sqlite3_drv_t {
ErlDrvTermData atom_null;
ErlDrvTermData atom_rowid;
ErlDrvTermData atom_ok;
ErlDrvTermData atom_done;
ErlDrvTermData atom_unknown_cmd;
} sqlite3_drv_t;
@@ -52,6 +64,7 @@ typedef struct async_sqlite3_command {
sqlite3_stmt *statement;
ErlDrvTermData *dataset;
int term_count;
int term_allocated;
int row_count;
ptr_list *ptrs;
ptr_list *binaries;
@@ -64,6 +77,12 @@ static int control(ErlDrvData drv_data, unsigned int command, char *buf,
int len, char **rbuf, int rlen);
static int sql_exec(sqlite3_drv_t *drv, char *buf, int len);
static int sql_bind_and_exec(sqlite3_drv_t *drv, char *buf, int len);
static int prepare(sqlite3_drv_t *drv, char *buf, int len);
static int prepared_bind(sqlite3_drv_t *drv, char *buf, int len);
static int prepared_step(sqlite3_drv_t *drv, char *buf, int len);
static int prepared_reset(sqlite3_drv_t *drv, char *buf, int len);
static int prepared_clear_bindings(sqlite3_drv_t *drv, char *buf, int len);
static int prepared_finalize(sqlite3_drv_t *drv, char *buf, int len);
static void sql_exec_async(void *async_command);
static void sql_free_async(void *async_command);
static void ready_async(ErlDrvData drv_data, ErlDrvThreadData thread_data);