new and untested pure C implementaion
This commit is contained in:
278
src/db.c
278
src/db.c
@@ -1,33 +1,62 @@
|
||||
#include "db.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sqlite3.h>
|
||||
|
||||
void print_usage() {
|
||||
printf("Usage: db <arguments>\n");
|
||||
printf("\tadd <url> [custom_name] \n");
|
||||
printf("\tgenerate <website_name>\n");
|
||||
printf("\tupdate <url> <new_artist_name>\n");
|
||||
printf("\tdelete <url>\n");
|
||||
}
|
||||
sqlite3 *db;
|
||||
|
||||
void exit_nicely(sqlite3 *db, const char *msg) {
|
||||
if (msg != NULL) {
|
||||
fprintf(stderr, "%s\n", msg);
|
||||
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;
|
||||
}
|
||||
print_usage();
|
||||
sqlite3_close(db);
|
||||
exit(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;
|
||||
}
|
||||
|
||||
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");
|
||||
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) {
|
||||
printf(" ");
|
||||
fprintf(fptr, " ");
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -54,175 +83,176 @@ char* get_artist_from_url(const char *url, const char *website_name) {
|
||||
}
|
||||
|
||||
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';
|
||||
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;
|
||||
}
|
||||
|
||||
bool add(sqlite3 *db, const char *url) {
|
||||
char *sql;
|
||||
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 false;
|
||||
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 false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
sprintf(sql, "INSERT INTO hentai VALUES ('%s', '%s', '%s');", url, artist_name, website_name);
|
||||
result = sqlite3_exec(db, sql, print_callback, 0, &error_msg);
|
||||
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 false;
|
||||
return 1;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool add_custom_name(sqlite3 *db, const char *url, const char *custom_name) {
|
||||
char *sql;
|
||||
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 false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
sprintf(sql, "INSERT INTO hentai VALUES ('%s', '%s', '%s');", url, custom_name, website_name);
|
||||
result = sqlite3_exec(db, sql, print_callback, 0, &error_msg);
|
||||
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 false;
|
||||
return 1;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool generate(sqlite3 *db, const char *website_name) {
|
||||
char *sql;
|
||||
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';", website_name);
|
||||
result = sqlite3_exec(db, sql, print_callback, 0, &error_msg);
|
||||
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 false;
|
||||
return 1;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool update_artist_name(sqlite3 *db, const char *url, const char *new_artist_name) {
|
||||
char *sql;
|
||||
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, print_callback, 0, &error_msg);
|
||||
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 false;
|
||||
return 1;
|
||||
}
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool delete(sqlite3 *db, const char *url) {
|
||||
char *sql;
|
||||
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, print_callback, 0, &error_msg);
|
||||
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 false;
|
||||
return 1;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user