From ceff3d26732a7fde2f66df0270269d3bebcfabf7 Mon Sep 17 00:00:00 2001 From: Anders Betts Date: Sun, 20 Sep 2026 21:55:04 +0200 Subject: commands: shared DB-error helpers Co-Authored-By: Claude Opus 5 --- src/cmd_templates.c | 45 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) (limited to 'src/cmd_templates.c') diff --git a/src/cmd_templates.c b/src/cmd_templates.c index a134d96..7e40886 100644 --- a/src/cmd_templates.c +++ b/src/cmd_templates.c @@ -65,7 +65,7 @@ static int parse_template_rows(struct req *r, yyjson_val *rowsv, " AND number=?2", -1, &st, NULL) != SQLITE_OK) { free(rows); - return fail(r, "INTERNAL", "database error") ? -1 : -1; + return db_error(r) ? -1 : -1; } sqlite3_bind_int64(st, 1, r->org_id); sqlite3_bind_text(st, 2, account, -1, SQLITE_TRANSIENT); @@ -124,7 +124,7 @@ static yyjson_mut_val *h_template_list(struct req *r) " 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 fail(r, "INTERNAL", "database error"); + 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); @@ -160,7 +160,7 @@ static yyjson_mut_val *h_template_get(struct req *r) : "SELECT id,name,series,description,active" " FROM voucher_templates WHERE org_id=?1 AND name=?2"; if (sqlite3_prepare_v2(r->db, sql, -1, &st, NULL) != SQLITE_OK) - return fail(r, "INTERNAL", "database error"); + return db_error(r); sqlite3_bind_int64(st, 1, r->org_id); if (id > 0) sqlite3_bind_int64(st, 2, id); @@ -255,7 +255,7 @@ static yyjson_mut_val *h_template_create(struct req *r) -1, &st, NULL) != SQLITE_OK) { db_exec(r->db, "ROLLBACK", NULL); free(rows); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } sqlite3_bind_int64(st, 1, r->org_id); sqlite3_bind_text(st, 2, name, -1, SQLITE_TRANSIENT); @@ -269,7 +269,7 @@ static yyjson_mut_val *h_template_create(struct req *r) free(rows); if ((rc & 0xff) == SQLITE_CONSTRAINT) return fail(r, "CONFLICT", "a template with that name exists"); - return fail(r, "INTERNAL", sqlite3_errmsg(r->db)); + return db_sqlite_error(r); } int64_t tpl = db_last_id(r->db); for (size_t i = 0; i < nrows; i++) { @@ -280,7 +280,7 @@ static yyjson_mut_val *h_template_create(struct req *r) -1, &st, NULL) != SQLITE_OK) { db_exec(r->db, "ROLLBACK", NULL); free(rows); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } sqlite3_bind_int64(st, 1, r->org_id); sqlite3_bind_int64(st, 2, tpl); @@ -296,7 +296,7 @@ static yyjson_mut_val *h_template_create(struct req *r) if (rc != SQLITE_DONE) { db_exec(r->db, "ROLLBACK", NULL); free(rows); - return fail(r, "INTERNAL", sqlite3_errmsg(r->db)); + return db_sqlite_error(r); } } free(rows); @@ -369,21 +369,12 @@ static yyjson_mut_val *h_template_update(struct req *r) -1, &st, NULL) != SQLITE_OK) { db_exec(r->db, "ROLLBACK", NULL); free(rows); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } sqlite3_bind_int64(st, 1, r->org_id); - if (new_name) - sqlite3_bind_text(st, 2, new_name, -1, SQLITE_TRANSIENT); - else - sqlite3_bind_null(st, 2); - if (series) - sqlite3_bind_text(st, 3, series, -1, SQLITE_TRANSIENT); - else - sqlite3_bind_null(st, 3); - if (description) - sqlite3_bind_text(st, 4, description, -1, SQLITE_TRANSIENT); - else - sqlite3_bind_null(st, 4); + bind_text_or_null(st, 2, new_name); + bind_text_or_null(st, 3, series); + bind_text_or_null(st, 4, description); sqlite3_bind_int(st, 5, active); sqlite3_bind_text(st, 6, ts, -1, SQLITE_TRANSIENT); sqlite3_bind_int64(st, 7, head.id); @@ -392,7 +383,7 @@ static yyjson_mut_val *h_template_update(struct req *r) if (rc != SQLITE_DONE) { db_exec(r->db, "ROLLBACK", NULL); free(rows); - return fail(r, "INTERNAL", sqlite3_errmsg(r->db)); + return db_sqlite_error(r); } if (rowsv) { if (sqlite3_prepare_v2( @@ -402,7 +393,7 @@ static yyjson_mut_val *h_template_update(struct req *r) -1, &st, NULL) != SQLITE_OK) { db_exec(r->db, "ROLLBACK", NULL); free(rows); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } sqlite3_bind_int64(st, 1, r->org_id); sqlite3_bind_int64(st, 2, head.id); @@ -411,7 +402,7 @@ static yyjson_mut_val *h_template_update(struct req *r) if (rc != SQLITE_DONE) { db_exec(r->db, "ROLLBACK", NULL); free(rows); - return fail(r, "INTERNAL", sqlite3_errmsg(r->db)); + return db_sqlite_error(r); } for (size_t i = 0; i < nrows; i++) { if (sqlite3_prepare_v2( @@ -422,7 +413,7 @@ static yyjson_mut_val *h_template_update(struct req *r) -1, &st, NULL) != SQLITE_OK) { db_exec(r->db, "ROLLBACK", NULL); free(rows); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } sqlite3_bind_int64(st, 1, r->org_id); sqlite3_bind_int64(st, 2, head.id); @@ -438,7 +429,7 @@ static yyjson_mut_val *h_template_update(struct req *r) if (rc != SQLITE_DONE) { db_exec(r->db, "ROLLBACK", NULL); free(rows); - return fail(r, "INTERNAL", sqlite3_errmsg(r->db)); + return db_sqlite_error(r); } } } @@ -466,7 +457,7 @@ static yyjson_mut_val *h_template_archive(struct req *r) : "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 fail(r, "INTERNAL", "database error"); + return db_error(r); sqlite3_bind_int64(st, 1, r->org_id); if (id > 0) sqlite3_bind_int64(st, 2, id); @@ -475,7 +466,7 @@ static yyjson_mut_val *h_template_archive(struct req *r) int rc = sqlite3_step(st); sqlite3_finalize(st); if (rc != SQLITE_DONE) - return fail(r, "INTERNAL", sqlite3_errmsg(r->db)); + return db_sqlite_error(r); if (sqlite3_changes(r->db) == 0) return fail(r, "NOT_FOUND", "template not found"); char *reqjson = audit_args_json(r->args); -- cgit v1.3