aboutsummaryrefslogtreecommitdiff
path: root/src/cmd_fiscal.c
diff options
context:
space:
mode:
authorAnders Betts <anders.betts@gmail.com>2026-09-20 21:55:04 +0200
committerAnders Betts <anders.betts@gmail.com>2026-09-20 22:02:57 +0200
commitceff3d26732a7fde2f66df0270269d3bebcfabf7 (patch)
tree4ad6677617cae9de4aa4b5b42352a7a8cf29a3e9 /src/cmd_fiscal.c
parent10a535ace098144980d0ffd1593f6384c39cc221 (diff)
downloadbokf-ceff3d26732a7fde2f66df0270269d3bebcfabf7.tar.gz
bokf-ceff3d26732a7fde2f66df0270269d3bebcfabf7.zip
commands: shared DB-error helpers
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'src/cmd_fiscal.c')
-rw-r--r--src/cmd_fiscal.c40
1 files changed, 17 insertions, 23 deletions
diff --git a/src/cmd_fiscal.c b/src/cmd_fiscal.c
index 94d2429..3f8e2c2 100644
--- a/src/cmd_fiscal.c
+++ b/src/cmd_fiscal.c
@@ -58,7 +58,7 @@ static yyjson_mut_val *h_fiscal_year_list(struct req *r)
"SELECT " FY_COLUMNS " FROM fiscal_years WHERE org_id=?1"
" ORDER BY start_date",
-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_arr_add_val(items, fy_json(r, st));
@@ -79,7 +79,7 @@ static yyjson_mut_val *h_fiscal_year_get(struct req *r)
: "SELECT " FY_COLUMNS " FROM fiscal_years"
" WHERE org_id=?1 ORDER BY start_date DESC LIMIT 1";
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)
sqlite3_bind_int64(st, 2, id);
@@ -156,7 +156,7 @@ static yyjson_mut_val *h_fiscal_year_open(struct req *r)
"events,employees,notes,created_at)"
" VALUES(?1,?2,?3,?4,?5,?6,?7,?8)",
-1, &st, NULL) != SQLITE_OK)
- return fail(r, "INTERNAL", "database error");
+ return db_error(r);
sqlite3_bind_int64(st, 1, r->org_id);
sqlite3_bind_text(st, 2, label, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(st, 3, start, -1, SQLITE_TRANSIENT);
@@ -199,7 +199,7 @@ static yyjson_mut_val *h_fiscal_year_close(struct req *r)
"UPDATE fiscal_years SET status='closed', closed_at=?3,"
" closed_by=?4 WHERE org_id=?1 AND id=?2 AND status='open'",
-1, &st, NULL) != SQLITE_OK)
- return fail(r, "INTERNAL", "database error");
+ return db_error(r);
sqlite3_bind_int64(st, 1, r->org_id);
sqlite3_bind_int64(st, 2, id);
sqlite3_bind_text(st, 3, ts, -1, SQLITE_TRANSIENT);
@@ -207,7 +207,7 @@ static yyjson_mut_val *h_fiscal_year_close(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", "open fiscal year not found");
char *reqjson = audit_args_json(r->args);
@@ -236,13 +236,13 @@ static yyjson_mut_val *h_fiscal_year_reopen(struct req *r)
"UPDATE fiscal_years SET status='open', closed_at=NULL,"
" closed_by=NULL WHERE org_id=?1 AND id=?2 AND status='closed'",
-1, &st, NULL) != SQLITE_OK)
- return fail(r, "INTERNAL", "database error");
+ return db_error(r);
sqlite3_bind_int64(st, 1, r->org_id);
sqlite3_bind_int64(st, 2, id);
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", "closed fiscal year not found");
char *reqjson = audit_args_json(r->args);
@@ -282,7 +282,7 @@ static yyjson_mut_val *h_fiscal_year_update(struct req *r)
"SELECT count(*) FROM fiscal_years"
" WHERE org_id=?1 AND id=?2",
-1, &st, NULL) != SQLITE_OK)
- return fail(r, "INTERNAL", "database error");
+ return db_error(r);
sqlite3_bind_int64(st, 1, r->org_id);
sqlite3_bind_int64(st, 2, id);
int64_t exists = 0;
@@ -315,24 +315,18 @@ static yyjson_mut_val *h_fiscal_year_update(struct req *r)
" notes=COALESCE(?8,notes)"
" WHERE org_id=?1 AND id=?2",
-1, &st, NULL) != SQLITE_OK)
- return fail(r, "INTERNAL", "database error");
+ return db_error(r);
sqlite3_bind_int64(st, 1, r->org_id);
sqlite3_bind_int64(st, 2, id);
sqlite3_bind_int64(st, 3, have_div ? dividend : -1);
for (int i = 0; i < 4; i++) {
- if (svals[i])
- sqlite3_bind_text(st, i + 4, svals[i], -1, SQLITE_TRANSIENT);
- else
- sqlite3_bind_null(st, i + 4);
+ bind_text_or_null(st, i + 4, svals[i]);
}
- if (notes)
- sqlite3_bind_text(st, 8, notes, -1, SQLITE_TRANSIENT);
- else
- sqlite3_bind_null(st, 8);
+ bind_text_or_null(st, 8, notes);
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);
char *reqjson = audit_args_json(r->args);
audit_append(r->db, r->org_id, r->sess->user_id, r->sess->token_id,
"fiscal_year.update", reqjson, "OK", NULL);
@@ -341,7 +335,7 @@ static yyjson_mut_val *h_fiscal_year_update(struct req *r)
"SELECT " FY_COLUMNS " FROM fiscal_years"
" WHERE org_id=?1 AND id=?2",
-1, &st, NULL) != SQLITE_OK)
- return fail(r, "INTERNAL", "database error");
+ return db_error(r);
sqlite3_bind_int64(st, 1, r->org_id);
sqlite3_bind_int64(st, 2, id);
yyjson_mut_val *o = NULL;
@@ -367,14 +361,14 @@ static yyjson_mut_val *h_period_lock(struct req *r)
"UPDATE fiscal_years SET locked_until=?3 WHERE org_id=?1 AND id=?2"
" AND ?3 BETWEEN start_date AND end_date",
-1, &st, NULL) != SQLITE_OK)
- return fail(r, "INTERNAL", "database error");
+ return db_error(r);
sqlite3_bind_int64(st, 1, r->org_id);
sqlite3_bind_int64(st, 2, fy);
sqlite3_bind_text(st, 3, until, -1, SQLITE_TRANSIENT);
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",
"fiscal year not found or until is outside it");
@@ -399,13 +393,13 @@ static yyjson_mut_val *h_period_unlock(struct req *r)
r->db,
"UPDATE fiscal_years SET locked_until=NULL WHERE org_id=?1 AND id=?2",
-1, &st, NULL) != SQLITE_OK)
- return fail(r, "INTERNAL", "database error");
+ return db_error(r);
sqlite3_bind_int64(st, 1, r->org_id);
sqlite3_bind_int64(st, 2, fy);
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", "fiscal year not found");
char *reqjson = audit_args_json(r->args);