From 48b649516e8077880690bc6873b48611e1a03513 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sat, 11 Jul 2026 19:26:49 +0200 Subject: CRUD Operationen --- src/db-test.c | 156 ++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 108 insertions(+), 48 deletions(-) (limited to 'src') 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 @@ +#include +#include #include #include -#include +#include +// Berkeley DB 1.85 #include -#include + +#define MODE 0600 #define USERNAME_LENGTH 20 #define FULLNAME_LENGTH 50 @@ -11,60 +15,116 @@ typedef struct { char username[USERNAME_LENGTH]; char fullname[FULLNAME_LENGTH]; - int age; + int age; } user_type; -int main(void) +void +insert(DB *database) { - DB *db = dbopen("./database.db", O_RDWR | O_CREAT, 0644, DB_BTREE, NULL); // NOLINT - if ( db != NULL ) { - (void) fprintf(stderr, "Datenbank eröffnet...\n"); - -#if INSERT - 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 = sizeof(users[i].username) }; - - int res = db->put(db, &key, &data, 0); - if ( res == -1 ) { - fprintf(stderr, "failed to insert data!\n"); - } - } -#endif - -#if LOOKUP - { - DBT key = { .data = &users[0].username, .size = sizeof(users[0].username) }; - DBT data; - - int res = db->get(db, &key, &data, 0); - if ( res == 0 ) { - user_type *user = data.data; - printf("Fullname: %s, Age: %d\n", user->fullname, user->age); - } + 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"); } -#endif + } +} - { - DBT key; - DBT data; +void +update(DB *database, const char *username, int new_age) +{ + DBT key = { .data = (void *) username, .size = strlen(username) }; + DBT old_data; - int err = db->seq(db, &key, &data, R_FIRST); - while ( !err ) { - user_type *user = data.data; - printf("Fullname: %s, Age: %d\n", user->fullname, user->age); + int res = database->get(database, &key, &old_data, 0); + if ( res != 0 ) { + (void) fprintf(stderr, "update: Datensatz %s nicht gefunden!\n", username); + return; + } - err = db->seq(db, &key, &data, R_NEXT); - } - } + // 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; - db->close(db); + 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; } -- cgit v1.3