]> pd.if.org Git - zpackage/blob - lib/script_hash.c
use unsigned longs for op counts
[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_finish(s);
47         if (!sql) {
48                 zpm->error = 1;
49                 if (pkgid) {
50                         free(pkgid);
51                 }
52                 return 0;
53         }
54
55         st = zpm_dbquery(zpm, sql);
56
57         if (!st) {
58                 zpm->error = 1;
59                 sqlite3_free(sql);
60                 return 0;
61         }
62
63         int rv, cbrv = 0;
64         while ((rv = sqlite3_step(st)) == SQLITE_ROW) {
65                 if (cb) {
66                         const char *sstage, *spkgid, *shash;
67                         int cbrv;
68
69                         spkgid = (const char *)sqlite3_column_text(st, 0);
70                         sstage = (const char *)sqlite3_column_text(st, 1);
71                         shash = (const char *)sqlite3_column_text(st, 2);
72
73                         cbrv = cb(cbd, spkgid, sstage, shash);
74                         if (cbrv) {
75                                 break;
76                         }
77                 }
78         }
79
80         if (rv != SQLITE_DONE) {
81                 zpm->dbresult = rv;
82                 zpm->error = 1;
83         }
84         
85         if (pkgid) {
86                 free(pkgid);
87         }
88
89         sqlite3_free(sql);
90         return cbrv;
91 }
92
93 int zpm_script_set(struct zpm *zpm, char *pkgstr, char *phase, char *hash) {
94         char package[64];
95         char version[32];
96         int release;
97         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 ";
98         char *delete =  "delete from scripts where package = ? and version = ? and release = ? and stage = ?";
99
100         if (!zpm || !zpm->db || !phase) {
101                 return 0;
102         }
103
104         if (zpm_parse_package(pkgstr, package, version, &release)) {
105                 if (hash) {
106                         zpm_db_run(zpm, insert, package, version, release, phase, hash);
107                 } else {
108                         zpm_db_run(zpm, delete, package, version, release, phase);
109
110                 }
111         }
112
113         return !zpm->error;
114 }
115
116 int zpm_script_hash(struct zpm *zpm, char *pkgstr, char *phase, char *hash) {
117         char *pkgid = 0;
118         char *template = "select hash from scripts_pkgid where pkgid = %Q and stage = %Q";
119         sqlite3_stmt *st;
120
121         pkgid = zpm_findpkg(zpm, pkgstr, NULL);
122
123         st = zpm_dbquery(zpm, template, pkgid, phase);
124
125         free(pkgid);
126
127         if (!st) {
128                 zpm->error = 1;
129                 zpm->errmsg = strdup(sqlite3_errmsg(zpm->db));
130                 return 0;
131         }
132
133         switch (sqlite3_step(st)) {
134                 case SQLITE_ROW:
135                         strncpy(hash, (const char *) sqlite3_column_text(st, 0),
136                                         ZPM_HASH_STRLEN);
137                         hash[ZPM_HASH_STRLEN] = 0;
138                         break;
139                 default: zpm->error = 1; /* fall through */
140                          zpm->errmsg = strdup(sqlite3_errmsg(zpm->db));
141                 case SQLITE_DONE:
142                         sqlite3_finalize(st);
143                         return 0; break; /* not found */
144         }
145
146         sqlite3_finalize(st);
147         return 1;
148 }