-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathocaml-sqlite3.h
54 lines (43 loc) · 1.28 KB
/
ocaml-sqlite3.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "config.h"
#define TRUE 1
#define FALSE 0
void ml_sqlite3_raise_exn (int, const char *, int) Noreturn;
#define raise_sqlite3_exn(db) ml_sqlite3_raise_exn (sqlite3_errcode (Sqlite3_val(db)), sqlite3_errmsg (Sqlite3_val(db)), TRUE)
#if defined(__GNUC__) && (__GNUC__ >= 3)
# define Pure __attribute__ ((pure))
#else
# define Pure
#endif
struct ml_sqlite3_data {
sqlite3 *db;
value callbacks;
value stmt_store;
};
#define Sqlite3_data_val(v) (* ((struct ml_sqlite3_data **) Data_custom_val(v)))
static sqlite3 * Sqlite3_val (value) Pure;
static sqlite3_stmt * Sqlite3_stmt_val (value) Pure;
static sqlite3_value * Sqlite3_value_val (value) Pure;
static inline sqlite3 *
Sqlite3_val (value v)
{
struct ml_sqlite3_data *data = Sqlite3_data_val (v);
if (data->db == NULL)
ml_sqlite3_raise_exn (SQLITE_MISUSE, "closed db", TRUE);
return data->db;
}
static inline sqlite3_stmt *
Sqlite3_stmt_val (value v)
{
sqlite3_stmt *stmt = * ((sqlite3_stmt **) v);
if (stmt == NULL)
ml_sqlite3_raise_exn (SQLITE_MISUSE, "invalid statement", TRUE);
return stmt;
}
static inline sqlite3_value *
Sqlite3_value_val (value v)
{
sqlite3_value *val = * ((sqlite3_value **) v);
if (val == NULL)
ml_sqlite3_raise_exn (SQLITE_MISUSE, "invalid value", TRUE);
return val;
}