#include "database.h" #include sqlite3 *database_connect(const char *path) { int rc; gchar *file; sqlite3 *db; file = g_build_filename(path, "cards.db", NULL); rc = sqlite3_open(file, &db); if (rc) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); return NULL; } else { fprintf(stderr, "Opened database successfully\n"); } g_free(file); return db; } void database_close(sqlite3 *db) { sqlite3_close(db); } void database_create_tables(sqlite3 *db) { int rc; sqlite3_stmt *stmt; const char *sql; sql = "CREATE TABLE IF NOT EXISTS `cards` (" "`category` INTEGER NOT NULL," "`task` TEXT NOT NULL," "`solution` TEXT NOT NULL" ")"; rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0); if (rc != SQLITE_OK) { fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); } sqlite3_step(stmt); sqlite3_finalize(stmt); sql = "CREATE TABLE IF NOT EXISTS `categories` (" "`id` INTEGER NOT NULL," "`name` TEXT NOT NULL," "PRIMARY KEY(`id` AUTOINCREMENT)" ")"; rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0); if (rc != SQLITE_OK) { fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); } sqlite3_step(stmt); sqlite3_finalize(stmt); } void database_save_category(sqlite3 *db, const char *c) { int rc; sqlite3_stmt *stmt; fprintf(stdout, "%s\n", c); rc = sqlite3_prepare_v2(db, "INSERT INTO categories (name) VALUES(?)", -1, &stmt, 0); if (rc == SQLITE_OK) { sqlite3_bind_text(stmt, 1, c, -1, SQLITE_STATIC); } else { printf("Failed to execute statement: %s\n", sqlite3_errmsg(db)); } rc = sqlite3_step(stmt); if (rc != SQLITE_OK) { fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); } sqlite3_finalize(stmt); } GArray *database_load_categories(sqlite3 *db) { GArray *categories; int rc; sqlite3_stmt *stmt; categories = g_array_new(TRUE, FALSE, sizeof(category)); rc = sqlite3_prepare_v2(db, "SELECT * FROM categories", -1, &stmt, 0); if (rc != SQLITE_OK) { fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); } while (sqlite3_step(stmt) == SQLITE_ROW) { int id = sqlite3_column_int(stmt, 0); char *name = strdup((const char *)sqlite3_column_text(stmt, 1)); category c = {id, name}; g_array_append_val(categories, c); } sqlite3_finalize(stmt); return categories; } void database_save_card(sqlite3 *db, card c) { int rc; sqlite3_stmt *stmt; fprintf(stdout, "%s: %s\n", c.task, c.solution); rc = sqlite3_prepare_v2(db, "INSERT INTO cards VALUES(?, ?, ?)", -1, &stmt, 0); if (rc == SQLITE_OK) { sqlite3_bind_int(stmt, 0, c.category); sqlite3_bind_text(stmt, 1, c.task, -1, SQLITE_STATIC); sqlite3_bind_text(stmt, 2, c.solution, -1, SQLITE_STATIC); } else { fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db)); } sqlite3_step(stmt); sqlite3_finalize(stmt); } GArray *database_load_cards(sqlite3 *db) { GArray *cards; cards = g_array_new(TRUE, FALSE, sizeof(card)); return cards; }