From b1956aa73a533702ccbc3d7713ea90dd5ae44b9b Mon Sep 17 00:00:00 2001 From: Anders Betts Date: Mon, 21 Sep 2026 09:47:50 +0200 Subject: commands: db_row_json and db_exec_bound helpers Co-Authored-By: Claude Opus 5 --- src/cmd_fiscal.c | 71 +++++++++++--------------------------------------------- 1 file changed, 14 insertions(+), 57 deletions(-) (limited to 'src/cmd_fiscal.c') diff --git a/src/cmd_fiscal.c b/src/cmd_fiscal.c index 3f8e2c2..fdfeddd 100644 --- a/src/cmd_fiscal.c +++ b/src/cmd_fiscal.c @@ -13,36 +13,13 @@ /* fiscal years and period locks */ /* ------------------------------------------------------------------ */ +#define FY_SPEC \ + "id:i,label:s,start_date:s,end_date:s,status:s,locked_until:n," \ + "dividend_ore:i,events:s,agm_date:s,dividend_date:s,employees:s,notes:s" + static yyjson_mut_val *fy_json(struct req *r, sqlite3_stmt *st) { - yyjson_mut_val *o = yyjson_mut_obj(r->rdoc); - yyjson_mut_obj_add_int(r->rdoc, o, "id", sqlite3_column_int64(st, 0)); - yyjson_mut_obj_add_strcpy(r->rdoc, o, "label", - sq(sqlite3_column_text(st, 1))); - yyjson_mut_obj_add_strcpy(r->rdoc, o, "start_date", - sq(sqlite3_column_text(st, 2))); - yyjson_mut_obj_add_strcpy(r->rdoc, o, "end_date", - sq(sqlite3_column_text(st, 3))); - yyjson_mut_obj_add_strcpy(r->rdoc, o, "status", - sq(sqlite3_column_text(st, 4))); - if (sqlite3_column_type(st, 5) == SQLITE_NULL) - yyjson_mut_obj_add_null(r->rdoc, o, "locked_until"); - else - yyjson_mut_obj_add_strcpy(r->rdoc, o, "locked_until", - sq(sqlite3_column_text(st, 5))); - yyjson_mut_obj_add_int(r->rdoc, o, "dividend_ore", - sqlite3_column_int64(st, 6)); - yyjson_mut_obj_add_strcpy(r->rdoc, o, "events", - sq(sqlite3_column_text(st, 7))); - yyjson_mut_obj_add_strcpy(r->rdoc, o, "agm_date", - sq(sqlite3_column_text(st, 8))); - yyjson_mut_obj_add_strcpy(r->rdoc, o, "dividend_date", - sq(sqlite3_column_text(st, 9))); - yyjson_mut_obj_add_strcpy(r->rdoc, o, "employees", - sq(sqlite3_column_text(st, 10))); - yyjson_mut_obj_add_strcpy(r->rdoc, o, "notes", - sq(sqlite3_column_text(st, 11))); - return o; + return db_row_json(r->rdoc, st, FY_SPEC); } #define FY_COLUMNS \ @@ -51,21 +28,10 @@ static yyjson_mut_val *fy_json(struct req *r, sqlite3_stmt *st) static yyjson_mut_val *h_fiscal_year_list(struct req *r) { - yyjson_mut_val *items = yyjson_mut_arr(r->rdoc); - sqlite3_stmt *st = NULL; - if (sqlite3_prepare_v2( - r->db, - "SELECT " FY_COLUMNS " FROM fiscal_years WHERE org_id=?1" - " ORDER BY start_date", - -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_arr_add_val(items, fy_json(r, st)); - sqlite3_finalize(st); - yyjson_mut_val *o = yyjson_mut_obj(r->rdoc); - yyjson_mut_obj_add_val(r->rdoc, o, "items", items); - return o; + return req_list(r, + "SELECT " FY_COLUMNS " FROM fiscal_years WHERE org_id=?1" + " ORDER BY start_date", + FY_SPEC, "i", r->org_id); } static yyjson_mut_val *h_fiscal_year_get(struct req *r) @@ -355,20 +321,11 @@ static yyjson_mut_val *h_period_lock(struct req *r) if (fy <= 0 || !util_parse_iso_date(until)) return fail(r, "INVALID_ARGS", "fiscal_year and until (YYYY-MM-DD) are required"); - sqlite3_stmt *st = NULL; - if (sqlite3_prepare_v2( - r->db, - "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 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 db_sqlite_error(r); + if (req_exec(r, + "UPDATE fiscal_years SET locked_until=?3 WHERE org_id=?1 AND id=?2" + " AND ?3 BETWEEN start_date AND end_date", + "iis", r->org_id, fy, until) != 0) + return NULL; if (sqlite3_changes(r->db) == 0) return fail(r, "NOT_FOUND", "fiscal year not found or until is outside it"); -- cgit v1.3