annotate lib/apic.c @ 23:2cb228f23f53

misc: rework todo/jobs HTTP requests
author David Demelier <markand@malikania.fr>
date Thu, 21 Jul 2022 21:55:02 +0200
parents dd078aea5d02
children 34cbbd215ef7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 #include <assert.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 #include <errno.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 #include <stdarg.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 #include <stdio.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 #include <string.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
6
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 #include <curl/curl.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
8
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 #include "apic.h"
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
10 #include "types.h"
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 #include "util.h"
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
12
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 struct curlpack {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 CURL *curl;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 CURLcode code;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 struct curl_slist *headers;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 };
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
19 struct converter {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
20 void *data;
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
21 size_t datasz;
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
22 ssize_t (*unpack)(void *, size_t, json_t *);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
23 json_t *(*pack)(const void *, size_t);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
24 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
25
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
26 struct apiconf apiconf = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
27 .baseurl = "http://127.0.0.1"
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
28 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
29
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 static size_t
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 writer(char *in, size_t n, size_t w, FILE *fp)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 if (fwrite(in, n, w, fp) != w)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 return 0;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 return w;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 static inline char *
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 create_url(const char *fmt, va_list args)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 static _Thread_local char ret[256];
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
43 char page[128];
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 va_list ap;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 ret[0] = 0;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 va_copy(ap, args);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
48 vsnprintf(page, sizeof (page), fmt, ap);
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 va_end(ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
50
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
51 snprintf(ret, sizeof (ret), "%s/%s", apiconf.baseurl, page);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
52
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 return ret;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 static inline FILE *
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 create_file(char **buf, size_t *bufsz)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 FILE *fp;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 *buf = NULL;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 *bufsz = 0;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 if (!(fp = open_memstream(buf, bufsz)))
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 util_die("open_memstream: %s\n", strerror(errno));
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 return fp;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 static struct curlpack
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 create_curl(FILE *fp, const char *body, const char *url)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 struct curlpack pack = {0};
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 pack.headers = curl_slist_append(pack.headers, "Content-Type: application/json");
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 pack.curl = curl_easy_init();
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 curl_easy_setopt(pack.curl, CURLOPT_HTTPHEADER, pack.headers);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 curl_easy_setopt(pack.curl, CURLOPT_URL, url);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 curl_easy_setopt(pack.curl, CURLOPT_FOLLOWLOCATION, 1L);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 curl_easy_setopt(pack.curl, CURLOPT_TIMEOUT, 3L);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 curl_easy_setopt(pack.curl, CURLOPT_WRITEFUNCTION, writer);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 curl_easy_setopt(pack.curl, CURLOPT_WRITEDATA, fp);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 curl_easy_setopt(pack.curl, CURLOPT_NOSIGNAL, 1L);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
84
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 /* Assume POST request if there is a body. */
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 if (body) {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 curl_easy_setopt(pack.curl, CURLOPT_POSTFIELDS, body);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 curl_easy_setopt(pack.curl, CURLOPT_POSTFIELDSIZE, strlen(body));
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 pack.code = curl_easy_perform(pack.curl);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 return pack;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 static int
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
97 perform(struct apic *req, const char *body, const char *fmt, va_list ap)
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 FILE *fp;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 char *response, *url;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 size_t responsesz;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 json_error_t error;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 int ret = -1;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 struct curlpack curl;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
105
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 memset(req, 0, sizeof (*req));
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 url = create_url(fmt, ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 fp = create_file(&response, &responsesz);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 curl = create_curl(fp, body, url);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
111
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 /* Perform that request now. */
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 fclose(fp);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 if (curl.code != CURLE_OK)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 snprintf(req->error, sizeof (req->error), "%s", curl_easy_strerror(curl.code));
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 else {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 curl_easy_getinfo(curl.curl, CURLINFO_RESPONSE_CODE, &req->status);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 if (req->status != 200)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 snprintf(req->error, sizeof (req->error), "HTTP returned %ld", req->status);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 if (response[0] && !(req->doc = json_loads(response, 0, &error)))
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 snprintf(req->error, sizeof (req->error), "JSON parse error: %s", error.text);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 else
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 ret = 0;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 curl_easy_cleanup(curl.curl);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 curl_slist_free_all(curl.headers);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
130
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 free(response);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 return ret;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
135
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
136 static ssize_t
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
137 get(struct apic *req, const struct converter *cv, const char *fmt, ...)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
138 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
139 va_list ap;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
140 ssize_t ret;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
141
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
142 va_start(ap, fmt);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
143 ret = perform(req, NULL, fmt, ap);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
144 va_end(ap);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
145
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
146 if (ret < 0)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
147 return -1;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
148 if (!req->doc || (!json_is_object(req->doc) && !json_is_array(req->doc)))
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
149 return snprintf(req->error, sizeof (req->error), "invalid JSON document received"), -1;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
150 if ((ret = cv->unpack(cv->data, cv->datasz, req->doc)) < 0)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
151 return snprintf(req->error, sizeof (req->error), "%s", strerror(errno));
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
152
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
153 return ret;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
154 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
155
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
156 static int
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
157 create(struct apic *req, const struct converter *cv, const char *fmt, ...)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
158 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
159 va_list ap;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
160 int ret;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
161 json_t *doc;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
162 char *body;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
163
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
164 memset(req, 0, sizeof (*req));
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
165
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
166 if (!(doc = cv->pack(cv->data, cv->datasz)))
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
167 return snprintf(req->error, sizeof (req->error), "%s", strerror(errno));
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
168 if (!(body = json_dumps(doc, JSON_COMPACT))) {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
169 json_decref(doc);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
170 return snprintf(req->error, sizeof (req->error), "%s", strerror(errno));
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
171 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
172
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
173 va_start(ap, fmt);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
174 ret = perform(req, body, fmt, ap);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
175 va_end(ap);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
176
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
177 json_decref(doc);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
178 free(body);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
179
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
180 return 0;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
181 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
182
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
183 static json_t *
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
184 wrap_job_to(const void *data, size_t datasz)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
185 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
186 return job_to(data, datasz);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
187 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
188
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
189 static ssize_t
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
190 wrap_job_from(void *data, size_t datasz, json_t *doc)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
191 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
192 return job_from(data, datasz, doc);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
193 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
194
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
195 static json_t *
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
196 wrap_jobresult_to(const void *data, size_t datasz)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
197 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
198 return jobresult_to(data, datasz);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
199 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
200
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
201 static ssize_t
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
202 wrap_project_from(void *data, size_t datasz, json_t *doc)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
203 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
204 return project_from(data, datasz, doc);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
205 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
206
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
207 static json_t *
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
208 wrap_project_to(const void *data, size_t datasz)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
209 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
210 return project_to(data, datasz);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
211 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
212
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
213 static ssize_t
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
214 wrap_worker_from(void *data, size_t datasz, json_t *doc)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
215 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
216 return worker_from(data, datasz, doc);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
217 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
218
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
219 static json_t *
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
220 wrap_worker_to(const void *data, size_t datasz)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
221 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
222 return worker_to(data, datasz);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
223 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
224
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
225 static ssize_t
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
226 wrap_jobresult_from(void *data, size_t datasz, json_t *doc)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
227 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
228 return jobresult_from(data, datasz, doc);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
229 }
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
230
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 int
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
232 apic_get(struct apic *req, const char *fmt, ...)
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 assert(req);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 assert(fmt);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
236
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 va_list ap;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 int ret;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
239
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 va_start(ap, fmt);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 ret = perform(req, NULL, fmt, ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 va_end(ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
243
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 return ret;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
246
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 int
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
248 apic_post(struct apic *req, const json_t *doc, const char *fmt, ...)
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 assert(req);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 assert(fmt);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 va_list ap;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 int ret;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 char *body;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
256
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 if (!(body = json_dumps(doc, JSON_COMPACT)))
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 util_die("%s", strerror(ENOMEM));
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
259
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 va_start(ap, fmt);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 ret = perform(req, body, fmt, ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 va_end(ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
263
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 free(body);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
265
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 return ret;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 }
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
268
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
269 int
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
270 apic_job_add(struct apic *req, struct job *job)
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
271 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
272 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
273 assert(job);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
274
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
275 const struct converter cv = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
276 .data = job,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
277 .datasz = 1,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
278 .pack = wrap_job_to,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
279 .unpack = wrap_job_from
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
280 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
281
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
282 return create(req, &cv, "api/v1/jobs");
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
283 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
284
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
285 ssize_t
23
2cb228f23f53 misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
286 apic_job_todo(struct apic *req, struct job *jobs, size_t jobsz, const char *worker_name)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
287 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
288 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
289 assert(jobs);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
290
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
291 struct converter cv = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
292 .data = jobs,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
293 .datasz = 1,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
294 .unpack = wrap_job_from
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
295 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
296
23
2cb228f23f53 misc: rework todo/jobs HTTP requests
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
297 return get(req, &cv, "api/v1/todo/%s", worker_name);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
298 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
299
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
300 int
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
301 apic_jobresult_add(struct apic *req, struct jobresult *result)
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
302 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
303 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
304 assert(result);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
305
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
306 struct converter cv = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
307 .data = result,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
308 .datasz = 1,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
309 .pack = wrap_jobresult_to,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
310 .unpack = wrap_jobresult_from
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
311 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
312
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
313 return create(req, &cv, "api/v1/jobresults");
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
314 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
315
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
316 int
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
317 apic_project_save(struct apic *req, struct project *project)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
318 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
319 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
320 assert(project);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
321
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
322 struct converter cv = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
323 .data = project,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
324 .datasz = 1,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
325 .pack = wrap_project_to,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
326 .unpack = wrap_project_from
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
327 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
328
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
329 return create(req, &cv, "api/v1/projects");
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
330 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
331
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
332 int
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
333 apic_project_update(struct apic *req, struct project *project)
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
334 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
335 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
336 assert(project);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
337
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
338 struct converter cv = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
339 .data = project,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
340 .datasz = 1,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
341 .pack = wrap_project_to,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
342 .unpack = wrap_project_from
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
343 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
344
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
345 return create(req, &cv, "api/v1/projects");
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
346 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
347
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
348 ssize_t
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
349 apic_project_list(struct apic *req, struct project *projects, size_t projectsz)
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
350 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
351 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
352 assert(projects);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
353
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
354 struct converter cv = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
355 .data = projects,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
356 .datasz = projectsz,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
357 .unpack = wrap_project_from
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
358 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
359
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
360 return get(req, &cv, "api/v1/projects");
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
361 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
362
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
363 int
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
364 apic_project_find(struct apic *req, struct project *project, const char *name)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
365 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
366 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
367 assert(project);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
368
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
369 struct converter cv = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
370 .data = project,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
371 .datasz = 1,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
372 .unpack = wrap_project_from
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
373 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
374
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
375 return get(req, &cv, "api/v1/projects/%s", name);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
376 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
377
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
378 int
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
379 apic_worker_save(struct apic *req, struct worker *wk)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
380 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
381 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
382 assert(wk);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
383
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
384 struct converter cv = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
385 .data = wk,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
386 .datasz = 1,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
387 .pack = wrap_worker_to
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
388 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
389
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
390 return create(req, &cv, "api/v1/workers");
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
391 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
392
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
393 ssize_t
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
394 apic_worker_list(struct apic *req, struct worker *wk, size_t wksz)
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
395 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
396 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
397 assert(wk);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
398 assert(wksz);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
399
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
400 struct converter cv = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
401 .data = wk,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
402 .datasz = wksz,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
403 .unpack = wrap_worker_from
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
404 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
405
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
406 return get(req, &cv, "api/v1/workers");
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
407 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
408
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
409 int
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
410 apic_worker_find(struct apic *req, struct worker *wk, const char *name)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
411 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
412 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
413 assert(wk);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
414
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
415 struct converter cv = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
416 .data = wk,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
417 .datasz = 1,
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
418 .unpack = wrap_worker_from
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
419 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
420
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
421 return get(req, &cv, "api/v1/workers/%s", name);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
422 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
423
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
424 void
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
425 apic_finish(struct apic *req)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
426 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
427 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
428
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
429 if (req->doc)
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
430 json_decref(req->doc);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
431
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
432 memset(req, 0, sizeof (*req));
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
433 }