+#define _POSIX_C_SOURCE 200809L
+
#include <stdarg.h>
#include <string.h>
#include "zpm.h"
#define SQLERROR(x) fprintf(stderr, "%s %d: %s\n", __func__, __LINE__, (x))
-sqlite3_stmt *zpm_dbquery(struct zpm *zpm, char *query, ...) {
+
+sqlite3_stmt *zpm_dbqueryv(struct zpm *zpm, char *query, va_list args) {
sqlite3 *db;
char *sql;
- va_list args;
sqlite3_stmt *st;
int rv;
db = zpm->db;
- va_start(args, query);
sql = sqlite3_vmprintf(query, args);
- va_end(args);
if (!sql) {
zpm->error = 1;
rv = sqlite3_prepare_v2(db, sql, strlen(sql), &st, NULL);
if (rv != SQLITE_OK) {
SQLERROR(sqlite3_errmsg(db));
+ fprintf(stderr, "sql (%d): %s\n", rv, sql);
zpm->error = rv;
return 0;
}
return st;
}
+
+sqlite3_stmt *zpm_dbquery(struct zpm *zpm, char *query, ...) {
+ va_list args;
+ sqlite3_stmt *st;
+
+ if (!zpm || zpm->error) {
+ return 0;
+ }
+
+ if (!zpm->db) {
+ zpm->error = 1;
+ return 0;
+ }
+
+ va_start(args, query);
+ st = zpm_dbqueryv(zpm, query, args);
+ va_end(args);
+
+ return st;
+}
+
+void zpm_db_run(struct zpm *zpm, char *query, ...) {
+ sqlite3_stmt *st;
+ va_list args;
+ int rv;
+
+ va_start(args, query);
+ st = zpm_dbqueryv(zpm, query, args);
+ va_end(args);
+
+ rv = sqlite3_step(st);
+
+ if (rv != SQLITE_DONE) {
+ zpm->error = 1;
+ zpm_seterror(zpm, "db error: %s", sqlite3_errstr(rv));
+ }
+
+ sqlite3_finalize(st);
+ return ;
+}
+
+char *zpm_db_string(struct zpm *zpm, char *query, ...) {
+ sqlite3_stmt *st;
+ va_list args;
+ int rv;
+ char *result = 0;
+
+ va_start(args, query);
+ st = zpm_dbqueryv(zpm, query, args);
+ va_end(args);
+
+ rv = sqlite3_step(st);
+
+ switch (rv) {
+ case SQLITE_ROW:
+ result = (char *)sqlite3_column_text(st, 0);
+ if (result) {
+ result = strdup(result);
+ }
+ break;
+ case SQLITE_DONE: break;
+ default:
+ zpm->error = 1;
+ zpm_seterror(zpm, "db error: %s", sqlite3_errstr(rv));
+ break;
+ }
+
+ sqlite3_finalize(st);
+ return result;
+}
+
+int zpm_db_int(struct zpm *zpm, char *query, ...) {
+ sqlite3_stmt *st;
+ va_list args;
+ int rv;
+ int result = 0;
+
+ va_start(args, query);
+ st = zpm_dbqueryv(zpm, query, args);
+ va_end(args);
+
+ rv = sqlite3_step(st);
+
+ if (rv == SQLITE_ROW) {
+ result = sqlite3_column_int(st, 0);
+ }
+ /* TODO set error if it's not SQLITE_ROW */
+
+ sqlite3_finalize(st);
+ return result;
+}