#include #include #include #include void print_usage() { printf("Usage: db \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) { if (strstr(url, "rule34.xxx") != NULL) { return "Rule34"; } else if (strstr(url, "iwara.tv") != NULL) { return "Iwara"; } else { 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, "Gelbooru") == 0) { offset = 53; } else if (strcmp(website_name, "ATF") == 0) { offset = 42; } else { return NULL; } 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; } bool add(sqlite3 *db, const char *url) { 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; } 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; } sprintf(sql, "INSERT INTO hentai VALUES ('%s', '%s', '%s');", url, artist_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 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; char *error_msg; char *sql; bool successful; 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, NULL, 0, &error_msg); if (result != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", error_msg); sqlite3_free(error_msg); exit_nicely(db, NULL); } if (argc < 2) { exit_nicely(db, "Incorrect amount of arguments"); } if (strcmp(argv[1], "add") == 0) { 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 { exit_nicely(db, "Invalid argument"); } sqlite3_close(db); return 0; }