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
129
130
131
132
|
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Berkeley DB 1.85
#include <db.h>
#define DATABASE_NAME "./database.db"
#define MODE 0600
#define USERNAME_LENGTH 20
#define FULLNAME_LENGTH 50
typedef struct {
char username[USERNAME_LENGTH];
char fullname[FULLNAME_LENGTH];
int age;
} user_type;
void
insert(DB *database)
{
user_type users[] = {
{ "datengott", "Thomas Schmucker", 44 },
{ "user1", "Sabine Müller", 23 },
{ "sql-user", "SQL Database User", -1 }
};
for ( int i = 0; i != 3; ++i ) {
DBT data = { .data = &users[i], .size = sizeof(users[i]) };
DBT key = { .data = users[i].username, .size = strlen(users[i].username) };
int error = database->put(database, &key, &data, 0);
if ( error ) {
(void) fprintf(stderr, "Datensatz konnte nicht eingefügt werden!\n");
}
}
}
void
update(DB *database, const char *username, int new_age)
{
DBT key = { .data = (void *) username, .size = strlen(username) };
DBT old_data;
int error = database->get(database, &key, &old_data, 0);
if ( error ) {
(void) fprintf(stderr, "Datensatz %s nicht gefunden!\n", username);
return;
}
// update
user_type user;
memcpy(&user, old_data.data, sizeof user);
user.age = new_age;
DBT new_data = {
.data = &user,
.size = sizeof user
};
error = database->put(database, &key, &new_data, 0);
if ( error ) {
(void) fprintf(stderr, "Datensatz %s wurde nicht aktualisiert\n", username);
}
}
void
erase(DB *database, const char *username)
{
DBT key = { .data = (void *) username, .size = strlen(username) };
int error = database->del(database, &key, 0);
if ( error ) {
(void) fprintf(stderr, "Datensatz %s wurde nicht gelöscht\n", username);
}
}
void
lookup(DB *database, const char *username)
{
DBT key = { .data = (void *) username, .size = strlen(username) };
DBT data;
int error = database->get(database, &key, &data, 0);
if ( !error ) {
user_type *user = data.data;
printf("%.*s -> %s (%d)\n", (int) key.size, (char *) key.data, user->fullname, user->age);
}
}
void
list(DB *database)
{
DBT key;
DBT data;
int error = database->seq(database, &key, &data, R_FIRST);
while ( !error ) {
user_type *user = data.data;
printf("%.*s -> %s (%d)\n", (int) key.size, (char *) key.data, user->fullname, user->age);
error = database->seq(database, &key, &data, R_NEXT);
}
}
int
main(void)
{
DB *database = dbopen(DATABASE_NAME, O_RDWR | O_CREAT, MODE, DB_BTREE, NULL);
if ( database == NULL ) {
(void) fprintf(stderr, "Datenbank konnte nicht geöffnet werden\n");
return EXIT_FAILURE;
}
insert(database);
lookup(database, "user1");
erase(database, "user1");
update(database, "datengott", 50);
list(database);
database->close(database);
return EXIT_SUCCESS;
}
|