From 0ed2864691f85d5c19e999e494101113b2ab4bf0 Mon Sep 17 00:00:00 2001 From: Adam Fordsmand Date: Sun, 31 Oct 2021 22:19:47 +0100 Subject: [PATCH] Added previously written code --- BlogDB.c | 782 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 782 insertions(+) create mode 100755 BlogDB.c diff --git a/BlogDB.c b/BlogDB.c new file mode 100755 index 0000000..03d6a54 --- /dev/null +++ b/BlogDB.c @@ -0,0 +1,782 @@ +#define _GNU_SOURCE +#include +#include +#include +#include + +static MYSQL* conn2maria(); +static int AddPost(char title[], int authorId, char datePosted[], char post[], int tags[], size_t tagSize, MYSQL* con); +static int EditPost(int postID, char title[], char post[], MYSQL* con); +static int PullPostData(char* strings[6], int postID, MYSQL* con); +static int AddTag(char tagTitle[], MYSQL* con); +static int DeleteTag(int tagID, MYSQL* con); +static int EditTag(int tagID, char tagTitle[], MYSQL* con); +static int AssignTag(int tagID, int postID, MYSQL* con); +static int RetractTag(int tagID, int postID, MYSQL* con); +static int AddAuthor(char firstName[], char lastName[], char email[], MYSQL* con); +static int PullAuthorData(char* strings[4], int authorID, MYSQL* con); +static int ChangeAuthor(int postID, int authorID, MYSQL* con); +static int TogglePost(int postID, MYSQL* con); +static bool IsEnabled(int postID, MYSQL* con); + +// TODO: Build the following functions +// -- BlogWrite +// -- BlogEdit +// -- AddFilePost +// -- PullPostDescriptions +// -- ActivePostIDs + + + +// Connects to the MariaDB database and returns the connection +MYSQL* conn2maria() +{ + // Initialize the connection + MYSQL *con = mysql_init(NULL); + + // If successful, continue, else throw error + if (con == NULL) + { + fprintf(stderr, "%s\n", mysql_error(con)); + exit(1); + } + + // Connect with specific details, if successful continue, else throw error + if (mysql_real_connect(con, "localhost", "adam", "1234", + "mydb", 0, NULL, 0) == NULL) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // return successful connection + return con; +} + +// Adds a new post to the database, with given values +int AddPost(char title[], int authorId, char datePosted[], char post[], int tags[], size_t tagSize, MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + // Build a query + char* query; + if(0 > asprintf(&query, + "INSERT INTO blog_posts (title,author_id,date_posted,post,state) VALUES (\"%s\", \"%d\", \"%s\", \"%s\", \"0\")", + title, + authorId, + datePosted, + post + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, query)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Free the memory of the query string + free(query); + + + if (mysql_query(con, "SELECT LAST_INSERT_ID()")) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + // For all rows (only one ;P) + MYSQL_ROW row; + row = mysql_fetch_row(result); + int output = atoi(row[0]); + + // Ignore all if tags is NULL pointer + if (tags != NULL) + { + //printf("%d\n", tagSize / sizeof(int)); + // for the size of tags + for (int i = 0; i < tagSize / sizeof(int); i++) + { + printf("%d\n", i); + + AssignTag(tags[i], output, con); + } + } + + return output; +} + +// Edits a post in the database, to the new given values +int EditPost(int postID, char title[], char post[], MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + char* selectQuery; + if(0 > asprintf(&selectQuery, + "SELECT * FROM blog_posts WHERE id=(%d)", + postID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, selectQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + if (result == NULL) { + printf("Hey\n"); + } + + MYSQL_ROW row; + int tagFound = 1; + + + if (mysql_fetch_row(result) == NULL) + { + printf("Hey4\n"); + tagFound = 0; + } + + free(selectQuery); + + char* updateQuery; + + if (!tagFound) { return postID; } + + // Build a query + if (0 > asprintf(&updateQuery, "UPDATE blog_posts SET title=(\"%s\"), post=(\"%s\") WHERE id=(%d)", + title, + post, + postID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, updateQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + free(updateQuery); + + return postID; +} + +// Pulls a single post's data into the supplied array +int PullPostData(char* strings[6], int postID, MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + // Build a query + char* query; + if(0 > asprintf(&query, "SELECT * FROM blog_posts WHERE id=(%d)", postID)) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, query)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Free the memory of the query string + free(query); + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + // For all rows (only one ;P) + MYSQL_ROW row; + while ((row = mysql_fetch_row(result))) + { + // For all fields in row + for(int i = 0; i < num_fields; i++) + { + // 'return' the output + strings[i] = row[i]; + } + + } + + return postID; +} + +// Adds a tag +int AddTag(char tagTitle[], MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + char* insertQuery; + + // Build a query + if (0 > asprintf(&insertQuery, "INSERT INTO tags (name) VALUES (\"%s\")", + tagTitle + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, insertQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + free(insertQuery); + + if (mysql_query(con, "SELECT LAST_INSERT_ID()")) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + // For all rows (only one ;P) + MYSQL_ROW row; + row = mysql_fetch_row(result); + int output = atoi(row[0]); + + return output; +} + +// Removes a tag, and unassigns itself from any and all posts. +int DeleteTag(int tagID, MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + char* deleteQuery; + + // Build a query + if (0 > asprintf(&deleteQuery, "DELETE FROM tags WHERE id=(%d)", + tagID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, deleteQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + free(deleteQuery); + + char* deleteTagsQuery; + + // Build a query + if (0 > asprintf(&deleteTagsQuery, "DELETE FROM blog_post_tags WHERE tag_id=(%d)", + tagID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, deleteTagsQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + free(deleteTagsQuery); + + return tagID; +} + +// Edit the tag name +int EditTag(int tagID, char tagTitle[], MYSQL* con) +{ + + if (con == NULL) + { + con = conn2maria(); + } + + char* selectQuery; + if(0 > asprintf(&selectQuery, + "SELECT * FROM tags WHERE id=(%d)", + tagID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, selectQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + MYSQL_ROW row; + int tagFound = 1; + + + if (mysql_fetch_row(result) == NULL) + { + tagFound = 0; + } + + free(selectQuery); + + char* updateQuery; + + if (!tagFound) { return tagID; } + + // Build a query + if (0 > asprintf(&updateQuery, "UPDATE tags SET name=(\"%s\") WHERE id=(%d)", + tagTitle, + tagID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, updateQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + free(updateQuery); + + return tagID; +} + +// Assign a post a given tag. +int AssignTag(int tagID, int postID, MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + char* selectQuery; + if(0 > asprintf(&selectQuery, + "SELECT * FROM blog_post_tags WHERE tag_id=(%d) AND blog_post_id=(%d)", + tagID, + postID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, selectQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + if (result == NULL) { + printf("Hey\n"); + } + + MYSQL_ROW row; + int tagFound = 1; + + + if (mysql_fetch_row(result) == NULL) + { + printf("Hey4\n"); + tagFound = 0; + } + + free(selectQuery); + + char* insertQuery; + + if (tagFound) { return postID; } + + // Build a query + if (0 > asprintf(&insertQuery, "INSERT INTO blog_post_tags (tag_id,blog_post_id) VALUES (%d, %d)", tagID, postID )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, insertQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + free(insertQuery); + + return postID; +} + +// Unassign a tag from the given post +int RetractTag(int tagID, int postID, MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + char* deleteQuery; + + // Build a query + if (0 > asprintf(&deleteQuery, "DELETE FROM blog_post_tags WHERE tag_id=(%d) AND blog_post_id=(%d)", + tagID, + postID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, deleteQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + free(deleteQuery); + + return postID; +} + +// Add an author +int AddAuthor(char firstName[], char lastName[], char email[], MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + char* insertQuery; + + // Build a query + if (0 > asprintf(&insertQuery, "INSERT INTO people (first_name, last_name, email) VALUES (\"%s\", \"%s\", \"%s\")", + firstName, + lastName, + email + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, insertQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + free(insertQuery); + + if (mysql_query(con, "SELECT LAST_INSERT_ID()")) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + // For all rows (only one ;P) + MYSQL_ROW row; + row = mysql_fetch_row(result); + int output = atoi(row[0]); + + return output; +} + +// Pull the full name and email of the given author ID +int PullAuthorData(char* strings[4], int authorID, MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + // Build a query + char* query; + if(0 > asprintf(&query, "SELECT * FROM people WHERE id=(%d)", authorID)) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, query)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Free the memory of the query string + free(query); + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + // For all rows (only one ;P) + MYSQL_ROW row; + while ((row = mysql_fetch_row(result))) + { + // For all fields in row + for(int i = 0; i < num_fields; i++) + { + // 'return' the output + strings[i] = row[i]; + } + + } + + return authorID; +} + +// Change the author of a given post +int ChangeAuthor(int postID, int authorID, MYSQL* con) +{ + + if (con == NULL) + { + con = conn2maria(); + } + + char* selectQuery; + if(0 > asprintf(&selectQuery, + "SELECT * FROM blog_posts WHERE id=(%d)", + postID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, selectQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + MYSQL_ROW row; + int postFound = 1; + + + if (mysql_fetch_row(result) == NULL) + { + postFound = 0; + } + + free(selectQuery); + + char* updateQuery; + + if (!postFound) { return postID; } + + // Build a query + if (0 > asprintf(&updateQuery, "UPDATE blog_posts SET author_id=(%d) WHERE id=(%d)", + authorID, + postID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, updateQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + free(updateQuery); + + return postID; +} + +// Toggles the posts state, which determines whether the code ignores it. +int TogglePost(int postID, MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + char* selectQuery; + if(0 > asprintf(&selectQuery, + "SELECT * FROM blog_posts WHERE id=(%d)", + postID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, selectQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + MYSQL_ROW row; + int postFound = 1; + + row = mysql_fetch_row(result); + + if (row == NULL) + { + return postID; + } + + int state = atoi(row[5]); + free(selectQuery); + + char* updateQuery; + + // Build a query + if (0 > asprintf(&updateQuery, "UPDATE blog_posts SET state=(%d) WHERE id=(%d)", + !state, + postID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, updateQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + free(updateQuery); + + return postID; +} + +// Return true if state is 0, false if it doesn't exist or 1 +bool IsEnabled(int postID, MYSQL* con) +{ + if (con == NULL) + { + con = conn2maria(); + } + + char* selectQuery; + if(0 > asprintf(&selectQuery, + "SELECT * FROM blog_posts WHERE id=(%d)", + postID + )) exit(1); + + // Query the server, if successful continue, else throw error + if (mysql_query(con, selectQuery)) + { + fprintf(stderr, "%s\n", mysql_error(con)); + mysql_close(con); + exit(1); + } + + // Get results + MYSQL_RES *result = mysql_store_result(con); + int num_fields = mysql_num_fields(result); + + MYSQL_ROW row; + int postFound = 1; + + row = mysql_fetch_row(result); + + if (row == NULL) + { + return false; + } + + int state = atoi(row[5]); + free(selectQuery); + return !state; +} + + +// Main +int main(int argc, char *argv[]) +{ + /* + // ================================= + // Example of using 'PullPostData()' + // ================================= + + // Init array of six strings + // Pull data of postID '1' into 'result' + char *result[6]; + PullPostData(result, 1, NULL); + + // Foreach in result + for (int i = 0; i < sizeof(result)/sizeof(result[0]); i++) + { + // Print contents on a new line + printf("%s\n", result[i]); + } + + // ================================= + */ + + /* + char *result[4]; + PullAuthorData(result, 1, NULL); + + // Foreach in result + for (int i = 0; i < sizeof(result)/sizeof(result[0]); i++) + { + // Print contents on a new line + printf("%s\n", result[i]); + } + */ + + // Open the connection + MYSQL *con = conn2maria(); + + // ================================= + // Example of using 'PullPostData()' + // ================================= + + // AddPost return the inserted rows, NULL pointer for no tags, 0 for size + + //int tags[] = {1, 2, 3}; + //printf("%d", AddPost("Something", 1, "2020-01-01", "Ssdjshdjahdkjomething", tags, sizeof(tags))); + //AssignTag(6, 42, con); + //EditPost(69, "HEY", "THERE BUDDY", con); + //printf("%d\n", AddTag("Test", con)); + //DeleteTag(7, con); + //RetractTag(1, 1, con); + //EditTag(5, "Projects", con); + //AddAuthor("Me", "Meson", "email@me.com", con); + //ChangeAuthor(62, 2, con); + //TogglePost(51, con); + //printf("%s\n", IsEnabled(51, con) ? "True" : "False"); + + // ================================= + + exit(0); +}