From 72e61a10256707118480b5ae9ce906a67fa41d39 Mon Sep 17 00:00:00 2001 From: managerof Date: Sun, 2 Mar 2025 23:17:59 +0000 Subject: [PATCH] Minor fixes --- bin/main | Bin 0 -> 45696 bytes database.db | Bin 505604 -> 110 bytes include/db.h | 61 ++++--- src/db.c | 489 ++++++++++++++++++++++++++++++++++++--------------- src/main.c | 11 +- 5 files changed, 388 insertions(+), 173 deletions(-) create mode 100755 bin/main diff --git a/bin/main b/bin/main new file mode 100755 index 0000000000000000000000000000000000000000..7ca1b23cd56c860d960190f21145a90b3ba5b587 GIT binary patch literal 45696 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 nOxuw(pJjK8v!oUdRfiQ|W06U`(X#fBK literal 505604 zcmeI$!3}~y6a-MzMz#cF2k2QZRDeK;MkP_~-;EXUuglx>{7mK@x0%2F@R~o>;&*AE z!{YEiSU+xE?BqCIV-?Z_2oNAZfB*pk1PBlyK!5-N0t8kskm@n^4OgYZKByMI2o{JF zAV7cs0RjXF5FkK+009C72oNYvAf4O$^p4C*rzR55+4x1UK%4*p0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB=C)1$KGYw$N>65g -#define MAX_TABLES 10 -#define MAX_COLUMNS 10 -#define MAX_ROWS 100 #define MAX_QUERY_LENGTH 256 -#define MAX_NAME_LENGTH 50 + +/* Default filename for saving/loading the database */ #define DB_FILE "database.db" -typedef struct + +typedef struct Column { - char name[MAX_NAME_LENGTH]; - char data[MAX_ROWS][MAX_NAME_LENGTH]; + char *name; + char **data; /* Array of string data for each row */ } Column; -typedef struct +typedef struct Table { - char name[MAX_NAME_LENGTH]; - Column columns[MAX_COLUMNS]; - int column_count; + char *name; int row_count; + int column_count; + Column **columns; } Table; -typedef struct +typedef struct Database { - Table tables[MAX_TABLES]; int table_count; + Table **tables; } Database; +/* Database Operations */ Database *create_db(void); -void create_table(Database *db, const char *table_name, char *columns); -void insert_into_table(Database *db, const char *table_name, char *values); -void select_from_table(Database *db, const char *table_name); -void parse_query(Database *db, const char *query); -Table *find_table(Database *db, const char *table_name); -void save_database_to_file(Database *db, const char *filename); -void load_database_from_file(Database *db, const char *filename); -int validate_ipv4_address(const char *ip); -void trim_whitespace(char *str); +void free_database(Database *db); -#endif \ No newline at end of file +/* Table Operations */ +Table *find_table(Database *db, const char *table_name); +void create_table(Database *db, const char *table_name, const char *columns_str); +void insert_into_table(Database *db, const char *table_name, const char *values_str); +void select_from_table(Database *db, const char *table_name); + +/* File Operations */ +void save_database_to_file(Database *db, const char *filename); +Database *load_database_from_file(Database *db, const char *filename); + +/* Query Parsing */ +Database *parse_query(Database *db, const char *query); + +/* Utility Functions */ +int validate_ipv4_address(const char *ip); +char *trim_whitespace(char *str); + +#endif /* DB_H */ diff --git a/src/db.c b/src/db.c index a76af78..0ba912b 100644 --- a/src/db.c +++ b/src/db.c @@ -2,42 +2,79 @@ #include #include #include - #include "db.h" -void trim_whitespace(char *str) +/* Writes a string to a file. + * The string is preceded by its length (including the null terminator). + */ +static void write_string(FILE *file, const char *str) +{ + int len = (int)strlen(str) + 1; + fwrite(&len, sizeof(int), 1, file); + fwrite(str, sizeof(char), len, file); +} + +/* Reads a string from a file that was written using write_string. + * Returns a pointer to the heap-allocated string, or NULL on failure. + */ +static char *read_string(FILE *file) +{ + int len; + char *str; + + if (fread(&len, sizeof(int), 1, file) != 1) + { + return NULL; + } + + str = malloc(len); + if (str == NULL) + { + return NULL; + } + + fread(str, sizeof(char), len, file); + return str; +} + +/* Trims leading and trailing whitespace from a string in place. + * Returns a pointer to the trimmed string. + */ +char *trim_whitespace(char *str) { char *end; + /* Trim leading whitespace */ while (isspace((unsigned char)*str)) { str++; } - if (*str == 0) + if (*str == '\0') { - return; + return str; } + /* Trim trailing whitespace */ end = str + strlen(str) - 1; - while (end > str && isspace((unsigned char)*end)) { end--; } + /* Write new null terminator */ end[1] = '\0'; + return str; } +/* Validates if the provided string is in valid IPv4 format. + * Returns 1 if valid, 0 otherwise. + */ int validate_ipv4_address(const char *ip) { - int segments; - int ch_count; - const char *ptr; - - segments = 0; - ch_count = 0; - ptr = ip; + int segments = 0; + int ch_count = 0; + const char *ptr = ip; while (*ptr) { @@ -47,7 +84,6 @@ int validate_ipv4_address(const char *ip) { return 0; } - segments++; ch_count = 0; } @@ -59,7 +95,6 @@ int validate_ipv4_address(const char *ip) { ch_count++; } - ptr++; } @@ -67,217 +102,389 @@ int validate_ipv4_address(const char *ip) { return 0; } - return 1; } +/* Creates a new Database instance. + * Returns a pointer to the new Database or NULL on failure. + */ Database *create_db(void) { - Database *db; - - db = calloc(1, sizeof(*db)); + Database *db = malloc(sizeof(Database)); if (db == NULL) { printf("Failed to allocate memory for DB.\n"); return NULL; } + db->tables = NULL; db->table_count = 0; return db; } -Table *find_table(Database *db, const char *table_name) +/* Frees all memory associated with the Database. + */ +void free_database(Database *db) { - int i; - - for (i = 0; i < db->table_count; i++) + if (db == NULL) { - if (strcmp(db->tables[i].name, table_name) == 0) - { - return &db->tables[i]; - } - } - - return NULL; -} - -void create_table(Database *db, const char *table_name, char *columns) -{ - Table *table; - char *token; - - if (db->table_count >= MAX_TABLES) - { - printf("Error: Maximum table limit reached.\n"); return; } - if (find_table(db, table_name)) + for (int i = 0; i < db->table_count; i++) + { + Table *currTable = db->tables[i]; + free(currTable->name); + + for (int j = 0; j < currTable->column_count; j++) + { + Column *currColumn = currTable->columns[j]; + free(currColumn->name); + + for (int r = 0; r < currTable->row_count; r++) + { + free(currColumn->data[r]); + } + free(currColumn->data); + free(currColumn); + } + free(currTable->columns); + free(currTable); + } + free(db->tables); + free(db); +} + +/* Searches for a table by name in the Database. + * Returns a pointer to the Table if found, or NULL otherwise. + */ +Table *find_table(Database *db, const char *table_name) +{ + for (int i = 0; i < db->table_count; i++) + { + if (strcmp(db->tables[i]->name, table_name) == 0) + { + return db->tables[i]; + } + } + return NULL; +} + +/* Creates a new table with the given name and comma-separated column definitions. + */ +void create_table(Database *db, const char *table_name, const char *columns_str) +{ + if (find_table(db, table_name) != NULL) { printf("Error: Table '%s' already exists.\n", table_name); return; } - table = &db->tables[db->table_count++]; - strcpy(table->name, table_name); - table->column_count = 0; - table->row_count = 0; - - token = strtok(columns, ","); - - while (token && table->column_count < MAX_COLUMNS) + Table *table = malloc(sizeof(Table)); + if (table == NULL) { - trim_whitespace(token); - strcpy(table->columns[table->column_count++].name, token); + printf("Error: Memory allocation failed for table '%s'.\n", table_name); + return; + } + table->name = strdup(table_name); + table->row_count = 0; + table->column_count = 0; + table->columns = NULL; + + char *cols_copy = strdup(columns_str); + if (cols_copy == NULL) + { + printf("Error: Memory allocation failed for columns copy.\n"); + free(table); + return; + } + + char *token = strtok(cols_copy, ","); + while (token != NULL) + { + token = trim_whitespace(token); + Column *col = malloc(sizeof(Column)); + if (col == NULL) + { + printf("Error: Memory allocation failed for column '%s'.\n", token); + free(cols_copy); + return; + } + col->name = strdup(token); + col->data = NULL; + + table->columns = realloc(table->columns, sizeof(Column*) * (table->column_count + 1)); + if (table->columns == NULL) + { + printf("Error: Memory allocation failed while adding column '%s'.\n", token); + free(col->name); + free(col); + free(cols_copy); + return; + } + table->columns[table->column_count++] = col; token = strtok(NULL, ","); } + free(cols_copy); if (table->column_count == 0) { printf("Error: No columns defined for table '%s'.\n", table_name); - db->table_count--; + free(table->name); + free(table); return; } - printf("Table '%s' with %d columns created successfully.\n", table_name, table->column_count); + db->tables = realloc(db->tables, sizeof(Table*) * (db->table_count + 1)); + if (db->tables == NULL) + { + printf("Error: Memory allocation failed while adding table '%s'.\n", table_name); + free_database(db); + exit(EXIT_FAILURE); + } + db->tables[db->table_count++] = table; + + printf("Table '%s' with %d columns created successfully.\n", table->name, table->column_count); } -void insert_into_table(Database *db, const char *table_name, char *values) +/* Inserts a new row into the specified table using comma-separated values. + */ +void insert_into_table(Database *db, const char *table_name, const char *values_str) { - Table *table; - char *token; - int col_index; - - table = find_table(db, table_name); - - if (!table) + Table *table = find_table(db, table_name); + if (table == NULL) { printf("Error: Table '%s' does not exist.\n", table_name); return; } - if (table->column_count == 0) + char *vals_copy = strdup(values_str); + if (vals_copy == NULL) { - printf("Error: Table '%s' has no columns defined.\n", table_name); + printf("Error: Memory allocation failed for values copy.\n"); return; } - if (table->row_count >= MAX_ROWS) + char *token = strtok(vals_copy, ","); + int col_index = 0; + char **values = malloc(sizeof(char*) * table->column_count); + if (values == NULL) { - printf("Error: Maximum row limit reached for table '%s'.\n", table_name); + printf("Error: Memory allocation failed for values array.\n"); + free(vals_copy); return; } - token = strtok(values, ","); - col_index = 0; - - while (token && col_index < table->column_count) + while (token != NULL && col_index < table->column_count) { - trim_whitespace(token); - - if (strcmp(table->columns[col_index].name, "IPv4") == 0) + token = trim_whitespace(token); + /* Validate IPv4 address if required */ + if (strcmp(table->columns[col_index]->name, "IPv4") == 0) { if (!validate_ipv4_address(token)) { printf("Error: Invalid IPv4 address '%s'.\n", token); + free(vals_copy); + for (int i = 0; i < col_index; i++) + { + free(values[i]); + } + free(values); return; } } - - strcpy(table->columns[col_index].data[table->row_count], token); + values[col_index++] = strdup(token); token = strtok(NULL, ","); - col_index++; } + free(vals_copy); if (col_index != table->column_count) { printf("Error: Column count mismatch for table '%s'.\n", table_name); + for (int i = 0; i < col_index; i++) + { + free(values[i]); + } + free(values); return; } + for (int i = 0; i < table->column_count; i++) + { + Column *col = table->columns[i]; + col->data = realloc(col->data, sizeof(char*) * (table->row_count + 1)); + if (col->data == NULL) + { + printf("Error: Memory allocation failed while inserting row.\n"); + free(values); + return; + } + col->data[table->row_count] = values[i]; + } + free(values); table->row_count++; printf("Row inserted into table '%s'.\n", table_name); } +/* Displays the contents of the specified table. + */ void select_from_table(Database *db, const char *table_name) { - Table *table; - int i; - int j; - - table = find_table(db, table_name); - - if (!table) + Table *table = find_table(db, table_name); + if (table == NULL) { printf("Error: Table '%s' does not exist.\n", table_name); return; } printf("Table: %s\n", table->name); - - for (i = 0; i < table->column_count; i++) + for (int i = 0; i < table->column_count; i++) { - printf("%s\t", table->columns[i].name); + printf("%s\t", table->columns[i]->name); } - printf("\n"); - for (i = 0; i < table->row_count; i++) + for (int r = 0; r < table->row_count; r++) { - for (j = 0; j < table->column_count; j++) + for (int c = 0; c < table->column_count; c++) { - printf("%s\t", table->columns[j].data[i]); + printf("%s\t", table->columns[c]->data[r]); } - printf("\n"); } } +/* Saves the database to a binary file. + */ void save_database_to_file(Database *db, const char *filename) { - FILE *file; - - file = fopen(filename, "wb"); - - if (!file) + FILE *file = fopen(filename, "wb"); + if (file == NULL) { printf("Error: Could not open file '%s' for writing.\n", filename); return; } - fwrite(db, sizeof(Database), 1, file); + fwrite(&db->table_count, sizeof(int), 1, file); + for (int i = 0; i < db->table_count; i++) + { + Table *table = db->tables[i]; + write_string(file, table->name); + fwrite(&table->column_count, sizeof(int), 1, file); + fwrite(&table->row_count, sizeof(int), 1, file); + for (int j = 0; j < table->column_count; j++) + { + Column *col = table->columns[j]; + write_string(file, col->name); + for (int r = 0; r < table->row_count; r++) + { + write_string(file, col->data[r]); + } + } + } fclose(file); printf("Database saved to '%s'.\n", filename); } -void load_database_from_file(Database *db, const char *filename) +/* Loads a database from a binary file. + * Frees the current database and returns a new one loaded from the file. + */ +Database *load_database_from_file(Database *db, const char *filename) { - FILE *file; - - file = fopen(filename, "rb"); - - if (!file) + FILE *file = fopen(filename, "rb"); + if (file == NULL) { printf("Error: Could not open file '%s' for reading.\n", filename); - return; + return db; } - fread(db, sizeof(Database), 1, file); + free_database(db); + Database *new_db = create_db(); + if (new_db == NULL) + { + fclose(file); + return NULL; + } + int table_count = 0; + fread(&table_count, sizeof(int), 1, file); + for (int i = 0; i < table_count; i++) + { + Table *table = malloc(sizeof(Table)); + if (table == NULL) + { + printf("Error: Memory allocation failed while loading table.\n"); + continue; + } + + table->name = read_string(file); + fread(&table->column_count, sizeof(int), 1, file); + fread(&table->row_count, sizeof(int), 1, file); + table->columns = NULL; + + for (int j = 0; j < table->column_count; j++) + { + Column *col = malloc(sizeof(Column)); + if (col == NULL) + { + printf("Error: Memory allocation failed while loading column.\n"); + continue; + } + col->name = read_string(file); + col->data = NULL; + + for (int r = 0; r < table->row_count; r++) + { + char *cell = read_string(file); + col->data = realloc(col->data, sizeof(char*) * (r + 1)); + if (col->data == NULL) + { + printf("Error: Memory allocation failed while loading row data.\n"); + free(cell); + continue; + } + col->data[r] = cell; + } + table->columns = realloc(table->columns, sizeof(Column*) * (j + 1)); + if (table->columns == NULL) + { + printf("Error: Memory allocation failed while loading columns array.\n"); + free(col); + continue; + } + table->columns[j] = col; + } + new_db->tables = realloc(new_db->tables, sizeof(Table*) * (i + 1)); + if (new_db->tables == NULL) + { + printf("Error: Memory allocation failed while adding table to database.\n"); + free(table); + continue; + } + new_db->tables[i] = table; + new_db->table_count++; + } fclose(file); printf("Database loaded from '%s'.\n", filename); + return new_db; } -void parse_query(Database *db, const char *query) +/* Parses and executes a query string. + * Supported commands: CREATE TABLE, INSERT INTO, SELECT, SAVE, LOAD. + */ +Database *parse_query(Database *db, const char *query) { char query_copy[MAX_QUERY_LENGTH]; - char *command; - char *table_name; - char *columns; + strncpy(query_copy, query, MAX_QUERY_LENGTH - 1); + query_copy[MAX_QUERY_LENGTH - 1] = '\0'; - strcpy(query_copy, query); - command = strtok(query_copy, " "); + char *command = strtok(query_copy, " "); + if (command == NULL) + { + printf("Error: Empty query.\n"); + return db; + } if (strcmp(command, "CREATE") == 0) { @@ -285,40 +492,37 @@ void parse_query(Database *db, const char *query) if (next_token == NULL || strcmp(next_token, "TABLE") != 0) { printf("Error: Invalid CREATE TABLE syntax.\n"); - return; + return db; } - table_name = strtok(NULL, " "); + char *table_name = strtok(NULL, " "); if (table_name == NULL) { printf("Error: Table name is missing.\n"); - return; + return db; } - columns = strchr(query, '('); + char *columns = strchr(query, '('); if (columns == NULL) { printf("Error: Missing column definitions.\n"); - return; + return db; } - columns++; char *closing_paren = strchr(columns, ')'); if (closing_paren == NULL) { printf("Error: Missing closing parenthesis in column definitions.\n"); - return; + return db; } - *closing_paren = '\0'; - trim_whitespace(columns); + columns = trim_whitespace(columns); if (strlen(columns) == 0) { printf("Error: No columns defined for table '%s'.\n", table_name); - return; + return db; } - create_table(db, table_name, columns); } else if (strcmp(command, "INSERT") == 0) @@ -327,53 +531,50 @@ void parse_query(Database *db, const char *query) if (next_token == NULL || strcmp(next_token, "INTO") != 0) { printf("Error: Invalid INSERT INTO syntax.\n"); - return; + return db; } - table_name = strtok(NULL, " "); + char *table_name = strtok(NULL, " "); if (table_name == NULL) { printf("Error: Table name is missing.\n"); - return; + return db; } - columns = strchr(query, '('); - if (columns == NULL) + char *values = strchr(query, '('); + if (values == NULL) { printf("Error: Missing values.\n"); - return; + return db; } - - columns++; - char *closing_paren = strchr(columns, ')'); + values++; + char *closing_paren = strchr(values, ')'); if (closing_paren == NULL) { printf("Error: Missing closing parenthesis in values.\n"); - return; + return db; } - *closing_paren = '\0'; - trim_whitespace(columns); - if (strlen(columns) == 0) + values = trim_whitespace(values); + if (strlen(values) == 0) { printf("Error: No values provided for table '%s'.\n", table_name); - return; + return db; } - - insert_into_table(db, table_name, columns); + insert_into_table(db, table_name, values); } else if (strcmp(command, "SELECT") == 0) { - strtok(NULL, " "); - strtok(NULL, " "); - table_name = strtok(NULL, " "); + /* Expected syntax: SELECT * FROM table_name */ + strtok(NULL, " "); // Skip '*' + strtok(NULL, " "); // Skip 'FROM' + char *table_name = strtok(NULL, " "); if (table_name == NULL) { printf("Error: Table name is missing in SELECT query.\n"); - return; + return db; } - select_from_table(db, table_name); } else if (strcmp(command, "SAVE") == 0) @@ -382,10 +583,12 @@ void parse_query(Database *db, const char *query) } else if (strcmp(command, "LOAD") == 0) { - load_database_from_file(db, DB_FILE); + db = load_database_from_file(db, DB_FILE); } else { printf("Error: Unsupported query.\n"); } -} \ No newline at end of file + + return db; +} diff --git a/src/main.c b/src/main.c index 6daa234..b038510 100644 --- a/src/main.c +++ b/src/main.c @@ -1,15 +1,14 @@ #include #include #include - #include "linenoise.h" #include "db.h" -int main() +int main(void) { char *query; Database *db; - + db = create_db(); printf("Simple SQL-like Database\n"); @@ -34,12 +33,14 @@ int main() if (strlen(query) > 0) { - parse_query(db, query); + db = parse_query(db, query); linenoiseHistoryAdd(query); } free(query); } + free_database(db); + return 0; -} \ No newline at end of file +}