summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schmucker <ts@its1.de>2026-07-11 19:26:49 +0200
committerThomas Schmucker <ts@its1.de>2026-07-11 19:26:49 +0200
commit48b649516e8077880690bc6873b48611e1a03513 (patch)
tree52113d1ffa63840ab4b120a6f3df5da933dd2008
parent3c9cc7d383df019dacbd80480730723fe4b20b44 (diff)
downloaduse-berkeley-db-185-48b649516e8077880690bc6873b48611e1a03513.tar.gz
use-berkeley-db-185-48b649516e8077880690bc6873b48611e1a03513.tar.bz2
use-berkeley-db-185-48b649516e8077880690bc6873b48611e1a03513.zip
CRUD Operationen
-rw-r--r--src/db-test.c148
1 files changed, 104 insertions, 44 deletions
diff --git a/src/db-test.c b/src/db-test.c
index 439ed79..1538702 100644
--- a/src/db-test.c
+++ b/src/db-test.c
@@ -1,9 +1,13 @@
1#include <fcntl.h>
2#include <limits.h>
1#include <stdio.h> 3#include <stdio.h>
2#include <stdlib.h> 4#include <stdlib.h>
3#include <limits.h> 5#include <string.h>
4 6
7// Berkeley DB 1.85
5#include <db.h> 8#include <db.h>
6#include <fcntl.h> 9
10#define MODE 0600
7 11
8#define USERNAME_LENGTH 20 12#define USERNAME_LENGTH 20
9#define FULLNAME_LENGTH 50 13#define FULLNAME_LENGTH 50
@@ -11,60 +15,116 @@
11typedef struct { 15typedef struct {
12 char username[USERNAME_LENGTH]; 16 char username[USERNAME_LENGTH];
13 char fullname[FULLNAME_LENGTH]; 17 char fullname[FULLNAME_LENGTH];
14 int age; 18 int age;
15} user_type; 19} user_type;
16 20
17int main(void) 21void
22insert(DB *database)
18{ 23{
19 DB *db = dbopen("./database.db", O_RDWR | O_CREAT, 0644, DB_BTREE, NULL); // NOLINT 24 user_type users[] = {
20 if ( db != NULL ) { 25 { "datengott", "Thomas Schmucker", 44 },
21 (void) fprintf(stderr, "Datenbank eröffnet...\n"); 26 { "user1", "Sabine Müller", 23 },
27 { "sql-user", "SQL Database User", -1 }
28 };
22 29
23#if INSERT 30 for ( int i = 0; i != 3; ++i ) {
24 user_type users[] = { 31 DBT data = { .data = &users[i], .size = sizeof(users[i]) };
25 { "datengott", "Thomas Schmucker", 44 }, 32 DBT key = { .data = users[i].username, .size = strlen(users[i].username) };
26 { "user1", "Sabine Müller", 23 },
27 { "sql-user", "SQL Database User", -1 }
28 };
29 33
30 for ( int i = 0; i != 3; ++i ) { 34 int res = database->put(database, &key, &data, 0);
31 DBT data = { .data = &users[i], .size = sizeof(users[i]) }; 35 if ( res == -1 ) {
32 DBT key = { .data = &users[i].username, .size = sizeof(users[i].username) }; 36 (void) fprintf(stderr, "failed to insert data!\n");
33
34 int res = db->put(db, &key, &data, 0);
35 if ( res == -1 ) {
36 fprintf(stderr, "failed to insert data!\n");
37 }
38 } 37 }
39#endif 38 }
39}
40 40
41#if LOOKUP 41void
42 { 42update(DB *database, const char *username, int new_age)
43 DBT key = { .data = &users[0].username, .size = sizeof(users[0].username) }; 43{
44 DBT data; 44 DBT key = { .data = (void *) username, .size = strlen(username) };
45 DBT old_data;
45 46
46 int res = db->get(db, &key, &data, 0); 47 int res = database->get(database, &key, &old_data, 0);
47 if ( res == 0 ) { 48 if ( res != 0 ) {
48 user_type *user = data.data; 49 (void) fprintf(stderr, "update: Datensatz %s nicht gefunden!\n", username);
49 printf("Fullname: %s, Age: %d\n", user->fullname, user->age); 50 return;
50 } 51 }
51 }
52#endif
53 52
54 { 53 // update
55 DBT key; 54 user_type user;
56 DBT data; 55 memcpy(&user, old_data.data, sizeof user);
56 user.age = new_age;
57 57
58 int err = db->seq(db, &key, &data, R_FIRST); 58 DBT new_data = {
59 while ( !err ) { 59 .data = &user,
60 user_type *user = data.data; 60 .size = sizeof user
61 printf("Fullname: %s, Age: %d\n", user->fullname, user->age); 61 };
62 62
63 err = db->seq(db, &key, &data, R_NEXT); 63 res = database->put(database, &key, &new_data, 0);
64 } 64
65 } 65 if ( res != 0 ) {
66 (void) fprintf(stderr, "update: Datensatz %s wurde nicht aktualisiert\n", username);
67 }
68}
66 69
67 db->close(db); 70void delete(DB *database, const char *username)
71{
72 DBT key = { .data = (void *) username, .size = strlen(username) };
73
74 int res = database->del(database, &key, 0);
75 if ( res != 0 ) {
76 (void) fprintf(stderr, "update: Datensatz %s wurde nicht gelöscht\n", username);
68 } 77 }
78}
79
80void
81lookup(DB *database, const char *username)
82{
83 DBT key = { .data = (void *) username, .size = strlen(username) };
84 DBT data;
85
86 int res = database->get(database, &key, &data, 0);
87 if ( res == 0 ) {
88 user_type *user = data.data;
89 printf("%.*s -> %s (%d)\n", (int) key.size, (char *) key.data, user->fullname, user->age);
90 }
91}
92
93void
94list(DB *database)
95{
96 DBT key;
97 DBT data;
98
99 int err = database->seq(database, &key, &data, R_FIRST);
100 while ( !err ) {
101 user_type *user = data.data;
102 printf("%.*s -> %s (%d)\n", (int) key.size, (char *) key.data, user->fullname, user->age);
103
104 err = database->seq(database, &key, &data, R_NEXT);
105 }
106}
107
108int
109main(void)
110{
111 DB *database = dbopen("./database.db", O_RDWR | O_CREAT, MODE, DB_BTREE, NULL);
112 if ( database == NULL ) {
113 (void) fprintf(stderr, "Datenbank konnte nicht geöffnet werden\n");
114 return EXIT_FAILURE;
115 }
116
117 insert(database);
118
119 lookup(database, "user1");
120
121 delete(database, "user1");
122
123 update(database, "datengott", 50);
124
125 list(database);
126
127 database->close(database);
128
69 return EXIT_SUCCESS; 129 return EXIT_SUCCESS;
70} 130}