|
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 the database is never closed, changes that you have 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.
The DB->close interface takes two arguments:
Here's what the code to call DB->close looks like:
#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, 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); }
Note that we do not necessarily overwrite the ret variable, as it may contain error return information from a previous Berkeley DB call.