]> pd.if.org Git - zpackage/blobdiff - lib/dbquery.c
rework zpm-add
[zpackage] / lib / dbquery.c
index ab03984697b2f255fc88aaa9ebc9d0c0a8d78ba5..f68eb4ab2489c2bdf3a6b121cafee2822ac78e95 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <stdarg.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include "sqlite3.h"
 #include "zpm.h"
@@ -35,9 +36,11 @@ sqlite3_stmt *zpm_dbqueryv(struct zpm *zpm, char *query, va_list args) {
        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;
        }
+       sqlite3_free(sql);
 
        return st;
 }
@@ -62,6 +65,47 @@ sqlite3_stmt *zpm_dbquery(struct zpm *zpm, char *query, ...) {
        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 ;
+}
+
+int zpm_findhash(struct zpm *zpm, char *find, char *dest) {
+       int count;
+       char *found;
+
+       count = zpm_db_int(zpm, "select count(*) from files where hash like '%q%%';", find);
+       if (count != 1) {
+               return count;
+       }
+       if (dest) {
+               found = zpm_db_string(zpm, "select hash from files where hash like '%s%%' limit 1;", find);
+               if (find) {
+                       strcpy(dest, found);
+                       free(found);
+               } else {
+                       count = 0;
+               }
+       }
+       return count;
+
+}
+
 char *zpm_db_string(struct zpm *zpm, char *query, ...) {
        sqlite3_stmt *st;
        va_list args;
@@ -74,12 +118,40 @@ char *zpm_db_string(struct zpm *zpm, char *query, ...) {
 
        rv = sqlite3_step(st);
 
-       if (rv == SQLITE_ROW) {
+       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;