]> pd.if.org Git - zpackage/blob - lib/script_hash.c
add foreach_script function
[zpackage] / lib / script_hash.c
1 #define _POSIX_C_SOURCE 200809L
2
3 #include <stdarg.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 #include "sqlite3.h"
8 #include "zpm.h"
9
10 int zpm_foreach_script(struct zpm *zpm, char *pkgstr, char *stage, void *cbd,
11                 int (*cb)(void *ud, const char *pkg, const char *stage, const char *hash)) {
12         char *pkgid = 0;
13         char *sql;
14         sqlite3_str *s;
15         sqlite3_stmt *st;
16
17         char *find = "select printf('%s-%s-%d', package, version, release) as pkgid, stage, hash from scripts where true";
18         char *pkgidwhere = " and printf('%s-%s-%d', package, version, release) = %Q";
19         char *stagewhere = " and stage = %Q";
20
21         if (!zpm || !cb) {
22                 return 0;
23         }
24         if (zpm->error) {
25                 return 0;
26         }
27
28         if (pkgstr) {
29                 pkgid = zpm_findpkg(zpm, pkgstr, 0);
30                 if (!pkgid) {
31                         return 0;
32                 }
33         }
34
35         s = sqlite3_str_new(zpm->db);
36         sqlite3_str_appendall(s, find);
37
38         if (pkgid)  {
39                 sqlite3_str_appendf(s, pkgidwhere, pkgid);
40         }
41
42         if (stage) {
43                 sqlite3_str_appendf(s, stagewhere, stage);
44         }
45
46         sql = sqlite3_str_value(s);
47         if (!sql) {
48                 sqlite3_str_finish(s);
49                 zpm->error = 1;
50                 if (pkgid) {
51                         free(pkgid);
52                 }
53                 return 0;
54         }
55
56         st = zpm_dbquery(zpm, sql);
57         int rv, cbrv = 0;
58         while ((rv = sqlite3_step(st)) == SQLITE_ROW) {
59                 if (cb) {
60                         const char *sstage, *spkgid, *shash;
61                         int cbrv;
62
63                         spkgid = (const char *)sqlite3_column_text(st, 0);
64                         sstage = (const char *)sqlite3_column_text(st, 1);
65                         shash = (const char *)sqlite3_column_text(st, 2);
66
67                         cbrv = cb(cbd, spkgid, sstage, shash);
68                         if (cbrv) {
69                                 break;
70                         }
71                 }
72         }
73
74         if (rv != SQLITE_DONE) {
75                 zpm->dbresult = rv;
76                 zpm->error = 1;
77         }
78         
79         if (pkgid) {
80                 free(pkgid);
81         }
82
83         return cbrv;
84 }
85
86 int zpm_script_set(struct zpm *zpm, char *pkgstr, char *phase, char *hash) {
87         char package[64];
88         char version[32];
89         int release;
90         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 ";
91         char *delete =  "delete from scripts where package = ? and version = ? and release = ? and stage = ?";
92
93         if (!zpm || !zpm->db || !phase) {
94                 return 0;
95         }
96
97         if (zpm_parse_package(pkgstr, package, version, &release)) {
98                 if (hash) {
99                         zpm_db_run(zpm, insert, package, version, release, phase, hash);
100                 } else {
101                         zpm_db_run(zpm, delete, package, version, release, phase);
102
103                 }
104         }
105
106         return !zpm->error;
107 }
108
109 int zpm_script_hash(struct zpm *zpm, char *pkgstr, char *phase, char *hash) {
110         char *pkgid = 0;
111         char *template = "select hash from scripts_pkgid where pkgid = %Q and stage = %Q";
112         sqlite3_stmt *st;
113
114         pkgid = zpm_findpkg(zpm, pkgstr, NULL);
115
116         st = zpm_dbquery(zpm, template, pkgid, phase);
117
118         free(pkgid);
119
120         if (!st) {
121                 zpm->error = 1;
122                 zpm->errmsg = strdup(sqlite3_errmsg(zpm->db));
123                 return 0;
124         }
125
126         switch (sqlite3_step(st)) {
127                 case SQLITE_ROW:
128                         strncpy(hash, (const char *) sqlite3_column_text(st, 0),
129                                         ZPM_HASH_STRLEN);
130                         hash[ZPM_HASH_STRLEN] = 0;
131                         break;
132                 default: zpm->error = 1; /* fall through */
133                          zpm->errmsg = strdup(sqlite3_errmsg(zpm->db));
134                 case SQLITE_DONE:
135                         sqlite3_finalize(st);
136                         return 0; break; /* not found */
137         }
138
139         sqlite3_finalize(st);
140         return 1;
141 }