###

Berkeley DB Reference Guide:
  Simple Tutorial

# Closing a database

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.

The DB->close interface takes two arguments:

db
  The database handle returned by db_create.

flags
  Optional flags modifying the underlying behavior of the DB->close interface.

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.

Copyright Sleepycat Software