aboutsummaryrefslogtreecommitdiff
path: root/src/cmd_templates.c
diff options
context:
space:
mode:
authorAnders Betts <anders.betts@gmail.com>2026-09-21 09:47:50 +0200
committerAnders Betts <anders.betts@gmail.com>2026-09-21 11:01:07 +0200
commitb1956aa73a533702ccbc3d7713ea90dd5ae44b9b (patch)
tree7d3d4c8db28cbe15cfdf916f74ea7d77a5666414 /src/cmd_templates.c
parente25a8c9ae70e5a310c1a82be55d0dbf58ba71250 (diff)
downloadbokf-b1956aa73a533702ccbc3d7713ea90dd5ae44b9b.tar.gz
bokf-b1956aa73a533702ccbc3d7713ea90dd5ae44b9b.zip
commands: db_row_json and db_exec_bound helpers
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'src/cmd_templates.c')
-rw-r--r--src/cmd_templates.c67
1 files changed, 16 insertions, 51 deletions
diff --git a/src/cmd_templates.c b/src/cmd_templates.c
index 7e40886..eb98ea4 100644
--- a/src/cmd_templates.c
+++ b/src/cmd_templates.c
@@ -93,25 +93,14 @@ static int parse_template_rows(struct req *r, yyjson_val *rowsv,
static yyjson_mut_val *tpl_rows_json(struct req *r, sqlite3_stmt *st)
{
- yyjson_mut_val *o = yyjson_mut_obj(r->rdoc);
- yyjson_mut_obj_add_int(r->rdoc, o, "line_no", sqlite3_column_int64(st, 0));
- yyjson_mut_obj_add_strcpy(r->rdoc, o, "account",
- sq(sqlite3_column_text(st, 1)));
- yyjson_mut_obj_add_strcpy(r->rdoc, o, "name",
- sq(sqlite3_column_text(st, 2)));
- yyjson_mut_obj_add_strcpy(r->rdoc, o, "formula",
- sq(sqlite3_column_text(st, 3)));
- yyjson_mut_obj_add_strcpy(r->rdoc, o, "description",
- sq(sqlite3_column_text(st, 4)));
- return o;
+ return db_row_json(r->rdoc, st,
+ "line_no:i,account:s,name:s,formula:s,description:s");
}
static yyjson_mut_val *h_template_list(struct req *r)
{
int active_only = 0;
arg_bool(r->args, "active_only", &active_only);
- yyjson_mut_val *items = yyjson_mut_arr(r->rdoc);
- sqlite3_stmt *st = NULL;
const char *sql =
active_only
? "SELECT t.id,t.name,t.series,t.description,t.active,"
@@ -123,27 +112,9 @@ static yyjson_mut_val *h_template_list(struct req *r)
"(SELECT count(*) FROM voucher_template_rows tr"
" WHERE tr.org_id=t.org_id AND tr.template_id=t.id)"
" FROM voucher_templates t WHERE t.org_id=?1 ORDER BY t.name";
- if (sqlite3_prepare_v2(r->db, sql, -1, &st, NULL) != SQLITE_OK)
- return db_error(r);
- sqlite3_bind_int64(st, 1, r->org_id);
- while (sqlite3_step(st) == SQLITE_ROW) {
- yyjson_mut_val *o = yyjson_mut_arr_add_obj(r->rdoc, items);
- yyjson_mut_obj_add_int(r->rdoc, o, "id", sqlite3_column_int64(st, 0));
- yyjson_mut_obj_add_strcpy(r->rdoc, o, "name",
- sq(sqlite3_column_text(st, 1)));
- yyjson_mut_obj_add_strcpy(r->rdoc, o, "series",
- sq(sqlite3_column_text(st, 2)));
- yyjson_mut_obj_add_strcpy(r->rdoc, o, "description",
- sq(sqlite3_column_text(st, 3)));
- yyjson_mut_obj_add_bool(r->rdoc, o, "active",
- sqlite3_column_int(st, 4) != 0);
- yyjson_mut_obj_add_int(r->rdoc, o, "row_count",
- sqlite3_column_int64(st, 5));
- }
- sqlite3_finalize(st);
- yyjson_mut_val *out = yyjson_mut_obj(r->rdoc);
- yyjson_mut_obj_add_val(r->rdoc, out, "items", items);
- return out;
+ return req_list(r, sql,
+ "id:i,name:s,series:s,description:s,active:b,row_count:i",
+ "i", r->org_id);
}
static yyjson_mut_val *h_template_get(struct req *r)
@@ -450,23 +421,17 @@ static yyjson_mut_val *h_template_archive(struct req *r)
const char *name = arg_str(r->args, "name");
if (id <= 0 && !name)
return fail(r, "INVALID_ARGS", "id or name is required");
- sqlite3_stmt *st = NULL;
- const char *sql =
- id > 0 ? "UPDATE voucher_templates SET active=0 WHERE org_id=?1"
- " AND id=?2"
- : "UPDATE voucher_templates SET active=0 WHERE org_id=?1"
- " AND name=?2";
- if (sqlite3_prepare_v2(r->db, sql, -1, &st, NULL) != SQLITE_OK)
- return db_error(r);
- sqlite3_bind_int64(st, 1, r->org_id);
- if (id > 0)
- sqlite3_bind_int64(st, 2, id);
- else
- sqlite3_bind_text(st, 2, name, -1, SQLITE_TRANSIENT);
- int rc = sqlite3_step(st);
- sqlite3_finalize(st);
- if (rc != SQLITE_DONE)
- return db_sqlite_error(r);
+ int rc = id > 0
+ ? req_exec(r,
+ "UPDATE voucher_templates SET active=0 WHERE org_id=?1"
+ " AND id=?2",
+ "ii", r->org_id, id)
+ : req_exec(r,
+ "UPDATE voucher_templates SET active=0 WHERE org_id=?1"
+ " AND name=?2",
+ "is", r->org_id, name);
+ if (rc != 0)
+ return NULL;
if (sqlite3_changes(r->db) == 0)
return fail(r, "NOT_FOUND", "template not found");
char *reqjson = audit_args_json(r->args);