|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <stdbool.h> |
|
#include <string.h> |
|
|
|
typedef struct data { |
|
int id; |
|
char * name; |
|
char * value; |
|
struct data * next; |
|
} Data; |
|
|
|
typedef struct database { |
|
struct data * data; |
|
} Database; |
|
|
|
Database * createDatabase() { |
|
Database * db = malloc(sizeof(Database)); |
|
db->data = NULL; |
|
return db; |
|
} |
|
|
|
bool file_exists(const char * filename) |
|
{ |
|
FILE *fp = fopen(filename, "r"); |
|
bool is_exist = false; |
|
if (fp != NULL) |
|
{ |
|
is_exist = true; |
|
fclose(fp); // close the file |
|
} |
|
return is_exist; |
|
} |
|
|
|
void _printDatabase(Database * db, FILE * stream) { |
|
Data * data = db->data; |
|
int first = true; |
|
fprintf(stream, "{"); |
|
while (data != NULL) { |
|
if (first) { |
|
fprintf(stream, "(%d,%s,%s)", data->id, data->name, data->value); |
|
first = false; |
|
} else { |
|
fprintf(stream, ",(%d,%s,%s)", data->id, data->name, data->value); |
|
} |
|
data = data->next; |
|
} |
|
fprintf(stream, "}"); |
|
} |
|
|
|
void saveDatabase(Database * db, char * filename) { |
|
// If file does not exist, create it |
|
if (!file_exists(filename)) { |
|
fopen(filename, "w"); |
|
return; |
|
} |
|
FILE * file = fopen(filename, "w"); |
|
if (file == NULL) { |
|
printf("Error: cannot open file %s\n", filename); |
|
exit(EXIT_FAILURE); |
|
} |
|
_printDatabase(db, file); |
|
fclose(file); |
|
} |
|
|
|
void addData(Database * db, Data * data) { |
|
data->next = db->data; |
|
db->data = data; |
|
} |
|
|
|
void printDatabase(Database * db) { |
|
FILE * stream = stdout; |
|
_printDatabase(db, stream); |
|
} |
|
|
|
Data * findData(Database * db, int id) { |
|
Data * data = db->data; |
|
while (data != NULL) { |
|
if (data->id == id) { |
|
return data; |
|
} |
|
data = data->next; |
|
} |
|
return NULL; |
|
} |
|
|
|
void deleteData(Database * db, int id) { |
|
Data * data = db->data; |
|
Data * prev = NULL; |
|
while (data != NULL) { |
|
if (data->id == id) { |
|
if (prev == NULL) { |
|
db->data = data->next; |
|
} else { |
|
prev->next = data->next; |
|
} |
|
free(data); |
|
return; |
|
} |
|
prev = data; |
|
data = data->next; |
|
} |
|
} |
|
|
|
Data * updateData(Database * db, int id, char * name, char * value) { |
|
Data * data = findData(db, id); |
|
if (data != NULL) { |
|
data->name = realloc(data->name, strlen(name) + 1); |
|
strcpy(data->name, name); |
|
data->value = realloc(data->value, strlen(value) + 1); |
|
strcpy(data->value, value); |
|
} |
|
return data; |
|
} |
|
|
|
Data * createData(int id, char * name, char * value) { |
|
Data * data = malloc(sizeof(Data)); |
|
data->id = id; |
|
data->name = malloc(strlen(name) + 1); |
|
strcpy(data->name, name); |
|
data->value = malloc(strlen(value) + 1); |
|
strcpy(data->value, value); |
|
data->next = NULL; |
|
return data; |
|
} |
|
|
|
void loadDatabase(Database * db, char * filename) { |
|
// If file does not exist, create it |
|
if (!file_exists(filename)) { |
|
fopen(filename, "w"); |
|
return; |
|
} |
|
FILE * file = fopen(filename, "r"); |
|
if (file == NULL) { |
|
printf("Error: cannot open file %s\n", filename); |
|
exit(EXIT_FAILURE); |
|
} |
|
char c; |
|
int id; |
|
char name[100]; |
|
char value[100]; |
|
while (fscanf(file, "%c", &c) != EOF) { |
|
if (c == '(') { |
|
fscanf(file, "%d,%[^,],%[^)]", &id, name, value); |
|
addData(db, createData(id, name, value)); |
|
} |
|
} |
|
fclose(file); |
|
} |