Mercurial > sci
annotate scid/db.c @ 18:600204c31bf0
misc: refactor
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 12 Jul 2022 20:20:51 +0200 |
parents | db.c@3ef8128e244f |
children |
rev | line source |
---|---|
5
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
1 /* |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
2 * db.c -- scid database access |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
3 * |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
4 * Copyright (c) 2021 David Demelier <markand@malikania.fr> |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
5 * |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
9 * |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
17 */ |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
18 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
19 #include <sys/queue.h> |
0 | 20 #include <assert.h> |
21 #include <stdlib.h> | |
22 #include <string.h> | |
23 | |
24 #include <sqlite3.h> | |
25 | |
26 #include "db.h" | |
27 #include "log.h" | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
28 #include "types.h" |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
29 #include "util.h" |
0 | 30 |
31 #include "sql/init.h" | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
32 #include "sql/job-add.h" |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
33 #include "sql/job-todo.h" |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
34 #include "sql/jobresult-add.h" |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
35 #include "sql/project-add.h" |
9
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
36 #include "sql/project-update.h" |
0 | 37 #include "sql/project-find.h" |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
38 #include "sql/project-find-id.h" |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
39 #include "sql/project-list.h" |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
40 #include "sql/worker-add.h" |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
41 #include "sql/worker-find.h" |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
42 #include "sql/worker-find-id.h" |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
43 #include "sql/worker-list.h" |
0 | 44 |
45 #define CHAR(v) (const char *)(v) | |
46 | |
47 static sqlite3 *db; | |
48 | |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
49 typedef void (*unpacker)(sqlite3_stmt *, struct db_ctx *, void *); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
50 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
51 struct str { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
52 char *str; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
53 SLIST_ENTRY(str) link; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
54 }; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
55 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
56 struct list { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
57 unpacker unpack; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
58 void *data; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
59 size_t datasz; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
60 size_t elemwidth; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
61 struct db_ctx *ctx; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
62 }; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
63 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
64 SLIST_HEAD(strlist, str); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
65 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
66 static struct strlist * |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
67 strlist_new(void) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
68 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
69 struct strlist *l; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
70 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
71 l = util_calloc(1, sizeof (*l)); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
72 SLIST_INIT(l); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
73 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
74 return l; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
75 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
76 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
77 static const char * |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
78 strlist_add(struct strlist *l, const char *text) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
79 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
80 struct str *s; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
81 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
82 s = util_calloc(1, sizeof (*s)); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
83 s->str = util_strdup(text); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
84 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
85 SLIST_INSERT_HEAD(l, s, link); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
86 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
87 return s->str; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
88 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
89 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
90 static void |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
91 strlist_free(struct strlist *l) |
0 | 92 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
93 struct str *s, *tmp; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
94 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
95 SLIST_FOREACH_SAFE(s, l, link, tmp) { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
96 free(s->str); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
97 free(s); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
98 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
99 |
5
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
100 free(l); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
101 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
102 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
103 static void |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
104 project_unpacker(sqlite3_stmt *stmt, struct db_ctx *ctx, struct project *project) |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
105 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
106 project->id = sqlite3_column_int(stmt, 0); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
107 project->name = strlist_add(ctx->handle, CHAR(sqlite3_column_text(stmt, 1))); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
108 project->desc = strlist_add(ctx->handle, CHAR(sqlite3_column_text(stmt, 2))); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
109 project->url = strlist_add(ctx->handle, CHAR(sqlite3_column_text(stmt, 3))); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
110 project->script = strlist_add(ctx->handle, CHAR(sqlite3_column_text(stmt, 4))); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
111 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
112 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
113 static void |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
114 worker_unpacker(sqlite3_stmt *stmt, struct db_ctx *ctx, struct worker *w) |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
115 { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
116 w->id = sqlite3_column_int(stmt, 0); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
117 w->name = strlist_add(ctx->handle, CHAR(sqlite3_column_text(stmt, 1))); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
118 w->desc = strlist_add(ctx->handle, CHAR(sqlite3_column_text(stmt, 2))); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
119 } |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
120 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
121 static void |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
122 job_unpacker(sqlite3_stmt *stmt, struct db_ctx *ctx, struct job *job) |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
123 { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
124 job->id = sqlite3_column_int(stmt, 0); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
125 job->tag = strlist_add(ctx->handle, CHAR(sqlite3_column_text(stmt, 1))); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
126 job->project_id = sqlite3_column_int(stmt, 2); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
127 } |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
128 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
129 static void |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
130 vbind(sqlite3_stmt *stmt, const char *fmt, va_list ap) |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
131 { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
132 for (int index = 1; *fmt; ++fmt) { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
133 switch (*fmt) { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
134 case 'i': |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
135 sqlite3_bind_int(stmt, index++, va_arg(ap, int)); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
136 break; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
137 case 's': |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
138 sqlite3_bind_text(stmt, index++, va_arg(ap, const char *), -1, SQLITE_STATIC); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
139 break; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
140 case 'z': |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
141 sqlite3_bind_int64(stmt, index++, va_arg(ap, size_t)); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
142 break; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
143 default: |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
144 break; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
145 } |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
146 } |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
147 } |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
148 |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
149 static int |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
150 insert(const char *sql, const char *fmt, ...) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
151 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
152 assert(sql); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
153 assert(fmt); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
154 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
155 sqlite3_stmt *stmt = NULL; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
156 va_list ap; |
5
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
157 int ret = -1; |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
158 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
159 if (sqlite3_prepare(db, sql, -1, &stmt, NULL) != SQLITE_OK) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
160 return log_warn("db: %s", sqlite3_errmsg(db)), -1; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
161 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
162 va_start(ap, fmt); |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
163 vbind(stmt, fmt, ap); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
164 va_end(ap); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
165 |
5
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
166 if (sqlite3_step(stmt) != SQLITE_DONE) |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
167 log_warn("db: %s", sqlite3_errmsg(db)); |
5
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
168 else |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
169 ret = sqlite3_last_insert_rowid(db); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
170 |
5
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
171 sqlite3_finalize(stmt); |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
172 |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
173 return ret; |
0 | 174 } |
175 | |
9
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
176 static int |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
177 update(const char *sql, const char *fmt, ...) |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
178 { |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
179 assert(sql); |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
180 assert(fmt); |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
181 |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
182 sqlite3_stmt *stmt = NULL; |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
183 va_list ap; |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
184 int ret = 1; |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
185 |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
186 if (sqlite3_prepare(db, sql, -1, &stmt, NULL) != SQLITE_OK) |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
187 return log_warn("db: %s", sqlite3_errmsg(db)), -1; |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
188 |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
189 va_start(ap, fmt); |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
190 vbind(stmt, fmt, ap); |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
191 va_end(ap); |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
192 |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
193 if (sqlite3_step(stmt) != SQLITE_DONE) |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
194 log_warn("db: %s", sqlite3_errmsg(db)); |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
195 else |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
196 ret = 0; |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
197 |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
198 sqlite3_finalize(stmt); |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
199 |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
200 return ret; |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
201 } |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
202 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
203 static ssize_t |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
204 list(struct list *sel, const char *sql, const char *args, ...) |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
205 { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
206 sqlite3_stmt *stmt = NULL; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
207 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
208 va_list ap; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
209 int step; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
210 ssize_t ret = -1; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
211 size_t tot = 0; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
212 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
213 sel->ctx->handle = NULL; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
214 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
215 if (sqlite3_prepare(db, sql, -1, &stmt, NULL) != SQLITE_OK) |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
216 return log_warn("db: %s", sqlite3_errmsg(db)), -1; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
217 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
218 va_start(ap, args); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
219 vbind(stmt, args, ap); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
220 va_end(ap); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
221 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
222 sel->ctx->handle = strlist_new(); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
223 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
224 while (tot < sel->datasz && (step = sqlite3_step(stmt)) == SQLITE_ROW) |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
225 sel->unpack(stmt, sel->ctx, (unsigned char *)sel->data + (tot++ * sel->elemwidth)); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
226 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
227 if (step == SQLITE_OK || step == SQLITE_DONE || step == SQLITE_ROW) |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
228 ret = tot; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
229 else { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
230 memset(sel->data, 0, sel->datasz * sel->elemwidth); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
231 strlist_free(sel->ctx->handle); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
232 sel->ctx->handle = NULL; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
233 } |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
234 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
235 sqlite3_finalize(stmt); |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
236 |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
237 return ret; |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
238 } |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
239 |
0 | 240 int |
241 db_open(const char *path) | |
242 { | |
243 assert(path); | |
244 | |
5
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
245 if (sqlite3_open(path, &db) != SQLITE_OK) |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
246 return log_warn("db: open error: %s", sqlite3_errmsg(db)), -1; |
0 | 247 |
248 /* Wait for 30 seconds to lock the database. */ | |
249 sqlite3_busy_timeout(db, 30000); | |
250 | |
5
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
251 if (sqlite3_exec(db, CHAR(sql_init), NULL, NULL, NULL) != SQLITE_OK) |
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
252 return log_warn("db: initialization error: %s", sqlite3_errmsg(db)), -1; |
0 | 253 |
254 return 0; | |
255 } | |
256 | |
257 int | |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
258 db_project_add(struct project *p) |
0 | 259 { |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
260 return (p->id = insert(CHAR(sql_project_add), "ssss", p->name, p->desc, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
261 p->url, p->script)) < 0 ? -1 : 0; |
0 | 262 } |
263 | |
9
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
264 int |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
265 db_project_update(const struct project *p) |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
266 { |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
267 assert(p); |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
268 |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
269 return update(CHAR(sql_project_update), "ssssi", p->name, p->desc, |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
270 p->url, p->script, p->id); |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
271 } |
3ef8128e244f
sci: add project-update command
David Demelier <markand@malikania.fr>
parents:
6
diff
changeset
|
272 |
0 | 273 ssize_t |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
274 db_project_list(struct db_ctx *ctx, struct project *projects, size_t projectsz) |
0 | 275 { |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
276 struct list sel = { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
277 .unpack = (unpacker)project_unpacker, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
278 .data = projects, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
279 .datasz = projectsz, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
280 .elemwidth = sizeof (*projects), |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
281 .ctx = ctx |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
282 }; |
0 | 283 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
284 return list(&sel, CHAR(sql_project_list), "z", projectsz); |
0 | 285 } |
286 | |
287 int | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
288 db_project_find(struct db_ctx *ctx, struct project *project) |
0 | 289 { |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
290 struct list sel = { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
291 .unpack = (unpacker)project_unpacker, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
292 .data = project, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
293 .datasz = 1, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
294 .elemwidth = sizeof (*project), |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
295 .ctx = ctx |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
296 }; |
0 | 297 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
298 return list(&sel, CHAR(sql_project_find), "s", project->name) == 1 ? 0 : -1; |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
299 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
300 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
301 int |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
302 db_project_find_id(struct db_ctx *ctx, struct project *project) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
303 { |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
304 struct list sel = { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
305 .unpack = (unpacker)project_unpacker, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
306 .data = project, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
307 .datasz = 1, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
308 .elemwidth = sizeof (*project), |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
309 .ctx = ctx |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
310 }; |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
311 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
312 return list(&sel, CHAR(sql_project_find_id), "i", project->id) == 1 ? 0 : -1; |
0 | 313 } |
314 | |
315 int | |
316 db_worker_add(struct worker *wk) | |
317 { | |
318 assert(wk); | |
319 | |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
320 return (wk->id = insert(CHAR(sql_worker_add), "ss", wk->name, wk->desc)) < 0 ? -1 : 0; |
0 | 321 } |
322 | |
323 ssize_t | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
324 db_worker_list(struct db_ctx *ctx, struct worker *wk, size_t wksz) |
0 | 325 { |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
326 assert(ctx); |
0 | 327 assert(wk); |
328 | |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
329 struct list sel = { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
330 .unpack = (unpacker)worker_unpacker, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
331 .data = wk, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
332 .datasz = wksz, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
333 .elemwidth = sizeof (*wk), |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
334 .ctx = ctx |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
335 }; |
0 | 336 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
337 return list(&sel, CHAR(sql_worker_list), "z", wksz); |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
338 } |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
339 |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
340 int |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
341 db_worker_find(struct db_ctx *ctx, struct worker *wk) |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
342 { |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
343 struct list sel = { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
344 .unpack = (unpacker)worker_unpacker, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
345 .data = wk, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
346 .datasz = 1, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
347 .elemwidth = sizeof (*wk), |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
348 .ctx = ctx |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
349 }; |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
350 |
5
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
351 return list(&sel, CHAR(sql_worker_find), "s", wk->name) == 1 ? 0 : -1; |
0 | 352 } |
353 | |
354 int | |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
355 db_worker_find_id(struct db_ctx *ctx, struct worker *wk) |
0 | 356 { |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
357 struct list sel = { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
358 .unpack = (unpacker)worker_unpacker, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
359 .data = wk, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
360 .datasz = 1, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
361 .elemwidth = sizeof (*wk), |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
362 .ctx = ctx |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
363 }; |
0 | 364 |
5
566bc028cdcb
tests: initial tests coming
David Demelier <markand@malikania.fr>
parents:
4
diff
changeset
|
365 return list(&sel, CHAR(sql_worker_find_id), "i", wk->id) == 1 ? 0 : -1; |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
366 } |
0 | 367 |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
368 int |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
369 db_job_add(struct job *job) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
370 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
371 assert(job); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
372 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
373 return (job->id = insert(CHAR(sql_job_add), |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
374 "si", job->tag, job->project_id)) < 0 ? -1 : 0; |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
375 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
376 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
377 ssize_t |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
378 db_job_todo(struct db_ctx *ctx, struct job *jobs, size_t jobsz, int worker_id) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
379 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
380 assert(ctx); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
381 assert(jobs); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
382 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
383 struct list sel = { |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
384 .unpack = (unpacker)job_unpacker, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
385 .data = jobs, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
386 .datasz = jobsz, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
387 .elemwidth = sizeof (*jobs), |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
388 .ctx = ctx |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
389 }; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
390 |
6
8c408176d2b1
scid: past jobs are not listed for new workers
David Demelier <markand@malikania.fr>
parents:
5
diff
changeset
|
391 return list(&sel, CHAR(sql_job_todo), "iiz", worker_id, worker_id, jobsz); |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
392 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
393 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
394 int |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
395 db_jobresult_add(struct jobresult *r) |
1
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
396 { |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
397 assert(r); |
5afdb14df924
sci: add support for storing results
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
398 |
4
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
399 return (r->id = insert(CHAR(sql_jobresult_add), "iiis", r->job_id, |
9c4fea43803c
scid: some refactoring in db
David Demelier <markand@malikania.fr>
parents:
3
diff
changeset
|
400 r->worker_id, r->exitcode, r->log)) < 0 ? -1 : 0; |
0 | 401 } |
402 | |
403 void | |
404 db_finish(void) | |
405 { | |
406 if (db) { | |
407 sqlite3_close(db); | |
408 db = NULL; | |
409 } | |
410 } | |
3
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
411 |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
412 void |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
413 db_ctx_finish(struct db_ctx *ctx) |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
414 { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
415 if (ctx->handle) { |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
416 strlist_free(ctx->handle); |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
417 ctx->handle = NULL; |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
418 } |
215c0c3b3609
misc: use JSON everywhere (scictl/sciwebd)
David Demelier <markand@malikania.fr>
parents:
2
diff
changeset
|
419 } |