X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=lib%2Fscript_hash.c;h=67a167cad1fb777cc667ede7c24d3f90087ffc63;hb=be765ec4d3dc14dd27826326e29da8a62d5603f7;hp=d4f03fafbff9f4940d645cdf2033e8ce0e25e4a0;hpb=7fa585701657aa1969f2116e71bfcb18c00ca7f0;p=zpackage diff --git a/lib/script_hash.c b/lib/script_hash.c index d4f03fa..67a167c 100644 --- a/lib/script_hash.c +++ b/lib/script_hash.c @@ -1,3 +1,5 @@ +#define _POSIX_C_SOURCE 200809L + #include #include #include @@ -5,17 +7,126 @@ #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 */