summaryrefslogtreecommitdiff
path: root/src/db-test.c
blob: 1538702d7d40f903a73373f4048782c05d37911d (plain)
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
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Berkeley DB 1.85
#include <db.h>

#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 res = database->put(database, &key, &data, 0);
		if ( res == -1 ) {
			(void) fprintf(stderr, "failed to insert data!\n");
		}
	}
}

void
update(DB *database, const char *username, int new_age)
{
	DBT key = { .data = (void *) username, .size = strlen(username) };
	DBT old_data;

	int res = database->get(database, &key, &old_data, 0);
	if ( res != 0 ) {
		(void) fprintf(stderr, "update: 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
	};

	res = database->put(database, &key, &new_data, 0);

	if ( res != 0 ) {
		(void) fprintf(stderr, "update: Datensatz %s wurde nicht aktualisiert\n", username);
	}
}

void delete(DB *database, const char *username)
{
	DBT key = { .data = (void *) username, .size = strlen(username) };

	int res = database->del(database, &key, 0);
	if ( res != 0 ) {
		(void) fprintf(stderr, "update: 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 res = database->get(database, &key, &data, 0);
	if ( res == 0 ) {
		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 err = database->seq(database, &key, &data, R_FIRST);
	while ( !err ) {
		user_type *user = data.data;
		printf("%.*s -> %s (%d)\n", (int) key.size, (char *) key.data, user->fullname, user->age);

		err = database->seq(database, &key, &data, R_NEXT);
	}
}

int
main(void)
{
	DB *database = dbopen("./database.db", 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");

	delete(database, "user1");

	update(database, "datengott", 50);

	list(database);

	database->close(database);

	return EXIT_SUCCESS;
}