Skip to content

Instantly share code, notes, and snippets.

@MateusBMP
Created September 11, 2023 20:05
Show Gist options
  • Select an option

  • Save MateusBMP/5da3575d35bf2c15e6438bf866d6bcb0 to your computer and use it in GitHub Desktop.

Select an option

Save MateusBMP/5da3575d35bf2c15e6438bf866d6bcb0 to your computer and use it in GitHub Desktop.
Simulação simples de base de dados

Simulação simples de base de dados

Implementação de uma base de dados simples, com o objetivo de simular o funcionamento de uma base de dados real. Para utilizar, compile o projeto com gcc -std=c99 *.c -o main e execute com ./main. Para fazer um teste e entender seu funcionamento, execute ./main database.cdb --example, que criará o arquivo database.cdb e o preencherá com alguns dados de exemplo.

O contrato base está no arquivo database.h, enquanto a implementação encontra-se no arquivo database.c. O arquivo main.c contém um exemplo de uso da base de dados, apenas, e pode ser alterado para implementar o que for necessário.

#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);
}
typedef struct data {
int id;
char * name;
char * value;
struct data * next;
} Data;
typedef struct database {
struct data * data;
} Database;
Database * createDatabase();
void saveDatabase(Database * db, char * filename);
void loadDatabase(Database * db, char * filename);
void printDatabase(Database * db);
void addData(Database * db, Data * data);
Data * findData(Database * db, int id);
Data * createData(int id, char * name, char * value);
Data * updateData(Database * db, int id, char * name, char * value);
void deleteData(Database * db, int id);
#include <stdio.h>
#include <string.h>
#include "database.h"
int main(int argc, char ** argv) {
if (argc < 2) {
printf("Usage: %s <filename> [--example]\n", argv[0]);
printf("Arguments:\n");
printf(" --example: create example database\n");
printf("Example:\n");
printf(" %s database.cdb --example\n", argv[0]);
return 1;
}
char * filename = argv[1];
Database * db = createDatabase();
loadDatabase(db, filename);
if (argc >= 3 && strcmp(argv[2], "--example") == 0) {
addData(db, createData(1, "name1", "value1"));
addData(db, createData(2, "name2", "value2"));
addData(db, createData(3, "name3", "value3"));
printDatabase(db); printf("\n");
deleteData(db, 2);
printDatabase(db); printf("\n");
updateData(db, 3, "name4", "value4");
printDatabase(db); printf("\n");
saveDatabase(db, filename);
return 0;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment