1 #define _POSIX_C_SOURCE 200809L
9 #define SQLERROR(x) fprintf(stderr, "%s %d: %s\n", __func__, __LINE__, (x))
11 sqlite3_stmt *zpm_dbqueryv(struct zpm *zpm, char *query, va_list args) {
17 if (!zpm || zpm->error) {
28 sql = sqlite3_vmprintf(query, args);
35 rv = sqlite3_prepare_v2(db, sql, strlen(sql), &st, NULL);
36 if (rv != SQLITE_OK) {
37 SQLERROR(sqlite3_errmsg(db));
38 fprintf(stderr, "sql (%d): %s\n", rv, sql);
46 sqlite3_stmt *zpm_dbquery(struct zpm *zpm, char *query, ...) {
50 if (!zpm || zpm->error) {
59 va_start(args, query);
60 st = zpm_dbqueryv(zpm, query, args);
66 void zpm_db_run(struct zpm *zpm, char *query, ...) {
71 va_start(args, query);
72 st = zpm_dbqueryv(zpm, query, args);
75 rv = sqlite3_step(st);
77 if (rv != SQLITE_DONE) {
79 zpm_seterror(zpm, "db error: %s", sqlite3_errstr(rv));
86 char *zpm_db_string(struct zpm *zpm, char *query, ...) {
92 va_start(args, query);
93 st = zpm_dbqueryv(zpm, query, args);
96 rv = sqlite3_step(st);
100 result = (char *)sqlite3_column_text(st, 0);
102 result = strdup(result);
105 case SQLITE_DONE: break;
108 zpm_seterror(zpm, "db error: %s", sqlite3_errstr(rv));
112 sqlite3_finalize(st);
116 int zpm_db_int(struct zpm *zpm, char *query, ...) {
122 va_start(args, query);
123 st = zpm_dbqueryv(zpm, query, args);
126 rv = sqlite3_step(st);
128 if (rv == SQLITE_ROW) {
129 result = sqlite3_column_int(st, 0);
131 /* TODO set error if it's not SQLITE_ROW */
133 sqlite3_finalize(st);