-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdb.c
More file actions
128 lines (97 loc) · 2.54 KB
/
db.c
File metadata and controls
128 lines (97 loc) · 2.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "db.h"
#include "student.h"
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>
#include <string.h>
void db_add(database_t *db, student_t s){
int i;
char buffer[64];
if (db->lsize == db->psize/sizeof(student_t)) {
db->psize *= 2;
student_t *old = db->data;
db->data = (student_t *) malloc(db->psize);
for (i = 0; i < db->lsize; ++i) {
db->data[i] = old[i];
}
db->data[db->lsize] = s;
free(old);
}
else{
db->data[db->lsize] = s;
}
db->lsize += 1;
student_to_str((char *)buffer, &s);
//printf("added %s\n", buffer);
}
void db_delete(database_t *db, student_t *s){
int i = 0;
if (db->lsize == db->psize/(sizeof(student_t)*4)){
db->psize /= 2;
student_t *old = db->data;
db->data = (student_t *) malloc(db->psize);
while (!student_equals(&old[i] ,s) && i < db->lsize){
db->data[i] = old[i];
i++;
}
db->lsize -= 1;
while (i < db->lsize){
db->data[i] = old[i+1];
i++;
}
free(old);
}
else{
while (!student_equals(&db->data[i], s) && i < db->lsize){
i++;
}
db->lsize -= 1;
while (i < db->lsize){
db->data[i] = db->data[i+1];
i++;
}
}
}
void db_save(database_t *db, const char *path){
FILE *fo = fopen(path, "w");
printf("saving database\n");
fwrite(db->data, sizeof(student_t), db->lsize, fo);
printf("database saved!\n");
fclose(fo);
}
void db_load(database_t *db, const char *path){
FILE *fo = fopen(path, "rb");
student_t *s = malloc(sizeof(student_t));
printf("Loading Database\n");
//verify if file contains no student
if (fread(s, sizeof(student_t), 1, fo) == EOF){
return;
}
//put first student in db
db->data = malloc(sizeof(student_t));
db->data[0] = *s;
db->lsize = 1;
db->psize = sizeof(student_t);
while(fread(s, sizeof(student_t), 1, fo) == 1){
db_add(db, *s);
}
printf("Database Loaded\n");
fclose(fo);
}
void db_init(database_t *db){
db->lsize = 0;
db->psize = sizeof(student_t)*10;
db->data = malloc(sizeof(student_t)*10);
}
void db_update(database_t *db, student_t *old, student_t *updated){
int i;
while (!student_equals(&db->data[i], old) && i < db->lsize){
i++;
}
db->data[i] = *updated;
}
void db_empty(database_t *db){
free(db->data);
db_init(db);
}