commit 833cc93681e4b3d4ded8a3e9e9daa43def00504e Author: Wessel Tip Date: Tue Oct 4 16:14:18 2022 +0200 feat: initial commit diff --git a/include/choicemenu.h b/include/choicemenu.h new file mode 100644 index 0000000..ff65eee --- /dev/null +++ b/include/choicemenu.h @@ -0,0 +1,6 @@ +#ifndef CHOICEMENU_H +#define CHOICEMENU_H + +void choice_menu(void); + +#endif \ No newline at end of file diff --git a/include/database.h b/include/database.h new file mode 100644 index 0000000..bf0f90b --- /dev/null +++ b/include/database.h @@ -0,0 +1,18 @@ +#ifndef DATABASE_H +#define DATABASE_H + +extern char _server[56]; +extern char _user[56]; +extern char _password[56]; +extern char _database[56]; + +void init_mysql(); +void kill(int code); +char *get_tables(void); +char *print_tables(void); +char *print_field(char *table, char *field); +int insert_row(char table[56], char fieldData[2048], char req[2048]); +int delete_row(char table[56], char identifier[2048]); +int modify_row(char table[56], char identifier[2048], char data[2048]); + +#endif \ No newline at end of file diff --git a/include/utils.h b/include/utils.h new file mode 100644 index 0000000..3f49bbd --- /dev/null +++ b/include/utils.h @@ -0,0 +1,6 @@ +#ifndef UTILS_H +#define UTILS_H + +const unsigned long hash(const char *str); + +#endif \ No newline at end of file diff --git a/lib/choicemenu.c b/lib/choicemenu.c new file mode 100644 index 0000000..b472b31 --- /dev/null +++ b/lib/choicemenu.c @@ -0,0 +1,183 @@ +#include +#include +#include +#include + +/* Local imports */ +#include "./utils.h" +#include "./database.h" + +/* Hashed constants for choice menu */ +#define SA 5863801 +#define SF 5863806 +#define AR 5863224 +#define DR 5863323 +#define MR 5863620 +#define KL 5863548 + +/* variables */ +unsigned long choiceHash; +char confirmation[3], + table[56], field[56], + identifier[2048], data[2048]; + +/** + * @brief Shows `field` from `table` + * + * Used to list all rows that have a value + * assigned to `field` in `table`. Determined + * by user input. + * + * @returns Void. + */ +void table_show() { + printf("\n\t[SHOW TABLE FIELD]\n"); + printf("Insert table to show:\t"); + scanf("%s", table); + printf("Insert field to show:\t"); + scanf("%s", field); + + printf("Selected:\t\t%s[%s]\n", table, field); + printf("Correct? (y/n):\t"); + scanf("%s", confirmation); + + if (strcmp(confirmation, "n") == 0 || strcmp(confirmation, "no") == 0) + table_show(); + + print_field(table, field); +} + +/** @brief Puts `req` into `table` + * + * Used to let the end user add rows to + * the desired table, asks for `req` and + * `fieldData` to assign `req` to. + * + * @returns Void. + */ +void row_input() { + char fieldData[2048]; + char req[2048]; + + printf("\n\t[INSERT ROW INTO TABLE]\n"); + printf("Insert table to use:\t"); + scanf("%s", table); + printf("Insert fields to use:\t"); + scanf("%s", fieldData); + printf("Insert data for fields:\t"); + scanf("%s", req); + + printf("Selected:\t\t%s(%s): %s\n", table, fieldData, req); + printf("Correct? (y/n):\t"); + scanf("%s", confirmation); + + if (strcmp(confirmation, "n") == 0 || strcmp(confirmation, "no") == 0) + row_input(); + + insert_row(table, fieldData, req); +} + +/** @brief Removes `identifier` from `table` + * + * Deletes rows that match `identifier` + * determined by the user from `table`. + * + * @returns Void. + */ +void row_delete() { + printf("\n\t[DELETE ROW FROM TABLE]\n"); + printf("Insert table to use:\t"); + scanf("%s", table); + printf("Insert identifier(s) to use:\t"); + scanf("%s", identifier); + + printf("Selected:\t\t%s: %s\n", table, identifier); + printf("Correct? (y/n):\t"); + scanf("%s", confirmation); + + if (strcmp(confirmation, "n") == 0 || strcmp(confirmation, "no") == 0) + row_delete(); + + delete_row(table, identifier); +} + +/** @brief Modifies `identifier` to `data` from `table` + * + * Searches for `identifier` in `table` and modifies it + * to `data` all determined by the user. + * + * @returns Void. + */ +void row_modify() { + printf("\n\t[CREATE TABLE]\n"); + printf("Insert table to use:\t"); + scanf("%s", table); + printf("Insert identifier(s) to use:\t"); + scanf("%s", identifier); + printf("Insert data to override:\t"); + scanf("%s", data); + + printf("Selected:\t\t%s(%s): %s\n", table, identifier, data); + printf("Correct? (y/n):\t"); + scanf("%s", confirmation); + + if (strcmp(confirmation, "n") == 0 || strcmp(confirmation, "no") == 0) + row_modify(); + + modify_row(table, identifier, data); +} + +/** @brief Activates the choice menu loop + * + * Used to give the user an interfcae to + * interact with all the commands defined above. + * + * @returns Void. + */ +void choice_menu() { + printf("Choose one of the following:\n"); + printf("\t[sa] Show all tables\n"); + printf("\t[sf] Show `field` from `table`\n"); + printf("\t[ar] Add `row` from `table`\n"); + printf("\t[dr] Delete `row` from `table`\n"); + printf("\t[dr] Modify `row` from `table`\n"); + printf("\t[kl] End database connection`\n"); + + char input[2]; + + printf("Choice:\t"); + scanf("%s", input); + choiceHash = hash(input); + + switch (choiceHash) + { + case KL: + printf("\t[Kill database connection]\n"); + kill(0); + break; + case SA: + printf("\n\t[SHOW ALL TABLES]\n"); + print_tables(); + choice_menu(); + break; + case SF: + table_show(); + choice_menu(); + break; + case AR: + row_input(); + choice_menu(); + break; + case DR: + row_delete(); + choice_menu(); + break; + case MR: + row_modify(); + choice_menu(); + break; + default: + printf("\t[INVALID CHOOCE, PLEASE PICK AGAIN]\n"); + choice_menu(); + } +} \ No newline at end of file diff --git a/lib/database.c b/lib/database.c new file mode 100644 index 0000000..5b98d84 --- /dev/null +++ b/lib/database.c @@ -0,0 +1,176 @@ +#include +#include +#include + +/* Sets global variables if not set */ +#ifdef __MAIN__ +char _server[56] = "localhost"; +char _user[56] = "pipo"; +char _password[56] = "theclown"; +char _database[56] = "mysql"; +#else +extern char _server[56]; +extern char _user[56]; +extern char _password[56]; +extern char _database[56]; +#endif + +/* Variables */ +MYSQL *conn; +MYSQL_RES *res; +MYSQL_ROW row; + +MYSQL_RES *query(char *command) { + if (mysql_query(conn, "SHOW TABLES")) { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } + + return mysql_use_result(conn); +} + +/** @brief Starts the connection to the database + * + * Initializes a conncection to `_user@_serve r` + * That will be used by the rest of this lib. + * + * @returns Void. + */ +void init_mysql() { + conn = mysql_init(NULL); + if (!mysql_real_connect(conn, _server, _user, _password, _database, 0, NULL, 0)) { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } +} + +/** @brief Ends the connection to `_server` + * + * This function is used to cleanly exit the + * database when operations are finished. + * + * @returns Void. + */ +void kill() { + mysql_free_result(res); + mysql_close(conn); +} + +/* Functions that return to stdout */ +/** @brief Prints all tables available in `_database` + * + * Loops through all tables in `_database` accsessible + * by `_user` and prints them to stdout. + * + * @returns Void. + */ +void print_tables() { + res = query("SHOW TABLES"); + + while ((row = mysql_fetch_row(res)) != NULL) + printf("%s\n", row[0]); +} + +/** @brief Prints all values of `field` from `table` + * + * Loops through `field` in `table` and prints them out + * to stdout. + * + * @param table The table to view + * @param field The field to view from `table` + * + * @returns Void. + */ +void print_field(char* table, char* field) { + char command[2048]; + sprintf(command, "SELECT %s FROM %s", field, table); + + res = query(command); + + while ((row = mysql_fetch_row(res)) != NULL) + printf("%s\n", row[0]); +} + +/* Functions that return a usable variable */ +/** @brief Returns all tables in `_database` + * + * Returns all tables in `_database` to a string, + * seperated with new lines (\n). + * + * @returns str The string of tables in `_database` + */ +char *get_tables() { + res = query("SHOW TABLES"); + + char *str = malloc(sizeof(char) * 2048); + sprintf(str, ""); + + while ((row = mysql_fetch_row(res)) != NULL) + sprintf(str, "%s %s\n", str, row[0]); + + return str; +} + +/** @brief Inserts `req` into `table` using `fieldData` + * + * Used to create an entry into `table` with `req` + * as data that is put into `fieldData`. + * + * @param table The table to insert the row into + * @param fieldData The fields to assign `req` to + * @param req The data to assign to the new row + * + * @returns Void + */ +void insert_row(char table[56], char fieldData[2048], char req[2048]) { + char command[2048]; + sprintf(command, "INSERT INTO %s (%s) VALUES (%s)", table, fieldData, req); + + res = query(command); + + while ((row = mysql_fetch_row(res)) != NULL) + printf("%s\n", row[0]); +} + +/** @brief Deletes row matching `identifier` from `table` + * + * This function is used to delete unwanted rows + * from `table` that match the conditions mentioned + * in `identifier`. + * + * @param table The table to match the identifier to + * @param identifier The conditions to use when searching + * + * @returns Void. + */ +void delete_row(char table[56], char identifier[2048]) { + char command[2048]; + sprintf(command, "DELETE FROM %s WHERE %s", table, identifier); + + res = query(command); + + while ((row = mysql_fetch_row(res)) != NULL) + printf("%s\n", row[0]); +} + +/** @brief Modify a row in `table` that match `identifier` using `data` + * + * Changes the values of rows found in `table` matching the + * `identifier` to the desired values passed into `data`. + * + * @param table The table to modify the row from + * @param identifier The identifier for the row to modify + * @param data The data to overwrite the row + * found with `identifier` with + * + * @returns Void. + */ +void modify_row(char table[56], char identifier[2048], char data[2048]) { + char command[2048]; + sprintf(command, "UPDATE %s SET %s WHERE %s", table, data, identifier); + + res = query(command); + + while ((row = mysql_fetch_row(res)) != NULL) + printf("%s\n", row[0]); +} \ No newline at end of file diff --git a/lib/utils.c b/lib/utils.c new file mode 100644 index 0000000..54962aa --- /dev/null +++ b/lib/utils.c @@ -0,0 +1,20 @@ + +/** @brief Hash `str` to `hash` for use in a switch case + * + * A string needs to be hashed for it to be used + * inside of a switch statement. We want to use a switch + * statement instead of an if-else chain for it's + * simplicity and lower amount of low-level operations. + * + * @param str The string to hash + * + * @returns hash The hashed version of `str` + */ +const unsigned long hash(const char *str) { + unsigned long hash = 5381; + int c; + + while ((c = *str++)) + hash = ((hash << 5) + hash) + c; + return hash; +} \ No newline at end of file diff --git a/makefile b/makefile new file mode 100644 index 0000000..6175daa --- /dev/null +++ b/makefile @@ -0,0 +1,31 @@ +CC := gcc + +SRC_DIR := src +LIB_DIR := lib +OBJ_DIR := obj +OUT_DIR := out +INC_DIR := include +SRC_FILES := $(wildcard $(SRC_DIR)/*.c) $(wildcard $(LIB_DIR)/*.c) +OBJ_FILES := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRC_FILES)) + +LIBS := $(mysql_config --libs) $(mysql_config --cflags) -lmysqlclient +CFLAGS := -I$(INC_DIR) + +dev: $(OBJ_FILES) + $(CC) -o $(OUT_DIR)/$@ $^ $(CFLAGS) $(LIBS) && strace ./out/dev + +run: $(OBJ_FILES) + $(CC) -o $(OUT_DIR)/$@ $^ $(CFLAGS) $(LIBS) && ./out/run + +prod: $(OBJ_FILES) + $(CC) -o $(OUT_DIR)/$@ $^ $(CFLAGS) $(LIBS) + + +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c + $(CC) -c -o $@ $< + +.PHONY: clean + +clean: +# rm -f $(OBJ_DIR)/*.o *~ core $(INC_DIR)/*~ + rm -f $(OBJ_DIR)/*.o $(OUT_DIR)/* \ No newline at end of file diff --git a/obj/main.o b/obj/main.o new file mode 100644 index 0000000..70aa739 Binary files /dev/null and b/obj/main.o differ diff --git a/out/run b/out/run new file mode 100755 index 0000000..c078e86 Binary files /dev/null and b/out/run differ diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..cb9d8b6 --- /dev/null +++ b/src/main.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include + +#include "../include/database.h" +#include "../include/choicemenu.h" + +#define __MAIN__ +#ifdef __MAIN__ +char _server[56] = "localhost"; +char _user[56] = "pipo"; +char _password[56] = "theclown"; +char _database[56] = "f1"; +#else +extern char _server[56]; +extern char _user[56]; +extern char _password[56]; +extern char _database[56]; +#endif + + +void main() { + init_mysql(); + + choice_menu(); +} \ No newline at end of file diff --git a/tmp/database.c b/tmp/database.c new file mode 100644 index 0000000..ab9e84a --- /dev/null +++ b/tmp/database.c @@ -0,0 +1,45 @@ +#include +#include + +MYSQL *conn; +MYSQL_RES *res; +MYSQL_ROW row; + +char *_server = "localhost"; +char *_user = "pipo"; +char *_password = "theclown"; /* set me first */ +char *_database = "mysql"; + +void init(char *server, char *user, char *password, char *database) { + _server = server; + _user = user; + _password = password; /* set me first */ + _database = database; + + conn = mysql_init(NULL); + + /* Connect to database */ + if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } + + /* send SQL query */ + if (mysql_query(conn, "show tables")) { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } + + res = mysql_use_result(conn); + + /* output table name */ + printf("MySQL Tables in mysql database:\n"); + + while ((row = mysql_fetch_row(res)) != NULL) + printf("%s \n", row[0]); +} + +void kill(int code) { + mysql_free_result(res); + mysql_close(conn); +} \ No newline at end of file diff --git a/tmp/main.c b/tmp/main.c new file mode 100644 index 0000000..a7410ab --- /dev/null +++ b/tmp/main.c @@ -0,0 +1,45 @@ +#include +#include +#include + +void main() { + // test(); + + MYSQL *conn; + MYSQL_RES *res; + MYSQL_ROW row; + + char *server = "localhost"; + char *user = "pipo"; + char *password = "theclown"; /* set me first */ + char *database = "mysql"; + + conn = mysql_init(NULL); + + /* Connect to database */ + if (!mysql_real_connect(conn, server, user, password, + database, 0, NULL, 0)) + { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } + + /* send SQL query */ + if (mysql_query(conn, "show tables")) + { + fprintf(stderr, "%s\n", mysql_error(conn)); + exit(1); + } + + res = mysql_use_result(conn); + + /* output table name */ + printf("MySQL Tables in mysql database:\n"); + + while ((row = mysql_fetch_row(res)) != NULL) + printf("%s \n", row[0]); + + /* close connection */ + mysql_free_result(res); + mysql_close(conn); +} diff --git a/tmp/main.o b/tmp/main.o new file mode 100644 index 0000000..a187385 Binary files /dev/null and b/tmp/main.o differ diff --git a/tmp/makefile.bak b/tmp/makefile.bak new file mode 100644 index 0000000..611eb67 --- /dev/null +++ b/tmp/makefile.bak @@ -0,0 +1,37 @@ +CC = gcc +OBJ = *.o database.o + +LIBS = $(mysql_config --libs) $(mysql_config --cflags) -lmysqlclient + +OUTDIR = out +IDIR = include +ODIR = obj +LDIR = lib +SDIR = src +CFLAGS = -I$(IDIR) + +_DEPS = *.h +DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) +# SRC = $(wildcard $(SDIR)/*.0) +_OBJ = main.o +OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) +# OBJ = $(patsubst $(SDIR)/%.c,$(ODIR)/%.o,$(SRC)) + +$(ODIR)/%.o: $(SDIR)/%.c + $(CC) -o $@ $^ $(CFLAGS) $(LIBS) + +# $(OBJ): $(ODIR)/%.o: src/%.c $(DEPS) +# $(CC) -c -o $@ $< $(CFLAGS) + +dev: $(OBJ) + $(CC) -o $(OUTDIR)/$@ $^ $(CFLAGS) $(LIBS) + + +prod: $(OBJ) + $(CC) -o $(OUTDIR)/$@ $^ $(CFLAGS) $(LIBS) + + +.PHONY: clean + +clean: + rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ diff --git a/tmp/pgp.txt b/tmp/pgp.txt new file mode 100644 index 0000000..b09e8bf --- /dev/null +++ b/tmp/pgp.txt @@ -0,0 +1,52 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +sPNV9V2sEQBi +=LKWP +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tmp/pgp.txt.gpg b/tmp/pgp.txt.gpg new file mode 100644 index 0000000..a888590 Binary files /dev/null and b/tmp/pgp.txt.gpg differ