comparison db.c @ 1:5afdb14df924

sci: add support for storing results
author David Demelier <markand@malikania.fr>
date Tue, 08 Jun 2021 08:40:01 +0200
parents f1de39079243
children 5fa3d2f479b2
comparison
equal deleted inserted replaced
0:f1de39079243 1:5afdb14df924
11 #include "worker.h" 11 #include "worker.h"
12 12
13 #include "sql/init.h" 13 #include "sql/init.h"
14 #include "sql/job-queue.h" 14 #include "sql/job-queue.h"
15 #include "sql/job-queue-list.h" 15 #include "sql/job-queue-list.h"
16 #include "sql/job-save.h"
16 #include "sql/project-insert.h" 17 #include "sql/project-insert.h"
17 #include "sql/project-get.h" 18 #include "sql/project-get.h"
18 #include "sql/project-find.h" 19 #include "sql/project-find.h"
19 #include "sql/worker-get.h" 20 #include "sql/worker-get.h"
21 #include "sql/worker-find.h"
20 #include "sql/worker-insert.h" 22 #include "sql/worker-insert.h"
21 23
22 #define CHAR(v) (const char *)(v) 24 #define CHAR(v) (const char *)(v)
23 25
24 static sqlite3 *db; 26 static sqlite3 *db;
91 sqlite3_stmt *stmt = NULL; 93 sqlite3_stmt *stmt = NULL;
92 struct project *p = projects; 94 struct project *p = projects;
93 ssize_t ret = 0; 95 ssize_t ret = 0;
94 96
95 if (sqlite3_prepare(db, CHAR(sql_project_get), -1, &stmt, NULL) != SQLITE_OK) { 97 if (sqlite3_prepare(db, CHAR(sql_project_get), -1, &stmt, NULL) != SQLITE_OK) {
96 log_warn("%s", sqlite3_errmsg(db)); 98 log_warn("db: %s", sqlite3_errmsg(db));
97 return -1; 99 return -1;
98 } 100 }
99 101
100 sqlite3_bind_int64(stmt, 1, projectsz); 102 sqlite3_bind_int64(stmt, 1, projectsz);
101 103
127 ret = 0; 129 ret = 0;
128 convert_project(project, stmt); 130 convert_project(project, stmt);
129 131
130 sqlite3_err: 132 sqlite3_err:
131 if (ret < 0) 133 if (ret < 0)
132 log_warn("%s", sqlite3_errmsg(db)); 134 log_warn("db: %s", sqlite3_errmsg(db));
133 if (stmt) 135 if (stmt)
134 sqlite3_finalize(stmt); 136 sqlite3_finalize(stmt);
135 137
136 return ret; 138 return ret;
137 } 139 }
183 strlcpy(w->desc, CHAR(sqlite3_column_text(stmt, 2)), sizeof (w->desc)); 185 strlcpy(w->desc, CHAR(sqlite3_column_text(stmt, 2)), sizeof (w->desc));
184 } 186 }
185 187
186 sqlite3_err: 188 sqlite3_err:
187 if (ret < 0) 189 if (ret < 0)
188 log_warn("%s", sqlite3_errmsg(db)); 190 log_warn("db: %s", sqlite3_errmsg(db));
191 if (stmt)
192 sqlite3_finalize(stmt);
193
194 return ret;
195 }
196
197 int
198 db_worker_find(struct worker *w, const char *name)
199 {
200 assert(w);
201 assert(name);
202
203 sqlite3_stmt *stmt = NULL;
204 int ret = -1;
205
206 if (sqlite3_prepare(db, CHAR(sql_worker_find), -1, &stmt, NULL) != SQLITE_OK)
207 goto sqlite3_err;
208
209 sqlite3_bind_text(stmt, 1, name, -1, SQLITE_STATIC);
210
211 if (sqlite3_step(stmt) != SQLITE_ROW)
212 goto sqlite3_err;
213
214 ret = 0;
215 w->id = sqlite3_column_int64(stmt, 0);
216 strlcpy(w->name, CHAR(sqlite3_column_text(stmt, 1)), sizeof (w->name));
217 strlcpy(w->desc, CHAR(sqlite3_column_text(stmt, 2)), sizeof (w->desc));
218
219 sqlite3_err:
220 if (ret < 0)
221 log_warn("db: %s", sqlite3_errmsg(db));
189 if (stmt) 222 if (stmt)
190 sqlite3_finalize(stmt); 223 sqlite3_finalize(stmt);
191 224
192 return ret; 225 return ret;
193 } 226 }
202 235
203 if (sqlite3_prepare(db, CHAR(sql_job_queue), -1, &stmt, NULL) != SQLITE_OK) 236 if (sqlite3_prepare(db, CHAR(sql_job_queue), -1, &stmt, NULL) != SQLITE_OK)
204 goto sqlite3_err; 237 goto sqlite3_err;
205 238
206 sqlite3_bind_text(stmt, 1, job->tag, -1, SQLITE_STATIC); 239 sqlite3_bind_text(stmt, 1, job->tag, -1, SQLITE_STATIC);
207 sqlite3_bind_int64(stmt, 2, job->project_id); 240 sqlite3_bind_int64(stmt, 2, job->project.id);
208 241
209 if (sqlite3_step(stmt) != SQLITE_DONE) 242 if (sqlite3_step(stmt) != SQLITE_DONE)
210 goto sqlite3_err; 243 goto sqlite3_err;
211 244
212 job->id = sqlite3_last_insert_rowid(db); 245 job->id = sqlite3_last_insert_rowid(db);
213 ret = 0; 246 ret = 0;
214 247
215 sqlite3_err: 248 sqlite3_err:
216 if (ret < 0) 249 if (ret < 0)
217 log_warn("%s", sqlite3_errmsg(db)); 250 log_warn("db: %s", sqlite3_errmsg(db));
218 if (stmt) 251 if (stmt)
219 sqlite3_finalize(stmt); 252 sqlite3_finalize(stmt);
220 253
221 return ret; 254 return ret;
222 } 255 }
223 256
224 ssize_t 257 ssize_t
225 db_job_queue_list(struct job *jobs, size_t jobsz, int64_t project_id) 258 db_job_result_todo(struct job_result *re, size_t resz, int64_t project_id)
226 { 259 {
227 assert(jobs); 260 assert(re);
228 261
229 sqlite3_stmt *stmt = NULL; 262 sqlite3_stmt *stmt = NULL;
230 ssize_t ret = 0; 263 ssize_t ret = 0;
231 struct job *j = jobs;
232 264
233 if (sqlite3_prepare(db, CHAR(sql_job_queue_list), -1, &stmt, NULL) != SQLITE_OK) { 265 if (sqlite3_prepare(db, CHAR(sql_job_queue_list), -1, &stmt, NULL) != SQLITE_OK) {
234 log_warn("%s", sqlite3_errmsg(db)); 266 log_warn("db: %s", sqlite3_errmsg(db));
235 return -1; 267 return -1;
236 } 268 }
237 269
238 sqlite3_bind_int64(stmt, 1, project_id); 270 sqlite3_bind_int64(stmt, 1, project_id);
239 sqlite3_bind_int64(stmt, 1, jobsz); 271 sqlite3_bind_int64(stmt, 2, resz);
240 272
241 for (; sqlite3_step(stmt) == SQLITE_ROW && (size_t)ret < jobsz; ++ret, ++j) { 273 while (sqlite3_step(stmt) == SQLITE_ROW && (size_t)ret++ < resz) {
242 j->id = sqlite3_column_int64(stmt, 0); 274 memset(re, 0, sizeof (*re));
243 j->project_id = sqlite3_column_int64(stmt, 2); 275
244 strlcpy(j->tag, CHAR(sqlite3_column_text(stmt, 1)), sizeof (j->tag)); 276 re->job.id = sqlite3_column_int64(stmt, 0);
245 } 277 strlcpy(re->job.tag, CHAR(sqlite3_column_text(stmt, 1)), sizeof (re->job.tag));
246 278
279 re->worker.id = sqlite3_column_int64(stmt, 2);
280 strlcpy(re->worker.name, CHAR(sqlite3_column_text(stmt, 3)), sizeof (re->worker.name));
281 strlcpy(re->worker.desc, CHAR(sqlite3_column_text(stmt, 4)), sizeof (re->worker.desc));
282
283 re->job.project.id = sqlite3_column_int64(stmt, 5);
284 strlcpy(re->job.project.name, CHAR(sqlite3_column_text(stmt, 6)), sizeof (re->job.project.name));
285 strlcpy(re->job.project.desc, CHAR(sqlite3_column_text(stmt, 7)), sizeof (re->job.project.desc));
286 strlcpy(re->job.project.url, CHAR(sqlite3_column_text(stmt, 8)), sizeof (re->job.project.url));
287 strlcpy(re->job.project.script, CHAR(sqlite3_column_text(stmt, 9)), sizeof (re->job.project.script));
288
289 ++re;
290 };
291
292 if (stmt)
293 sqlite3_finalize(stmt);
294
295 return ret;
296 }
297
298 int
299 db_job_save(struct job_result *r)
300 {
301 assert(r);
302
303 sqlite3_stmt *stmt = NULL;
304 int ret = -1;
305
306 if (sqlite3_prepare(db, CHAR(sql_job_save), -1, &stmt, NULL) != SQLITE_OK)
307 goto sqlite3_err;
308
309 sqlite3_bind_int64(stmt, 1, r->job.id);
310 sqlite3_bind_int64(stmt, 2, r->worker.id);
311 sqlite3_bind_int(stmt, 3, r->status);
312 sqlite3_bind_int(stmt, 4, r->retcode);
313 sqlite3_bind_text(stmt, 5, r->console, -1, SQLITE_STATIC);
314
315 if (sqlite3_step(stmt) != SQLITE_DONE)
316 goto sqlite3_err;
317
318 ret = 0;
319 r->id = sqlite3_last_insert_rowid(db);
320
321 sqlite3_err:
322 if (ret < 0)
323 log_warn("db: %s", sqlite3_errmsg(db));
247 if (stmt) 324 if (stmt)
248 sqlite3_finalize(stmt); 325 sqlite3_finalize(stmt);
249 326
250 return ret; 327 return ret;
251 } 328 }