#define _POSIX_C_SOURCE 200809L #include "db.h" #include #include #include #include void db_topic_free(struct db_topic *const t) { if (!t) return; free(t->title); } int db_topic(sqlite3 *const db, sqlite3_stmt *const stmt, struct db_topic *const t) { char *title = NULL; unsigned long long id, secid; long long creat; if (db_biguint(db, stmt, "id", &id)) { fprintf(stderr, "%s: failed to get id\n", __func__); goto failure; } else if (db_biguint(db, stmt, "secid", &secid)) { fprintf(stderr, "%s: failed to get section id\n", __func__); goto failure; } else if (db_bigint(db, stmt, "creat", &creat)) { fprintf(stderr, "%s: failed to get creation time\n", __func__); goto failure; } else if (!(title = db_str(db, stmt, "title"))) { fprintf(stderr, "%s: failed to get name\n", __func__); goto failure; } *t = (const struct db_topic) { .secid = secid, .title = title, .creat = creat, .id = id }; return 0; failure: free(title); return -1; }