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_bank.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_bank.c')
| -rw-r--r-- | src/cmd_bank.c | 58 |
1 files changed, 23 insertions, 35 deletions
diff --git a/src/cmd_bank.c b/src/cmd_bank.c index b1ab2e3..82d5574 100644 --- a/src/cmd_bank.c +++ b/src/cmd_bank.c @@ -301,7 +301,7 @@ static yyjson_mut_val *h_bank_import(struct req *r) free(setting); free(rows); free(csv); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } if (!found) { yyjson_mut_val *res = @@ -337,7 +337,7 @@ static yyjson_mut_val *h_bank_import(struct req *r) free(setting); free(rows); free(csv); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } sqlite3_bind_int64(q, 1, r->org_id); sqlite3_bind_blob(q, 2, sorted[i], 32, SQLITE_TRANSIENT); @@ -394,7 +394,7 @@ static yyjson_mut_val *h_bank_import(struct req *r) free(setting); free(rows); free(csv); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } if (db_exec(r->db, "COMMIT", NULL) != 0) { db_exec(r->db, "ROLLBACK", NULL); @@ -402,7 +402,7 @@ static yyjson_mut_val *h_bank_import(struct req *r) free(setting); free(rows); free(csv); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } } int64_t duplicates = (int64_t)nrows - imported; @@ -476,20 +476,11 @@ static yyjson_mut_val *h_bank_list(struct req *r) " WHERE m.org_id=t.org_id AND m.transaction_id=t.id)))" " ORDER BY t.booked_at,t.id LIMIT ?6", -1, &st, NULL) != SQLITE_OK) - return fail(r, "INTERNAL", "database error"); + return db_error(r); sqlite3_bind_int64(st, 1, r->org_id); - if (account) - sqlite3_bind_text(st, 2, account, -1, SQLITE_TRANSIENT); - else - sqlite3_bind_null(st, 2); - if (from) - sqlite3_bind_text(st, 3, from, -1, SQLITE_TRANSIENT); - else - sqlite3_bind_null(st, 3); - if (to) - sqlite3_bind_text(st, 4, to, -1, SQLITE_TRANSIENT); - else - sqlite3_bind_null(st, 4); + bind_text_or_null(st, 2, account); + bind_text_or_null(st, 3, from); + bind_text_or_null(st, 4, to); sqlite3_bind_int64(st, 5, status_code); sqlite3_bind_int64(st, 6, limit); @@ -533,7 +524,7 @@ static yyjson_mut_val *h_bank_list(struct req *r) " GROUP BY v.id,v.series,v.number,v.date ORDER BY v.id", -1, &ms, NULL) != SQLITE_OK) { sqlite3_finalize(st); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } sqlite3_bind_int64(ms, 1, r->org_id); sqlite3_bind_text(ms, 2, tx_account, -1, SQLITE_TRANSIENT); @@ -576,7 +567,7 @@ static yyjson_mut_val *h_bank_list(struct req *r) "v.id LIMIT 3", -1, &ss, NULL) != SQLITE_OK) { sqlite3_finalize(st); - return fail(r, "INTERNAL", "database error"); + return db_error(r); } sqlite3_bind_int64(ss, 1, r->org_id); sqlite3_bind_text(ss, 2, tx_account, -1, SQLITE_TRANSIENT); @@ -616,10 +607,7 @@ static yyjson_mut_val *h_bank_list(struct req *r) " WHERE t.org_id=?1 AND (?2 IS NULL OR t.account=?2)", -1, &sum, NULL) == SQLITE_OK) { sqlite3_bind_int64(sum, 1, r->org_id); - if (account) - sqlite3_bind_text(sum, 2, account, -1, SQLITE_TRANSIENT); - else - sqlite3_bind_null(sum, 2); + bind_text_or_null(sum, 2, account); if (sqlite3_step(sum) == SQLITE_ROW) { int64_t total = sqlite3_column_int64(sum, 0); matched = sqlite3_column_int64(sum, 1); @@ -678,7 +666,7 @@ static yyjson_mut_val *h_bank_match(struct req *r) "SELECT account,amount_ore FROM bank_transactions" " 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, tx_id); if (sqlite3_step(st) != SQLITE_ROW) { @@ -693,7 +681,7 @@ static yyjson_mut_val *h_bank_match(struct req *r) if (sqlite3_prepare_v2( r->db, "SELECT 1 FROM vouchers 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, voucher_id); found = sqlite3_step(st) == SQLITE_ROW; @@ -708,7 +696,7 @@ static yyjson_mut_val *h_bank_match(struct req *r) " JOIN accounts a ON a.org_id=r.org_id AND a.id=r.account_id" " WHERE r.org_id=?1 AND r.voucher_id=?2 AND a.number=?3", -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, voucher_id); sqlite3_bind_text(st, 3, account, -1, SQLITE_TRANSIENT); @@ -724,7 +712,7 @@ static yyjson_mut_val *h_bank_match(struct req *r) "SELECT 1 FROM bank_matches WHERE org_id=?1 AND transaction_id=?2" " AND voucher_id=?3", -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, tx_id); sqlite3_bind_int64(st, 3, voucher_id); @@ -736,7 +724,7 @@ static yyjson_mut_val *h_bank_match(struct req *r) int64_t legs = 0; if (bank_legs_sum(r->db, r->org_id, tx_id, account, &legs) != 0) - return fail(r, "INTERNAL", "database error"); + return db_error(r); if (r->dry_run) { sqlite3_stmt *vs = NULL; int64_t voucher_leg = 0; @@ -747,7 +735,7 @@ static yyjson_mut_val *h_bank_match(struct req *r) " JOIN accounts a ON a.org_id=r.org_id AND a.id=r.account_id" " WHERE r.org_id=?1 AND r.voucher_id=?2 AND a.number=?3", -1, &vs, NULL) != SQLITE_OK) - return fail(r, "INTERNAL", "database error"); + return db_error(r); sqlite3_bind_int64(vs, 1, r->org_id); sqlite3_bind_int64(vs, 2, voucher_id); sqlite3_bind_text(vs, 3, account, -1, SQLITE_TRANSIENT); @@ -770,7 +758,7 @@ static yyjson_mut_val *h_bank_match(struct req *r) "INSERT INTO bank_matches(org_id,transaction_id,voucher_id," "matched_at,matched_by,kind) VALUES(?1,?2,?3,?4,?5,'manual')", -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, tx_id); sqlite3_bind_int64(st, 3, voucher_id); @@ -779,7 +767,7 @@ static yyjson_mut_val *h_bank_match(struct req *r) int rc = sqlite3_step(st); sqlite3_finalize(st); if (rc != SQLITE_DONE) - return fail(r, "INTERNAL", "database error"); + return db_error(r); char *reqjson = audit_args_json(r->args); audit_append(r->db, r->org_id, r->sess->user_id, r->sess->token_id, @@ -787,7 +775,7 @@ static yyjson_mut_val *h_bank_match(struct req *r) free(reqjson); if (bank_legs_sum(r->db, r->org_id, tx_id, account, &legs) != 0) - return fail(r, "INTERNAL", "database error"); + return db_error(r); yyjson_mut_val *o = yyjson_mut_obj(r->rdoc); yyjson_mut_obj_add_int(r->rdoc, o, "transaction_id", tx_id); yyjson_mut_obj_add_int(r->rdoc, o, "voucher_id", voucher_id); @@ -808,7 +796,7 @@ static yyjson_mut_val *h_bank_unmatch(struct req *r) "SELECT 1 FROM bank_matches WHERE org_id=?1 AND transaction_id=?2" " AND voucher_id=?3", -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, tx_id); sqlite3_bind_int64(st, 3, voucher_id); @@ -822,14 +810,14 @@ static yyjson_mut_val *h_bank_unmatch(struct req *r) "DELETE FROM bank_matches WHERE org_id=?1" " AND transaction_id=?2 AND voucher_id=?3", -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, tx_id); sqlite3_bind_int64(st, 3, voucher_id); int rc = sqlite3_step(st); sqlite3_finalize(st); if (rc != SQLITE_DONE) - return fail(r, "INTERNAL", "database error"); + return db_error(r); if (sqlite3_changes(r->db) == 0) return fail(r, "NOT_FOUND", "match not found"); char *reqjson = audit_args_json(r->args); |
