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

# Retrieving elements from a database

The simplest way to retrieve elements from a database is the DB->get interface. This interface is accessed through a function pointer that is an element of the database handle returned by db_open.

The DB->get interface takes the same five arguments that the DB->put interface takes:

db
  The database handle returned by db_open.

txnid
  A transaction ID. In our simple case, we aren't expecting to recover the database after application or system crash, so we aren't using transactions, and will leave this argument unspecified.

key
  The key item for the key/data pair that we want to retrieve from the database.

data
  The data item for the key/data pair that we want to retrieve from the database.

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

Here's what the code to call DB->get 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);
    	}

Note that we do not have to clear the structures that we're passing to DB->get again, we can simply use the ones that were passed to the DB->put function.

We also have to add a new possible error condition, DB_NOTFOUND. This is because there are three possible returns from DB->get:

1. The call might be successful and the key found, in which case the error return will be 0.
2. The call might be successful, but the key not found, in which case the error return will be DB_NOTFOUND.
3. Or, the call might not be successful, in which case a system error will be returned.