/* * Created by yuuta on 11/28/21. */ #include "db.h" #include "log.h" #include "botd.h" #include #include static const char *sql_upgrades[] = { "CREATE TABLE 'says' (" "'id' INTEGER PRIMARY KEY," "'t' TEXT NOT NULL UNIQUE," "'url' TEXT," "'msg' INTEGER NOT NULL" ");", "CREATE TABLE 'stats' (" "'user' INTEGER UNIQUE," "'i' INTEGER NOT NULL," "PRIMARY KEY('user')" ");" }; sqlite3 *db = NULL; void db_init(void) { int r; r = sqlite3_open(cmd.db_path, &db); if (r) { LOGFEV("Cannot open SQLite3 database: %s", r, sqlite3_errstr(r)); } char *errmsg = NULL; /* Enable foreign key support */ if ((r = sqlite3_exec(db, "PRAGMA foreign_keys = ON", NULL, NULL, &errmsg))) { goto sql_err; sql_err: db_close(); LOGFEV("%s", r, errmsg); } /* Get user_version */ sqlite3_stmt *stmt; if ((r = sqlite3_prepare_v2(db, "PRAGMA user_version", -1, &stmt, NULL))) { goto sql_err; } if ((r = sqlite3_step(stmt)) != SQLITE_ROW) { errmsg = (char *) sqlite3_errstr(r); sqlite3_finalize(stmt); goto sql_err; } int current_var = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); for (; current_var < sizeof(sql_upgrades) / sizeof(char *); current_var ++) { const int to = current_var + 1; LOGIV("Upgrading SQL schema from %d to %d.", current_var, to); if ((r = sqlite3_exec(db, sql_upgrades[current_var], NULL, NULL, &errmsg))) { goto sql_err; } char sql[60]; sprintf(sql, "PRAGMA user_version = %d;", to); if ((r = sqlite3_exec(db, sql, NULL, NULL, &errmsg))) { goto sql_err; } } } void db_close(void) { if (db == NULL) return; sqlite3_close(db); db = NULL; }