]> pd.if.org Git - zpackage/blob - lib/script_hash.c
2185f77cae20a4dc22ac6ce5f06bf2cda0fac4fe
[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_script_set(struct zpm *zpm, char *pkgstr, char *phase, char *hash) {
11         char package[64];
12         char version[32];
13         int release;
14         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 ";
15         char *delete =  "delete from scripts where package = ? and version = ? and release = ? and stage = ?";
16
17         if (!zpm || !zpm->db || !phase) {
18                 return 0;
19         }
20
21         if (zpm_parse_package(pkgstr, package, version, &release)) {
22                 if (hash) {
23                         zpm_db_run(zpm, insert, package, version, release, phase, hash);
24                 } else {
25                         zpm_db_run(zpm, delete, package, version, release, phase);
26
27                 }
28         }
29
30         return !zpm->error;
31 }
32
33 int zpm_script_hash(struct zpm *zpm, char *pkgstr, char *phase, char *hash) {
34         char *pkgid = 0;
35         char *template = "select hash from scripts_pkgid where pkgid = %Q and stage = %Q";
36         sqlite3_stmt *st;
37
38         pkgid = zpm_findpkg(zpm, pkgstr);
39
40         st = zpm_dbquery(zpm, template, pkgid, phase);
41
42         free(pkgid);
43
44         if (!st) {
45                 zpm->error = 1;
46                 zpm->errmsg = strdup(sqlite3_errmsg(zpm->db));
47                 return 0;
48         }
49
50         switch (sqlite3_step(st)) {
51                 case SQLITE_ROW:
52                         strncpy(hash, (const char *) sqlite3_column_text(st, 0),
53                                         ZPM_HASH_STRLEN);
54                         hash[ZPM_HASH_STRLEN] = 0;
55                         break;
56                 default: zpm->error = 1; /* fall through */
57                          zpm->errmsg = strdup(sqlite3_errmsg(zpm->db));
58                 case SQLITE_DONE:
59                         sqlite3_finalize(st);
60                         return 0; break; /* not found */
61         }
62
63         sqlite3_finalize(st);
64         return 1;
65 }