Berkeley DB Reference Guide: Simple Tutorial
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:
- The call might be successful and the key found, in which case the
error return will be 0.
- The call might be successful, but the key not found, in
which case the error return will be DB_NOTFOUND.
- Or, the call might not be successful, in which case a system error
will be returned.
|