First cut of prepared statement support
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user