]> pd.if.org Git - zpackage/blobdiff - lib/dbquery.c
add where clause argument to findpkg
[zpackage] / lib / dbquery.c
index 479070c380505ab487be41e197d68e0f562b27b8..cba95378ae2a258c8351b9f3ac07191bc46ce337 100644 (file)
@@ -1,3 +1,5 @@
+#define _POSIX_C_SOURCE 200809L
+
 #include <stdarg.h>
 #include <string.h>
 
@@ -5,30 +7,31 @@
 #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;
 
-       if (!zpm || zpm->error || !zpm->db) {
+       if (!zpm || zpm->error) {
+               return 0;
+       }
+
+       if (!zpm->db) {
                zpm->error = 1;
                return 0;
        }
 
        db = zpm->db;
 
-       va_start(args, query);
        sql = sqlite3_vmprintf(query, args);
-       va_end(args);
 
        if (!sql) {
                zpm->error = 1;
                return 0;
        }
 
-       fprintf(stderr, "preparing query: %s\n", sql);
        rv = sqlite3_prepare_v2(db, sql, strlen(sql), &st, NULL);
        if (rv != SQLITE_OK) {
                SQLERROR(sqlite3_errmsg(db));
@@ -38,3 +41,87 @@ sqlite3_stmt *zpm_dbquery(struct zpm *zpm, char *query, ...) {
 
        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);
+
+       if (rv == SQLITE_ROW) {
+               result = (char *)sqlite3_column_text(st, 0);
+               if (result) {
+                       result = strdup(result);
+               }
+       }
+
+       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;
+}