diff --git a/db.c b/db.c index eabcbfb..f64a516 100644 --- a/db.c +++ b/db.c @@ -3,42 +3,61 @@ #include #include -// Callback function taken from https://sqlite.org/quickstart.html -static int print_callback(void *NotUsed, int argc, char **argv, char **azColName){ - for(size_t i=0; i\n"); + printf("\tadd [custom_name] \n"); + printf("\tgenerate \n"); + printf("\tupdate \n"); + printf("\tdelete \n"); +} + +void exit_nicely(sqlite3 *db, const char *msg) { + if (msg != NULL) { + fprintf(stderr, "%s\n", msg); + } + print_usage(); + sqlite3_close(db); + exit(1); +} + +static int print_callback(void *unused, int argc, char **argv, char **col_name) { + for (size_t i = 0; i < argc; i++) { + printf("%s", argv[i] ? argv[i] : "NULL"); + if (i < argc - 1) { + printf(" "); + } } printf("\n"); return 0; } char* get_website_from_url(const char *url) { - char *tmp = strstr(url, "rule34.xxx"); - if (tmp != NULL) { + if (strstr(url, "rule34.xxx") != NULL) { return "Rule34"; + } else if (strstr(url, "iwara.tv") != NULL) { + return "Iwara"; + } else { + return NULL; } - - return NULL; } char* get_artist_from_url(const char *url, const char *website_name) { size_t offset = 0; if (strcmp(website_name, "Rule34") == 0) { offset = 51; - } else if (strcmp(website_name, "Iwara") == 0) { - // - } - - if (offset == 0) { + } else if (strcmp(website_name, "Gelbooru") == 0) { + offset = 53; + } else if (strcmp(website_name, "ATF") == 0) { + offset = 42; + } else { return NULL; } - - size_t i; - for (i = 0; url[offset+i] != '\0'; i++) {} - char *artist_name = malloc(i+1); // since this is programs halts soon, I dont need to free this manually - memcpy(artist_name, url + offset, i); - artist_name[i] = '\0'; - + + size_t name_length = strlen(url) - offset; + char *artist_name = malloc(name_length + 1); + memcpy(artist_name, url + offset, name_length); + artist_name[name_length] = '\0'; + return artist_name; } @@ -47,12 +66,12 @@ bool add(sqlite3 *db, const char *url) { int result; char *error_msg; - const char *website_name = get_website_from_url(url); + char *website_name = get_website_from_url(url); if (website_name == NULL) { fprintf(stderr, "Couldn't get website_name from url %s\n", url); return false; } - const char *artist_name = get_artist_from_url(url, website_name); + char *artist_name = get_artist_from_url(url, website_name); if (artist_name == NULL) { fprintf(stderr, "Couldn't get artist_name from url %s\n", url); return false; @@ -68,6 +87,72 @@ bool add(sqlite3 *db, const char *url) { return true; } +bool add_custom_name(sqlite3 *db, const char *url, const char *custom_name) { + char *sql; + int result; + char *error_msg; + + char *website_name = get_website_from_url(url); + if (website_name == NULL) { + fprintf(stderr, "Couldn't get website_name from url %s\n", url); + return false; + } + + sprintf(sql, "INSERT INTO hentai VALUES ('%s', '%s', '%s');", url, custom_name, website_name); + result = sqlite3_exec(db, sql, print_callback, 0, &error_msg); + if (result != SQLITE_OK) { + fprintf(stderr, "SQL error: %s\n", error_msg); + sqlite3_free(error_msg); + return false; + } + return true; +} + +bool generate(sqlite3 *db, const char *website_name) { + char *sql; + int result; + char *error_msg; + + sprintf(sql, "SELECT * FROM hentai WHERE website_name = '%s';", website_name); + result = sqlite3_exec(db, sql, print_callback, 0, &error_msg); + if (result != SQLITE_OK) { + fprintf(stderr, "SQL error: %s\n", error_msg); + sqlite3_free(error_msg); + return false; + } + return true; +} + +bool update_artist_name(sqlite3 *db, const char *url, const char *new_artist_name) { + char *sql; + int result; + char *error_msg; + + sprintf(sql, "UPDATE hentai set artist_name = '%s' WHERE url = '%s';", new_artist_name, url); + result = sqlite3_exec(db, sql, print_callback, 0, &error_msg); + if (result != SQLITE_OK) { + fprintf(stderr, "SQL error: %s\n", error_msg); + sqlite3_free(error_msg); + return false; + } + return true; +} + +bool delete(sqlite3 *db, const char *url) { + char *sql; + int result; + char *error_msg; + + sprintf(sql, "DELETE FROM hentai WHERE url = '%s';", url); + result = sqlite3_exec(db, sql, print_callback, 0, &error_msg); + if (result != SQLITE_OK) { + fprintf(stderr, "SQL error: %s\n", error_msg); + sqlite3_free(error_msg); + return false; + } + return true; +} + int main(int argc, char **argv) { sqlite3 *db; int result; @@ -75,51 +160,67 @@ int main(int argc, char **argv) { char *sql; bool successful; - result = sqlite3_open(":memory:", &db); - if (result != SQLITE_OK || db == NULL) { - fprintf(stderr, "Couldn't create or open db: %s\n", sqlite3_errmsg(db)); - sqlite3_close(db); - return 1; + result = sqlite3_open("/tmp/Hentai.db", &db); + if (result != SQLITE_OK) { + exit_nicely(db, sqlite3_errmsg(db)); } sql = "CREATE TABLE IF NOT EXISTS hentai (url TEXT PRIMARY KEY NOT NULL, artist_name TEXT NOT NULL, website_name TEXT NOT NULL) STRICT;"; - result = sqlite3_exec(db, sql, print_callback, 0, &error_msg); + result = sqlite3_exec(db, sql, NULL, 0, &error_msg); if (result != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", error_msg); sqlite3_free(error_msg); + exit_nicely(db, NULL); } - - printf("argc = %d\n", argc); - printf("argv = {\n"); - for (int i = 0; i < argc; i++) { - printf("\t%s\n", argv[i]); - } - printf("}\n"); - + if (argc < 2) { - fprintf(stderr, "Incorrect amount of arguments\n"); - // TODO: print_usage(); - sqlite3_close(db); - return 1; + exit_nicely(db, "Incorrect amount of arguments"); } if (strcmp(argv[1], "add") == 0) { - successful = add(db, argv[2]); - if (!successful) { - sqlite3_close(db); - return 1; + if (argc == 3) { + successful = add(db, argv[2]); + if (!successful) { + exit_nicely(db, NULL); + } + } else if (argc == 4) { + successful = add_custom_name(db, argv[2], argv[3]); + if (!successful) { + exit_nicely(db, NULL); + } + } else { + exit_nicely(db, "Incorrect amount of arguments"); + } + } else if (strcmp(argv[1], "generate") == 0) { + if (argc == 3) { + successful = generate(db, argv[2]); + if (!successful) { + exit_nicely(db, NULL); + } + } else { + exit_nicely(db, "Incorrect amount of arguments"); + } + } else if (strcmp(argv[1], "update") == 0) { + if (argc == 4) { + successful = update_artist_name(db, argv[3], argv[2]); + if (!successful) { + exit_nicely(db, NULL); + } + } else { + exit_nicely(db, "Incorrect amount of arguments"); + } + + } else if (strcmp(argv[1], "delete") == 0) { + if (argc == 3) { + successful = delete(db, argv[2]); + if (!successful) { + exit_nicely(db, NULL); + } + } else { + exit_nicely(db, "Incorrect amount of arguments"); } } else { - fprintf(stderr, "Invalid argument\n"); - sqlite3_close(db); - return 1; - } - - sql = "SELECT * FROM hentai;"; - result = sqlite3_exec(db, sql, print_callback, 0, &error_msg); - if (result != SQLITE_OK) { - fprintf(stderr, "SQL error: %s\n", error_msg); - sqlite3_free(error_msg); + exit_nicely(db, "Invalid argument"); } sqlite3_close(db);