Mercurial > sci
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 } |