The only other operation that we need for our simple example is closing
the database, and cleaning up the DB handle.
It is necessary that the database be closed. The most important reason
for this is that Berkeley DB runs on top of an underlying buffer cache. If
the modified database pages are never explicitly flushed to disk and
the database is never closed, changes made to the database may never
make it out to disk, because they are held in the Berkeley DB cache. As the
default behavior of the close function is to flush the Berkeley DB cache,
closing the database will update the on-disk information.
#include <sys/types.h>
#include <stdio.h>
#include <db.h>
#define DATABASE "access.db"
int
main()
{
DB *dbp;
DBT key, data;
int ret, t_ret;
if ((ret = db_create(&dbp, NULL, 0)) != 0) {
fprintf(stderr, "db_create: %s\n", db_strerror(ret));
exit (1);
}
if ((ret = dbp->open(dbp,
NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
dbp->err(dbp, ret, "%s", DATABASE);
goto err;
}
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.data = "fruit";
key.size = sizeof("fruit");
data.data = "apple";
data.size = sizeof("apple");
if ((ret = dbp->put(dbp, NULL, &key, &data, 0)) == 0)
printf("db: %s: key stored.\n", (char *)key.data);
else {
dbp->err(dbp, ret, "DB->put");
goto err;
}
if ((ret = dbp->get(dbp, NULL, &key, &data, 0)) == 0)
printf("db: %s: key retrieved: data was %s.\n",
(char *)key.data, (char *)data.data);
else {
dbp->err(dbp, ret, "DB->get");
goto err;
}
if ((ret = dbp->del(dbp, NULL, &key, 0)) == 0)
printf("db: %s: key was deleted.\n", (char *)key.data);
else {
dbp->err(dbp, ret, "DB->del");
goto err;
}
if ((ret = dbp->get(dbp, NULL, &key, &data, 0)) == 0)
printf("db: %s: key retrieved: data was %s.\n",
(char *)key.data, (char *)data.data);
else
dbp->err(dbp, ret, "DB->get");
err: if ((t_ret = dbp->close(dbp, 0)) != 0 && ret == 0)
ret = t_ret;
exit(ret);
}