A zero-boilerplate, ORM for PostgreSQL
git clone git://soophie.de/glue
24
// name text NOT NULL25
// );26
#define ITEM_COLUMNS(X) \27
COLDEF_INT(X, id) \28
COLDEF_TEXT(X, code) \29
COLDEF_TEXT(X, name)30
TABLEDEF(item, ITEM_COLUMNS)27
GLUE_COLDEF_INT(X, id) \28
GLUE_COLDEF_TEXT(X, code) \29
GLUE_COLDEF_TEXT(X, name)30
GLUE_TABLEDEF(item, ITEM_COLUMNS)32
int main(void) {33
item_t *item_list = NULL;
15
void glue_get_bool(char *src, bool *dest);18
#define TABLEDEF($name, $cols) \18
#define GLUE_TABLEDEF($name, $cols) \19
typedef struct { \20
$cols(X_COLDEF) \20
$cols(_GLUE_X_COLDEF) \21
} $name##_t; \22
\23
void _##$name##_fetch_fn(char *column, char *value, void *data) { \23
static inline void _##$name##_fetch_fn(char *column, char *value, void *data) { \24
$name##_t *self = ($name##_t *) data; \25
$cols(X_ASSIGN) \25
$cols(_GLUE_X_ASSIGN) \26
} \27
void $name##_fetch(const char *query, size_t params_len, const char *params[params_len], $name##_t **data, size_t *len) { \27
static inline void $name##_fetch(const char *query, size_t params_len, const char *params[params_len], $name##_t **data, size_t *len) { \28
glue_fetch(query, params_len, params, _##$name##_fetch_fn, (void *) data, len, sizeof($name##_t)); \29
} \30
void $name##_free($name##_t *self) { \31
$cols(X_FREE) \30
static inline void $name##_free($name##_t *self) { \31
$cols(_GLUE_X_FREE) \32
} \33
\34
void $name##_list_free($name##_t *list, size_t len) { \34
static inline void $name##_list_free($name##_t *list, size_t len) { \35
if (!list) return; \36
for (size_t i = 0; i < len; i++) { \37
$name##_free(&list[i]); \
39
free(list); \40
} \41
\42
void $name##_dbg($name##_t *self) { \42
static inline void $name##_dbg($name##_t *self) { \43
fprintf(stdout, "(%s_t) {\n", #$name); \44
$cols(X_DEBUG) \44
$cols(_GLUE_X_DEBUG) \45
fprintf(stdout, "}\n"); \46
}48
#define X_COLDEF($type, $name, $getter, $freeable, $format) \48
#define _GLUE_X_COLDEF($type, $name, $getter, $freeable, $format) \49
$type $name;51
#define X_FREE($type, $name, $getter, $freeable, $format) \51
#define _GLUE_X_FREE($type, $name, $getter, $freeable, $format) \52
if ($freeable) { \53
if (self->$name) { \54
void **name = (void **) &self->$name; \
57
} \58
}60
#define X_ASSIGN($type, $name, $getter, $freeable, $format) \60
#define _GLUE_X_ASSIGN($type, $name, $getter, $freeable, $format) \61
if (strcmp(column, #$name) == 0) { \62
$getter(value, &self->$name); \63
}65
#define X_DEBUG($type, $name, $getter, $freeable, $format) \65
#define _GLUE_X_DEBUG($type, $name, $getter, $freeable, $format) \66
fprintf(stdout, " .%s = ", #$name); \67
$format($name) \68
fprintf(stdout, "\n");70
#define FORMAT_INT($name) \70
#define GLUE_FORMAT_INT($name) \71
fprintf(stdout, "%d,", (int) self->$name);73
#define FORMAT_TEXT($name) \73
#define GLUE_FORMAT_TEXT($name) \74
fprintf(stdout, "%s,", (const char *) self->$name);76
#define COLDEF_INT(X, $name) \77
X(int, $name, glue_get_int, 0, FORMAT_INT)76
#define GLUE_COLDEF(X, $type, $name, $getter, $freeable, $format) \77
X($type, $name, $getter, $freeable, $format)79
#define COLDEF_TEXT(X, $name) \80
X(char *, $name, glue_get_string, 1, FORMAT_TEXT)79
#define GLUE_COLDEF_INT(X, $name) \80
X(int, $name, glue_get_int, 0, GLUE_FORMAT_INT)82
#define GLUE_COLDEF_TEXT(X, $name) \83
X(char *, $name, glue_get_string, 1, GLUE_FORMAT_TEXT)85
#ifdef SO_GLUE_IMPL
156
size_t value_len = strlen(src);157
if (value_len == 0) {158
*dest = NULL;159
return;160
}161
*dest = malloc(sizeof(char) * (value_len + 1));162
memcpy(*dest, src, value_len);