diff options
Diffstat (limited to 'src/data.c')
-rw-r--r-- | src/data.c | 679 |
1 files changed, 298 insertions, 381 deletions
@@ -1,442 +1,359 @@ #include "data.h" -#include <sqlite3.h> + +#include <errno.h> #include <gtk/gtk.h> -#include <unistd.h> -#include <string.h> +#include <sqlite3.h> #include <stdlib.h> +#include <string.h> #include <sys/stat.h> -#include <errno.h> +#include <unistd.h> + #include "eom.h" -static gboolean data_check_and_create_database(gchar *data_file); -static gint data_create_new_database(const gchar *filename); -static Manga *data_get_manga_from_statement(sqlite3_stmt *stmt); -static GList *data_get_manga_for_query(const gchar *query); +static gboolean check_and_create_database(gchar*); +static gint create_new_database(const gchar*); +static gboolean execute_non_query(const char *sql); +static GList *get_manga_for_query(const gchar*); +static Manga *get_manga_from_statement(sqlite3_stmt*); -GList *data_get_manga(void) +gboolean +data_add_manga(gchar *name, gint total_qty) { - const char *sql = - " SELECT id, " - " name, " - " current_qty, " - " total_qty " - " FROM manga " - " ORDER BY name " - " COLLATE NOCASE "; - return data_get_manga_for_query(sql); + gchar *sql = + g_strdup_printf(" INSERT INTO manga (name, current_qty, " + "total_qty) VALUES ('%s', 0, %d)", + name, total_qty); + gboolean ret = execute_non_query(sql); + + g_free(sql); + + return ret; } -GList *data_get_incomplete_manga(void) +gboolean +data_add_to_manga(gint manga_id, gint count) { - const char *sql = - " SELECT id, " - " name, " - " current_qty, " - " total_qty " - " FROM manga " - " WHERE current_qty != total_qty " - " ORDER BY name " - " COLLATE NOCASE "; - return data_get_manga_for_query(sql); + gchar *sql = + g_strdup_printf(" UPDATE manga " + " SET current_qty = current_qty + %d " + " WHERE id = %d", count, manga_id); + gboolean ret = execute_non_query(sql); + + g_free(sql); + + return ret; } -GList *data_get_manga_for_query(const gchar *query) +gboolean +data_add_volume_to_manga(gint manga_id, gint volume) { - sqlite3 *database; - sqlite3_stmt *statement; - gchar *data_file; - GList *list = NULL; - - data_file = eom_get_data_file(); - - if (data_check_and_create_database(data_file)) { - if (sqlite3_open(data_file, &database) == SQLITE_OK) { - int res = sqlite3_prepare_v2(database, - query, - strlen(query), - &statement, NULL); - - if (res == SQLITE_OK) { - while (sqlite3_step(statement) == SQLITE_ROW) { - Manga *manga = data_get_manga_from_statement(statement); - list = g_list_append(list, (gpointer)manga); - } - } - else - g_print("error %d: %s\n", res, sqlite3_errmsg(database)); + char *sql = g_strdup_printf(" INSERT INTO volume " + " VALUES (%d, %d, 0) ", + manga_id, volume); + gboolean ret = execute_non_query(sql); - /* Release the compiled statement from memory */ - sqlite3_finalize(statement); - } - sqlite3_close(database); - } + g_free(sql); - return list; + return ret; } -Manga *data_get_manga_by_id(gint manga_id) +GList * +data_get_incomplete_manga(void) { - sqlite3 *database; - sqlite3_stmt *statement; - gchar *data_file; - Manga *manga = NULL; - - data_file = eom_get_data_file(); - - if (data_check_and_create_database(data_file)) { - if (sqlite3_open(data_file, &database) == SQLITE_OK) { - int res; - const char *sql = g_strdup_printf( - " SELECT id, " - " name, " - " current_qty, " - " total_qty " - " FROM manga " - " WHERE id = %d ", manga_id); - - res = sqlite3_prepare_v2(database, sql, strlen(sql), &statement, NULL); - if (res == SQLITE_OK) { - if (sqlite3_step(statement) == SQLITE_ROW) { - manga = data_get_manga_from_statement(statement); - } - } - - sqlite3_finalize(statement); - } - sqlite3_close(database); - } + const char *sql = + " SELECT id, " + " name, " + " current_qty, " + " total_qty " + " FROM manga " + " WHERE current_qty != total_qty " + " ORDER BY name " + " COLLATE NOCASE "; + + return get_manga_for_query(sql); +} - return manga; +GList * +data_get_manga(void) +{ + const char *sql = + " SELECT id, " + " name, " + " current_qty, " + " total_qty " + " FROM manga " + " ORDER BY name " + " COLLATE NOCASE "; + + return get_manga_for_query(sql); } -void data_get_volumes_for_manga(Manga *manga) +Manga * +data_get_manga_by_id(gint manga_id) { - gint count; - Volume *volumes; - sqlite3 *database; - sqlite3_stmt *statement; - gchar *data_file; - - data_file = eom_get_data_file(); - count = 0; - - if (data_check_and_create_database(data_file)) { - if (sqlite3_open(data_file, &database) == SQLITE_OK) { - int res; - const char *sql = g_strdup_printf( - " SELECT COUNT(id) " - " FROM volume " - " WHERE manga_id = %d ", manga->id); - - res = sqlite3_prepare_v2(database, sql, strlen(sql), &statement, NULL); - if (res == SQLITE_OK) { - if (sqlite3_step(statement) == SQLITE_ROW) { - count = sqlite3_column_int(statement, 0); - } - } - - sqlite3_finalize(statement); - volumes = calloc(sizeof(Volume), count); - - if (count > 0) { - sql = g_strdup_printf( - " SELECT id, " - " read " - " FROM volume " - " WHERE manga_id = %d ", manga->id); - - res = sqlite3_prepare_v2(database, sql, strlen(sql), &statement, NULL); - if (res == SQLITE_OK) { - gint i = 0; - while (sqlite3_step(statement) == SQLITE_ROW) { - volumes[i].number = sqlite3_column_int(statement, 0); - volumes[i].read = sqlite3_column_int(statement, 1); - - i++; - }; + sqlite3 *db; + sqlite3_stmt *stmt; + gchar *data_file; + Manga *manga = NULL; + + data_file = eom_get_data_file(); + + if (check_and_create_database(data_file)) { + if (sqlite3_open(data_file, &db) == SQLITE_OK) { + int res; + char *sql = + g_strdup_printf(" SELECT id, " + " name, " + " current_qty, " + " total_qty " + " FROM manga " + " WHERE id = %d ", manga_id); + + res = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL); + g_free(sql); + + if (res == SQLITE_OK) { + if (sqlite3_step(stmt) == SQLITE_ROW) { + manga = get_manga_from_statement(stmt); + } + } + + sqlite3_finalize(stmt); } - - sqlite3_finalize(statement); - } + sqlite3_close(db); } - sqlite3_close(database); - } - manga->vol_count = count; - manga->volumes = volumes; + return manga; } -gboolean data_add_manga(gchar *name, gint total_qty) +void +data_get_volumes_for_manga(Manga *manga) { - sqlite3 *database; - sqlite3_stmt *statement; - gchar *data_file; - gboolean result; - - result = FALSE; - data_file = eom_get_data_file(); - - if (data_check_and_create_database(data_file)) { - if (sqlite3_open(data_file, &database) == SQLITE_OK) { - int res; - const char *sql = g_strdup_printf( - " INSERT INTO manga (name, current_qty, total_qty) " - " VALUES ('%s', 0, %d)", name, total_qty); - - res = sqlite3_prepare_v2(database, - sql, - strlen(sql), - &statement, NULL); - if (res == SQLITE_OK) { - if (sqlite3_step(statement) == SQLITE_DONE) - result = TRUE; - } - - sqlite3_finalize(statement); + gint count; + Volume *volumes; + sqlite3 *db; + sqlite3_stmt *stmt; + gchar *data_file; + + data_file = eom_get_data_file(); + count = 0; + + if (check_and_create_database(data_file)) { + if (sqlite3_open(data_file, &db) == SQLITE_OK) { + int res; + char *sql = g_strdup_printf(" SELECT COUNT(id) " + " FROM volume " + " WHERE manga_id = %d ", + manga->id); + + res = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL); + g_free(sql); + + if (res == SQLITE_OK) { + if (sqlite3_step(stmt) == SQLITE_ROW) { + count = sqlite3_column_int(stmt, 0); + } + } + + sqlite3_finalize(stmt); + volumes = calloc(sizeof(Volume), count); + + if (count > 0) { + sql = g_strdup_printf(" SELECT id, " + " read " + " FROM volume " + " WHERE manga_id = %d ", + manga->id); + + res = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, + NULL); + g_free(sql); + + if (res == SQLITE_OK) { + gint i = 0; + while (sqlite3_step(stmt) == SQLITE_ROW) { + volumes[i].number = sqlite3_column_int(stmt, 0); + volumes[i].read = sqlite3_column_int(stmt, 1); + + i++; + }; + } + + sqlite3_finalize(stmt); + } + } + sqlite3_close(db); } - sqlite3_close(database); - } - return result; + manga->vol_count = count; + manga->volumes = volumes; } -gboolean data_add_to_manga(gint manga_id, gint count) +gboolean +data_mark_volume_read(int read, gint manga_id, gint volume) { - sqlite3 *database; - sqlite3_stmt *statement; - gchar *data_file; - gboolean result; - - data_file = eom_get_data_file(); - result = FALSE; - - if (data_check_and_create_database(data_file)) { - if (sqlite3_open(data_file, &database) == SQLITE_OK) { - int res; - const char *sql = g_strdup_printf( - " UPDATE manga " - " SET current_qty = current_qty + %d " - " WHERE id = %d", count, manga_id); - - res = sqlite3_prepare_v2(database, - sql, - strlen(sql), - &statement, NULL); - if (res == SQLITE_OK) { - if (sqlite3_step(statement) == SQLITE_DONE) - result = TRUE; - } - - sqlite3_finalize(statement); - } - sqlite3_close(database); - } + gchar *sql = g_strdup_printf(" UPDATE volume " + " SET read = %d " + " WHERE manga_id = %d " + " AND id = %d ", + read, manga_id, volume); + gboolean ret = execute_non_query(sql); + + g_free(sql); - return result; + return ret; } -gboolean data_add_volume_to_manga(gint manga_id, gint volume) +gboolean +data_remove_volume_from_manga(gint manga_id, gint volume) { - sqlite3 *database; - sqlite3_stmt *statement; - gchar *data_file; - gboolean result; - - data_file = eom_get_data_file(); - result = FALSE; - - if (data_check_and_create_database(data_file)) { - if (sqlite3_open(data_file, &database) == SQLITE_OK) { - int res; - const char *sql = g_strdup_printf( - " INSERT INTO volume " - " VALUES (%d, %d, 0) ", - manga_id, volume); - - res = sqlite3_prepare_v2(database, - sql, - strlen(sql), - &statement, NULL); - if (res == SQLITE_OK) { - res = sqlite3_step(statement); - if (res == SQLITE_DONE) - result = TRUE; - else - g_print("step did not return DONE, it DID return %d\n", res); - } - else - g_print("res was not OK\n"); - - sqlite3_finalize(statement); - } - else - g_print("database wasn't opened\n"); - sqlite3_close(database); - } - else - g_print("couldn't check or create database\n"); - - return result; + char *sql = g_strdup_printf(" DELETE FROM volume " + " WHERE manga_id = %d " + " AND id = %d ", manga_id, volume); + gboolean ret = execute_non_query(sql); + + g_free(sql); + + return ret; } -gboolean data_mark_volume_read(int read, gint manga_id, gint volume) +static gboolean +check_and_create_database(gchar *data_file) { - sqlite3 *database; - sqlite3_stmt *statement; - gchar *data_file; - gboolean result; - - data_file = eom_get_data_file(); - result = FALSE; - - if (data_check_and_create_database(data_file)) { - if (sqlite3_open(data_file, &database) == SQLITE_OK) { - int res; - const char *sql = g_strdup_printf( - " UPDATE volume " - " SET read = %d " - " WHERE manga_id = %d " - " AND id = %d ", - read, manga_id, volume); - - res = sqlite3_prepare_v2(database, - sql, - strlen(sql), - &statement, NULL); - if (res == SQLITE_OK) { - res = sqlite3_step(statement); - if (res == SQLITE_DONE) - result = TRUE; - else - g_print("step did not return DONE, it DID return %d\n", res); - } - else - g_print("res was not OK\n"); - - sqlite3_finalize(statement); + if (!access(data_file, R_OK) == 0) + if (create_new_database(data_file)) { + g_printerr("Couldn't create a new database\n"); + + return FALSE; /* Couldn't create database, can't continue */ } - else - g_print("database wasn't opened\n"); - sqlite3_close(database); - } - else - g_print("couldn't check or create database\n"); - - return result; + + return TRUE; } -gboolean data_remove_volume_from_manga(gint manga_id, gint volume) +static gint +create_new_database(const gchar *filename) { - sqlite3 *database; - sqlite3_stmt *statement; - gchar *data_file; - gboolean result; - - data_file = eom_get_data_file(); - result = FALSE; - - if (data_check_and_create_database(data_file)) { - if (sqlite3_open(data_file, &database) == SQLITE_OK) { - int res; - const char *sql = g_strdup_printf( - " DELETE FROM volume " - " WHERE manga_id = %d " - " AND id = %d ", manga_id, volume); - - res = sqlite3_prepare_v2(database, - sql, - strlen(sql), - &statement, NULL); - if (res == SQLITE_OK) - if (sqlite3_step(statement) == SQLITE_DONE) - result = TRUE; - else - g_print("step did not return DONE\n"); - else - g_print("result did not return OK\n"); - - sqlite3_finalize(statement); + sqlite3 *db; + char *zErrMsg = 0; + int rc; + + if (access(eom_get_config_dir(), R_OK) == -1) { + if (mkdir(eom_get_config_dir(), S_IRWXU) == -1) + g_printerr("Can't create directory: %s\n", strerror(errno)); } - else - g_print("couldn't open database\n"); - sqlite3_close(database); - } - else - g_print("couldn't check or create database\n"); - - return result; + + /* Open database connection, create file */ + rc = sqlite3_open(filename, &db); + + if (rc) { + g_printerr("Can't open database: %s\n", sqlite3_errmsg(db)); + if (db) + sqlite3_close(db); + return -1; + } + + /* Create collections table */ + rc = sqlite3_exec(db, + "CREATE TABLE manga(" + "id INTEGER PRIMARY KEY," + "name VARCHAR(100)," + "current_qty INTEGER," + "total_qty INTEGER" + ")", NULL, NULL, &zErrMsg); + if (rc != SQLITE_OK) { + g_printerr("Can't create manga table: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + sqlite3_close(db); + return -1; + } + + /* Create items table */ + rc = sqlite3_exec(db, + " CREATE TABLE volume( " + " manga_id INTEGER, " + " id INTEGER, " + " read INTEGER, " + " PRIMARY KEY(manga_id, id), " + " FOREIGN KEY(manga_id) " + " REFERENCES manga(id)) ", + NULL, NULL, &zErrMsg); + if (rc != SQLITE_OK) { + g_printerr("Can't create volume table: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + sqlite3_close(db); + return -1; + } + + sqlite3_close(db); + return 0; } -static gboolean data_check_and_create_database(gchar *data_file) +static gboolean +execute_non_query(const gchar *sql) { - if (!access(data_file, R_OK) == 0) - if (data_create_new_database(data_file)) { - g_printerr("Couldn't create a new database\n"); - return FALSE; /* Couldn't create database, can't continue */ + sqlite3 *db; + sqlite3_stmt *stmt; + gchar *data_file; + gboolean result; + + result = FALSE; + data_file = eom_get_data_file(); + + if (check_and_create_database(data_file)) { + if (sqlite3_open(data_file, &db) == SQLITE_OK) { + int res = + sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL); + + if (res == SQLITE_OK) { + if (sqlite3_step(stmt) == SQLITE_DONE) + result = TRUE; + } + + sqlite3_finalize(stmt); + } + sqlite3_close(db); } - return TRUE; + return result; } -static gint data_create_new_database(const gchar *filename) +static GList * +get_manga_for_query(const gchar *query) { - sqlite3 *db; - char *zErrMsg = 0; - int rc; - - if (access(eom_get_config_dir(), R_OK) == -1) { - if (mkdir(eom_get_config_dir(), S_IRWXU) == -1) - g_printerr("Can't create directory: %s\n", strerror(errno)); - } - - /* Open database connection, create file */ - rc = sqlite3_open(filename, &db); - if (rc) { - g_printerr("Can't open database: %s\n", sqlite3_errmsg(db)); - if (db) - sqlite3_close(db); - return -1; - } - - /* Create collections table */ - rc = sqlite3_exec(db, "CREATE TABLE manga(" - "id INTEGER PRIMARY KEY," - "name VARCHAR(100)," - "current_qty INTEGER," - "total_qty INTEGER" - ")", NULL, NULL, &zErrMsg); - if (rc != SQLITE_OK) { - g_printerr("Can't create manga table: %s\n", zErrMsg); - sqlite3_free(zErrMsg); - sqlite3_close(db); - return -1; - } - - /* Create items table */ - rc = sqlite3_exec(db, - " CREATE TABLE volume( " - " manga_id INTEGER, " - " id INTEGER, " - " read INTEGER, " - " PRIMARY KEY(manga_id, id), " - " FOREIGN KEY(manga_id) " - " REFERENCES manga(id)) ", - NULL, NULL, &zErrMsg); - if (rc != SQLITE_OK) { - g_printerr("Can't create volume table: %s\n", zErrMsg); - sqlite3_free(zErrMsg); - sqlite3_close(db); - return -1; - } + sqlite3 *database; + sqlite3_stmt *statement; + gchar *data_file; + GList *list = NULL; + + data_file = eom_get_data_file(); + + if (check_and_create_database(data_file)) { + if (sqlite3_open(data_file, &database) == SQLITE_OK) { + int res = sqlite3_prepare_v2(database, query, strlen(query), + &statement, NULL); + + if (res == SQLITE_OK) { + while (sqlite3_step(statement) == SQLITE_ROW) { + Manga *manga = get_manga_from_statement(statement); + list = g_list_append(list, (gpointer)manga); + } + } + else + g_print("error %d: %s\n", res, sqlite3_errmsg(database)); + + /* Release the compiled statement from memory */ + sqlite3_finalize(statement); + } + sqlite3_close(database); + } - sqlite3_close(db); - return 0; + return list; } -static Manga *data_get_manga_from_statement(sqlite3_stmt *stmt) +static Manga * +get_manga_from_statement(sqlite3_stmt *stmt) { - Manga *manga = - (Manga *)malloc(sizeof(Manga)); + Manga *manga = (Manga *)malloc(sizeof(Manga)); manga->id = sqlite3_column_int(stmt, 0); manga->name = g_strdup(sqlite3_column_text(stmt, 1)); |