annotate libsci/apic.c @ 35:084dee2bef50

man: updates
author David Demelier <markand@malikania.fr>
date Thu, 04 Aug 2022 18:01:29 +0200
parents 1d0ddf9e6efd
children b474f0985e39
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1 /*
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
2 * apic.c -- synchronous HTTP request
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
3 *
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
4 * Copyright (c) 2021-2022 David Demelier <markand@malikania.fr>
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
5 *
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
8 * copyright notice and this permission notice appear in all copies.
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
9 *
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
17 */
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
18
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <errno.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdarg.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <stdio.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <string.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <curl/curl.h>
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include "apic.h"
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include "util.h"
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 struct curlpack {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 CURL *curl;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 CURLcode code;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 struct curl_slist *headers;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 };
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
36 struct apiconf apiconf = {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
37 .baseurl = "http://127.0.0.1"
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
38 };
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
39
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 static size_t
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 writer(char *in, size_t n, size_t w, FILE *fp)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 if (fwrite(in, n, w, fp) != w)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 return 0;
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 return w;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 static inline char *
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 create_url(const char *fmt, va_list args)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 {
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
52 static _Thread_local char ret[1024];
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
53 char page[128];
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 va_list ap;
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 ret[0] = 0;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 va_copy(ap, args);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
58 vsnprintf(page, sizeof (page), fmt, ap);
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 va_end(ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
61 snprintf(ret, sizeof (ret), "%s/%s", apiconf.baseurl, page);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
62
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 return ret;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 static inline FILE *
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 create_file(char **buf, size_t *bufsz)
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 FILE *fp;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 *buf = NULL;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 *bufsz = 0;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 if (!(fp = open_memstream(buf, bufsz)))
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 util_die("open_memstream: %s\n", strerror(errno));
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 return fp;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 static struct curlpack
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 create_curl(FILE *fp, const char *body, const char *url)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 struct curlpack pack = {0};
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 pack.headers = curl_slist_append(pack.headers, "Content-Type: application/json");
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 pack.curl = curl_easy_init();
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 curl_easy_setopt(pack.curl, CURLOPT_HTTPHEADER, pack.headers);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 curl_easy_setopt(pack.curl, CURLOPT_URL, url);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 curl_easy_setopt(pack.curl, CURLOPT_FOLLOWLOCATION, 1L);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 curl_easy_setopt(pack.curl, CURLOPT_TIMEOUT, 3L);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 curl_easy_setopt(pack.curl, CURLOPT_WRITEFUNCTION, writer);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 curl_easy_setopt(pack.curl, CURLOPT_WRITEDATA, fp);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 curl_easy_setopt(pack.curl, CURLOPT_NOSIGNAL, 1L);
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 /* Assume POST request if there is a body. */
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 if (body) {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 curl_easy_setopt(pack.curl, CURLOPT_POSTFIELDS, body);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 curl_easy_setopt(pack.curl, CURLOPT_POSTFIELDSIZE, strlen(body));
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 pack.code = curl_easy_perform(pack.curl);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 return pack;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
105
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
106 static json_t *
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
107 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
108 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 FILE *fp;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 char *response, *url;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 size_t responsesz;
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
112 json_t *doc = NULL;
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 json_error_t error;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 struct curlpack curl;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 memset(req, 0, sizeof (*req));
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 url = create_url(fmt, ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 fp = create_file(&response, &responsesz);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 curl = create_curl(fp, body, url);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 /* Perform that request now. */
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 fclose(fp);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 if (curl.code != CURLE_OK)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 snprintf(req->error, sizeof (req->error), "%s", curl_easy_strerror(curl.code));
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 else {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 curl_easy_getinfo(curl.curl, CURLINFO_RESPONSE_CODE, &req->status);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 if (req->status != 200)
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 snprintf(req->error, sizeof (req->error), "HTTP returned %ld", req->status);
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
132 if (response[0] && !(doc = json_loads(response, 0, &error)))
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 snprintf(req->error, sizeof (req->error), "JSON parse error: %s", error.text);
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
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 curl_easy_cleanup(curl.curl);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 curl_slist_free_all(curl.headers);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 free(response);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
141 return doc;
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
144 static json_t *
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
145 get(struct apic *req, const char *fmt, ...)
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
146 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
147 va_list ap;
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
148 json_t *ret;
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
149
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
150 va_start(ap, fmt);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
151 ret = perform(req, NULL, fmt, ap);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
152 va_end(ap);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
153
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
154 if (!ret || (!json_is_object(ret) && !json_is_array(ret)))
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
155 snprintf(req->error, sizeof (req->error), "invalid JSON document received");
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
156
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
157 return ret;
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
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
160 static int
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
161 create(struct apic *req, json_t *doc, const char *fmt, ...)
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
162 {
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
163 va_list ap;
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
164 json_t *ret;
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
165 char *body;
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
166
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
167 memset(req, 0, sizeof (*req));
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
168 body = util_json_dump(doc);
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
169
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
170 va_start(ap, fmt);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
171 ret = perform(req, body, fmt, ap);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
172 va_end(ap);
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
173
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
174 /* TODO: update id. */
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
175 (void)ret;
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
176
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
177 free(body);
33
1d0ddf9e6efd misc: general documentation
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
178 json_decref(ret);
22
dd078aea5d02 misc: use project/worker name as primary key
David Demelier <markand@malikania.fr>
parents: 20
diff changeset
179
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
180 return 0;
22
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
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
183 json_t *
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
184 apic_get(struct apic *req, const char *fmt, ...)
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 assert(req);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 assert(fmt);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 va_list ap;
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
190 json_t *ret;
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 va_start(ap, fmt);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 ret = perform(req, NULL, fmt, ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 va_end(ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
195
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 return ret;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 }
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
199 json_t *
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
200 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
201 {
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 assert(req);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 assert(fmt);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
204
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 va_list ap;
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
206 json_t *ret;
19
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 char *body;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
208
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 if (!(body = json_dumps(doc, JSON_COMPACT)))
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 util_die("%s", strerror(ENOMEM));
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
211
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 va_start(ap, fmt);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 ret = perform(req, body, fmt, ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 va_end(ap);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 free(body);
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 return ret;
de4bf839b565 misc: revamp SQL
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 }
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
220
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
221 int
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
222 apic_job_add(struct apic *req, json_t *job)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
223 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
224 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
225 assert(job);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
226
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
227 return create(req, job, "api/v1/jobs");
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
228 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
229
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
230 json_t *
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
231 apic_job_todo(struct apic *req, const char *worker_name)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
232 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
233 assert(req);
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
234 assert(worker_name);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
235
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
236 return get(req, "api/v1/todo/%s", worker_name);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
237 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
238
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
239 int
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
240 apic_jobresult_add(struct apic *req, json_t *res)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
241 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
242 assert(req);
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
243 assert(res);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
244
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
245 return create(req, res, "api/v1/jobresults");
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
246 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
247
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
248 int
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
249 apic_project_save(struct apic *req, json_t *p)
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
250 {
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
251 assert(req);
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
252 assert(p);
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
253
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
254 return create(req, p, "api/v1/projects");
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
255 }
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
256
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
257 json_t *
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
258 apic_project_list(struct apic *req)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
259 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
260 assert(req);
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
261
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
262 return get(req, "api/v1/projects");
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
263 }
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
264
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
265 json_t *
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
266 apic_project_find(struct apic *req, const char *name)
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
267 {
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
268 assert(req);
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
269 assert(name);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
270
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
271 return get(req, "api/v1/projects/%s", name);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
272 }
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
273
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
274 int
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
275 apic_worker_save(struct apic *req, json_t *wk)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
276 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
277 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
278 assert(wk);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
279
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
280 return create(req, wk, "api/v1/workers");
20
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
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
283 json_t *
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
284 apic_worker_list(struct apic *req)
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
285 {
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
286 assert(req);
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
287
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
288 return get(req, "api/v1/workers");
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
289 }
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
290
27
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
291 json_t *
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
292 apic_worker_find(struct apic *req, const char *name)
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
293 {
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
294 assert(req);
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
295 assert(name);
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
296
dae2de19ca5d misc: switch to JSON everywhere
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
297 return get(req, "api/v1/workers/%s", name);
20
f98ea578b1ef misc: revamp database
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
298 }