I am trying to create a program that downloads a JSON file and I’m trying to convert it to sqlite.
Why?:
- I believe the training data on Deepdanbooru is weak compaired to Rule34 or Gelbooru. I have tried compiling the C# for linux, but I decided it was too hard.
I am a mainly a Web developer who uses basic JS/HTML/CSS. These don’t help as I need it to be in C. (Not ++/#). I have tried using AI to assist, but no matter what language I use (Python, Ruby, Java, C), It will fail.
Here is the closest I gotten ( 〔〕 --> ><:
#include 〔stdio.h〕
#include 〔stdlib.h〕
#include 〔string.h〕
#include 〔curl/curl.h〕
#include "cJSON.h"
#include "sqlite3.h"
#define URL "https://danbooru.donmai.us/posts.json?page=1&limit=1000&tags=duck&json=1"
#define DB_NAME "data.db"
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
int i;
for (i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main() {
CURL *curl;
CURLcode res;
FILE *fp;
char *url = URL;
char outfilename[FILENAME_MAX] = "data.json";
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename, "wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(fp);
}
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open(DB_NAME, &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
char *sql = "CREATE TABLE data (id INT PRIMARY KEY NOT NULL, md5 TEXT NOT NULL, tag_string TEXT NOT NULL, tag_count_general INT NOT NULL);";
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return 1;
}
cJSON *json;
cJSON *item;
cJSON *id;
cJSON *md5;
cJSON *tag_string;
cJSON *tag_count_general;
char buffer[1024];
fp = fopen("data.json", "r");
fread(buffer, 1024, 1, fp);
fclose(fp);
json = cJSON_Parse(buffer);
if (!json) {
printf("Error before: [%s]\n", cJSON_GetErrorPtr());
return 1;
}
cJSON_ArrayForEach(item, json) {
id = cJSON_GetObjectItem(item, "id");
md5 = cJSON_GetObjectItem(item, "md5");
tag_string = cJSON_GetObjectItem(item, "tag_string");
tag_count_general = cJSON_GetObjectItem(item, "tag_count_general");
char insert_query[1024];
sprintf(insert_query,
"INSERT INTO data (id, md5, tag_string, tag_count_general) VALUES (%d,'%s','%s',%d);",
id->valueint,
md5->valuestring,
tag_string->valuestring,
tag_count_general->valueint
);
rc = sqlite3_exec(db, insert_query, callback, 0, &err_msg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return 1;
}
}
}
Compile:
gcc cJSON.c file.c -lcurl -lsqlite3
Error:
Error before: [tag_count_co]
For the benefit of anyone reading this later, the function to check end-of-file should be
feof
, notfoef
.Updated, good catch!