#include #include #include #include #include // Berkeley DB 1.85 #include #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; }