#include "db.h" #include #include #include #include sqlite3 *db; int h_db_open(const char *db_name) { int ret; char *err_msg; if (db != NULL) { fprintf(stderr, "There is already a sqlite db open\n"); return 1; } ret = sqlite3_open(db_name, &db); if (ret != SQLITE_OK) { fprintf(stderr, "%s\n", sqlite3_errmsg(db)); h_db_close(); return 1; } char *sql = "CREATE TABLE IF NOT EXISTS hentai (url TEXT PRIMARY KEY NOT NULL, artist_name TEXT NOT NULL, website_name TEXT NOT NULL) STRICT;"; ret = sqlite3_exec(db, sql, NULL, 0, &err_msg); if (ret != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", err_msg); sqlite3_free(err_msg); h_db_close(); return 1; } return 0; } void h_db_close() { sqlite3_close(db); } static int fprintf_callback(void *fptr, int argc, char **argv, char **col_name) { if (fptr == NULL) { fprintf(stderr, "fptr is NULL\n"); return 1; } size_t i; for (i = 0; i < argc; i++) { fprintf(fptr, "%s", argv[i] ? argv[i] : "NULL"); if (i < argc - 1) { fprintf(fptr, " "); } } fprintf(fptr, "\n"); return 0; } static int db_row_callback(void *db_row, int argc, char **argv, char **col_name) { snprintf(db_row, strlen(argv[0]) * 2, "%s %s %s", argv[0], argv[1], argv[2]); 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; size_t char_count = name_length; char *tmp_name = malloc(name_length + 1); memcpy(tmp_name, url + offset, name_length); tmp_name[name_length] = '\0'; size_t i; size_t j = 0; for (i = 0; i < strlen(tmp_name); i++) { if (tmp_name[i] == '%') { char url_encoded[4]; url_encoded[0] = tmp_name[i]; url_encoded[1] = tmp_name[i + 1]; url_encoded[2] = tmp_name[i + 2]; url_encoded[3] = '\0'; if (strstr("%20%21%22%23%24%26%27%28%29%2A%2C%2E%2F%3B%3C%3E%3F%5B%5C%5D%5E%60%7B%7C%7D%7E", url_encoded) != NULL) { tmp_name[i] = ' '; char_count -= 1; } else if (strcmp(url_encoded, "%25") == 0) { tmp_name[i] = '%'; } else if (strcmp(url_encoded, "%2B") == 0) { tmp_name[i] = '+'; } else if (strcmp(url_encoded, "%2D") == 0) { tmp_name[i] = '-'; } else if (strcmp(url_encoded, "%2E") == 0) { tmp_name[i] = '.'; } else if (strcmp(url_encoded, "%2F") == 0) { tmp_name[i] = '/'; } else if (strcmp(url_encoded, "%3A") == 0) { tmp_name[i] = ':'; } else if (strcmp(url_encoded, "%3D") == 0) { tmp_name[i] = '='; } else if (strcmp(url_encoded, "%40") == 0) { tmp_name[i] = '@'; } else if (strcmp(url_encoded, "%5F") == 0) { tmp_name[i] = '_'; } else { return NULL; } tmp_name[i += 1] = ' '; tmp_name[i += 1] = ' '; char_count -= 2; } } char *artist_name = malloc(char_count + 1); memset(artist_name, 0, char_count + 1); for (i = 0; i < name_length; i++) { if (tmp_name[i] == ' ') { continue; } artist_name[j] = tmp_name[i]; j++; } artist_name[char_count] = '\0'; j = strlen(artist_name) - strlen("artist"); if (strcmp(artist_name + j, "artist") == 0) { for (; j < strlen(artist_name); j++) { artist_name[j] = '\0'; } } j = strlen(artist_name) - 1; while (artist_name[j] == '_') { artist_name[j] = '\0'; j--; } if (strlen(artist_name) < 2) { return NULL; } return artist_name; } int h_db_add(char *db_row, const char *url) { char *sql = malloc(10000); 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 1; } 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 1; } sprintf(sql, "INSERT INTO hentai VALUES ('%s', '%s', '%s'); SELECT * from hentai WHERE url = '%s';", url, artist_name, website_name, url); result = sqlite3_exec(db, sql, db_row_callback, db_row, &error_msg); free(sql); free(artist_name); if (result != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", error_msg); sqlite3_free(error_msg); return 1; } return 0; } int h_db_add_custom_name(char *db_row, const char *url, const char *custom_name) { char *sql = malloc(10000); 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 1; } sprintf(sql, "INSERT INTO hentai VALUES ('%s', '%s', '%s'); SELECT * from hentai WHERE url = '%s';", url, custom_name, website_name, url); result = sqlite3_exec(db, sql, db_row_callback, db_row, &error_msg); free(sql); if (result != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", error_msg); sqlite3_free(error_msg); return 1; } return 0; } int h_db_generate_file(FILE *fptr, const char *website_name) { char *sql = malloc(10000); int result; char *error_msg; sprintf(sql, "SELECT * FROM hentai WHERE website_name = '%s' ORDER BY url ASC;", website_name); result = sqlite3_exec(db, sql, fprintf_callback, fptr, &error_msg); free(sql); if (result != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", error_msg); sqlite3_free(error_msg); return 1; } return 0; } int h_db_update_artist_name(const char *url, const char *new_artist_name) { char *sql = malloc(10000); 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, fprintf_callback, stdout, &error_msg); free(sql); if (result != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", error_msg); sqlite3_free(error_msg); return 1; } return 0; } int h_db_delete(const char *url) { char *sql = malloc(10000); int result; char *error_msg; sprintf(sql, "DELETE FROM hentai WHERE url = '%s';", url); result = sqlite3_exec(db, sql, fprintf_callback, stdout, &error_msg); free(sql); if (result != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", error_msg); sqlite3_free(error_msg); return 1; } return 0; }