Description: Berkeley DB: An embedded database programmatic toolkit.
Keywords: embedded,database,programmatic,toolkit,b+tree,btr ee,hash,hashing,transaction,transactions,locking,logging,access method,access me thods,java,C,C++

### Berkeley DB Reference Guide: Simple Tutorial

# Closing a database

The only other operation that we need for our simple example is closing the database. Again, this interface is accessed through a function pointer that is an element of the database handle returned by db_open.

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 still in the cache. As the close function, by default, flushes the cache, closing the database will update the on-disk information.

The DB->close interface takes two arguments:

db
  The database handle returned by db_open.

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()
    {
    	extern int errno;
    	DB *dbp;
    	DBT key, data;

    	if ((errno = db_open(DATABASE,
    	    DB_BTREE, DB_CREATE, 0664, NULL, NULL, &dbp)) != 0) {
    		fprintf(stderr, "db: %s: %s\n", DATABASE, strerror(errno));
    		exit (1);
    	}

    	memset(&key, 0, sizeof(key));
    	memset(&data, 0, sizeof(data));
    	key.data = "fruit";
    	key.size = sizeof("fruit");
    	data.data = "apple";
    	data.size = sizeof("apple");

    	switch (errno = dbp->put(dbp, NULL, &key, &data, 0)) {
    	case 0:
    		printf("db: %s: key stored.\n", (char *)key.data);
    		break;
    	default:
    		fprintf(stderr, "db: put: %s\n", strerror(errno));
    		exit (1);
    	}

    	switch (errno = dbp->get(dbp, NULL, &key, &data, 0)) {
    	case 0:
    		printf("db: %s: key retrieved: data was %s.\n",
    		    (char *)key.data, (char *)data.data);
    		break;
    	case DB_NOTFOUND:
    		printf("db: %s: key not found.\n", (char *)key.data);
    		break;
    	default:
    		fprintf(stderr, "db: get: %s\n", strerror(errno));
    		exit (1);
    	}

    	switch (errno = dbp->del(dbp, NULL, &key, 0)) {
    	case 0:
    		printf("db: %s: key was deleted.\n", (char *)key.data);
    		break;
    	default:
    		fprintf(stderr, "db: del: %s\n", strerror(errno));
    		exit (1);
    	}

    	switch (errno = dbp->close(dbp, 0)) {
    	case 0:
    		printf("db: database closed.\n");
    		break;
    	default:
    		fprintf(stderr, "db: get: %s\n", strerror(errno));
    		exit (1);
    	}

    	exit(0);
    }