#define _POSIX_C_SOURCE 200809L #include "db.h" #include #include #include #include void db_section_free(struct db_section *const s) { if (!s) return; free(s->name); free(s->desc); } int db_section(sqlite3 *const db, sqlite3_stmt *const stmt, struct db_section *const s) { unsigned long long id, catid; char *name = NULL, *desc = NULL; if (db_biguint(db, stmt, "id", &id)) { fprintf(stderr, "%s: failed to get id\n", __func__); goto failure; } else if (db_biguint(db, stmt, "catid", &catid)) { fprintf(stderr, "%s: failed to get category id\n", __func__); goto failure; } else if (!(name = db_str(db, stmt, "name"))) { fprintf(stderr, "%s: failed to get name\n", __func__); goto failure; } else if (!(desc = db_str(db, stmt, "description"))) { fprintf(stderr, "%s: failed to get name\n", __func__); goto failure; } *s = (const struct db_section) { .catid = catid, .name = name, .desc = desc, .id = id }; return 0; failure: free(desc); free(name); return -1; }