]> pd.if.org Git - zpackage/blobdiff - lib/script_hash.c
remove stray debug fprintf
[zpackage] / lib / script_hash.c
index d4f03fafbff9f4940d645cdf2033e8ce0e25e4a0..67a167cad1fb777cc667ede7c24d3f90087ffc63 100644 (file)
@@ -1,3 +1,5 @@
+#define _POSIX_C_SOURCE 200809L
+
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
 #include "sqlite3.h"
 #include "zpm.h"
 
+int zpm_foreach_script(struct zpm *zpm, char *pkgstr, char *stage, void *cbd,
+               int (*cb)(void *ud, const char *pkg, const char *stage, const char *hash)) {
+       char *pkgid = 0;
+       char *sql;
+       sqlite3_str *s;
+       sqlite3_stmt *st;
+
+       char *find = "select printf('%%s-%%s-%%d', package, version, release) as pkgid, stage, hash from scripts where true";
+       char *pkgidwhere = " and printf('%%%%s-%%%%s-%%%%d', package, version, release) = %Q";
+       char *stagewhere = " and stage = %Q";
+
+       if (!zpm || !cb) {
+               return 0;
+       }
+       if (zpm->error) {
+               return 0;
+       }
+
+       if (pkgstr) {
+               pkgid = zpm_findpkg(zpm, pkgstr, 0);
+               if (!pkgid) {
+                       return 0;
+               }
+       }
+
+       s = sqlite3_str_new(zpm->db);
+       sqlite3_str_appendall(s, find);
+
+       if (pkgid)  {
+               sqlite3_str_appendf(s, pkgidwhere, pkgid);
+       }
+
+       if (stage) {
+               sqlite3_str_appendf(s, stagewhere, stage);
+       }
+
+       sql = sqlite3_str_finish(s);
+       if (!sql) {
+               zpm->error = 1;
+               if (pkgid) {
+                       free(pkgid);
+               }
+               return 0;
+       }
+
+       st = zpm_dbquery(zpm, sql);
+
+       if (!st) {
+               zpm->error = 1;
+               sqlite3_free(sql);
+               return 0;
+       }
+
+       int rv, cbrv = 0;
+       while ((rv = sqlite3_step(st)) == SQLITE_ROW) {
+               if (cb) {
+                       const char *sstage, *spkgid, *shash;
+                       int cbrv;
+
+                       spkgid = (const char *)sqlite3_column_text(st, 0);
+                       sstage = (const char *)sqlite3_column_text(st, 1);
+                       shash = (const char *)sqlite3_column_text(st, 2);
+
+                       cbrv = cb(cbd, spkgid, sstage, shash);
+                       if (cbrv) {
+                               break;
+                       }
+               }
+       }
+
+       if (rv != SQLITE_DONE) {
+               zpm->dbresult = rv;
+               zpm->error = 1;
+       }
+       
+       if (pkgid) {
+               free(pkgid);
+       }
+
+       sqlite3_free(sql);
+       return cbrv;
+}
+
+int zpm_script_set(struct zpm *zpm, char *pkgstr, char *phase, char *hash) {
+       char package[64];
+       char version[32];
+       int release;
+       char *insert =  "insert into scripts (package,version,release,stage,hash) values (%Q,%Q,%d,%Q,%Q) on conflict (package,version,release,stage) do update set hash = excluded.hash ";
+       char *delete =  "delete from scripts where package = ? and version = ? and release = ? and stage = ?";
+
+       if (!zpm || !zpm->db || !phase) {
+               return 0;
+       }
+
+       if (zpm_parse_package(pkgstr, package, version, &release)) {
+               if (hash) {
+                       zpm_db_run(zpm, insert, package, version, release, phase, hash);
+               } else {
+                       zpm_db_run(zpm, delete, package, version, release, phase);
+
+               }
+       }
+
+       return !zpm->error;
+}
+
 int zpm_script_hash(struct zpm *zpm, char *pkgstr, char *phase, char *hash) {
-       char *pkgid;
-       char *template = "select hash from scripts_pkgid where pkgid = %q and phase = %q";
+       char *pkgid = 0;
+       char *template = "select hash from scripts_pkgid where pkgid = %Q and stage = %Q";
        sqlite3_stmt *st;
 
-       pkgid = zpm_findpkg(zpm, pkgstr);
+       pkgid = zpm_findpkg(zpm, pkgstr, NULL);
 
        st = zpm_dbquery(zpm, template, pkgid, phase);
+
        free(pkgid);
 
        if (!st) {
+               zpm->error = 1;
+               zpm->errmsg = strdup(sqlite3_errmsg(zpm->db));
                return 0;
        }
 
@@ -26,6 +137,7 @@ int zpm_script_hash(struct zpm *zpm, char *pkgstr, char *phase, char *hash) {
                        hash[ZPM_HASH_STRLEN] = 0;
                        break;
                default: zpm->error = 1; /* fall through */
+                        zpm->errmsg = strdup(sqlite3_errmsg(zpm->db));
                case SQLITE_DONE:
                        sqlite3_finalize(st);
                        return 0; break; /* not found */