]> pd.if.org Git - zpackage/blob - lib/dbquery.c
cba95378ae2a258c8351b9f3ac07191bc46ce337
[zpackage] / lib / dbquery.c
1 #define _POSIX_C_SOURCE 200809L
2
3 #include <stdarg.h>
4 #include <string.h>
5
6 #include "sqlite3.h"
7 #include "zpm.h"
8
9 #define SQLERROR(x) fprintf(stderr, "%s %d: %s\n", __func__, __LINE__, (x))
10
11 sqlite3_stmt *zpm_dbqueryv(struct zpm *zpm, char *query, va_list args) {
12         sqlite3 *db;
13         char *sql;
14         sqlite3_stmt *st;
15         int rv;
16
17         if (!zpm || zpm->error) {
18                 return 0;
19         }
20
21         if (!zpm->db) {
22                 zpm->error = 1;
23                 return 0;
24         }
25
26         db = zpm->db;
27
28         sql = sqlite3_vmprintf(query, args);
29
30         if (!sql) {
31                 zpm->error = 1;
32                 return 0;
33         }
34
35         rv = sqlite3_prepare_v2(db, sql, strlen(sql), &st, NULL);
36         if (rv != SQLITE_OK) {
37                 SQLERROR(sqlite3_errmsg(db));
38                 zpm->error = rv;
39                 return 0;
40         }
41
42         return st;
43 }
44
45 sqlite3_stmt *zpm_dbquery(struct zpm *zpm, char *query, ...) {
46         va_list args;
47         sqlite3_stmt *st;
48
49         if (!zpm || zpm->error) {
50                 return 0;
51         }
52
53         if (!zpm->db) {
54                 zpm->error = 1;
55                 return 0;
56         }
57
58         va_start(args, query);
59         st = zpm_dbqueryv(zpm, query, args);
60         va_end(args);
61
62         return st;
63 }
64
65 void zpm_db_run(struct zpm *zpm, char *query, ...) {
66         sqlite3_stmt *st;
67         va_list args;
68         int rv;
69
70         va_start(args, query);
71         st = zpm_dbqueryv(zpm, query, args);
72         va_end(args);
73
74         rv = sqlite3_step(st);
75
76         if (rv != SQLITE_DONE) {
77                 zpm->error = 1;
78                 zpm_seterror(zpm, "db error: %s", sqlite3_errstr(rv));
79         }
80
81         sqlite3_finalize(st);
82         return ;
83 }
84
85 char *zpm_db_string(struct zpm *zpm, char *query, ...) {
86         sqlite3_stmt *st;
87         va_list args;
88         int rv;
89         char *result = 0;
90
91         va_start(args, query);
92         st = zpm_dbqueryv(zpm, query, args);
93         va_end(args);
94
95         rv = sqlite3_step(st);
96
97         if (rv == SQLITE_ROW) {
98                 result = (char *)sqlite3_column_text(st, 0);
99                 if (result) {
100                         result = strdup(result);
101                 }
102         }
103
104         sqlite3_finalize(st);
105         return result;
106 }
107
108 int zpm_db_int(struct zpm *zpm, char *query, ...) {
109         sqlite3_stmt *st;
110         va_list args;
111         int rv;
112         int result = 0;
113
114         va_start(args, query);
115         st = zpm_dbqueryv(zpm, query, args);
116         va_end(args);
117
118         rv = sqlite3_step(st);
119
120         if (rv == SQLITE_ROW) {
121                 result = sqlite3_column_int(st, 0);
122         }
123         /* TODO set error if it's not SQLITE_ROW */
124
125         sqlite3_finalize(st);
126         return result;
127 }