#define _POSIX_C_SOURCE 200809L #include #include #include #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 = 0; char *template = "select hash from scripts_pkgid where pkgid = %Q and stage = %Q"; sqlite3_stmt *st; 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; } switch (sqlite3_step(st)) { case SQLITE_ROW: strncpy(hash, (const char *) sqlite3_column_text(st, 0), ZPM_HASH_STRLEN); 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 */ } sqlite3_finalize(st); return 1; }