diff options
| author | Anders Betts <anders.betts@gmail.com> | 2026-09-20 21:55:04 +0200 |
|---|---|---|
| committer | Anders Betts <anders.betts@gmail.com> | 2026-09-20 22:02:57 +0200 |
| commit | ceff3d26732a7fde2f66df0270269d3bebcfabf7 (patch) | |
| tree | 4ad6677617cae9de4aa4b5b42352a7a8cf29a3e9 /src/cmd_fiscal.c | |
| parent | 10a535ace098144980d0ffd1593f6384c39cc221 (diff) | |
| download | bokf-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.c | 40 |
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); |
