|
The simplest way to retrieve elements from a database is the DB->get interface.
The DB->get interface takes the same five arguments that the DB->put interface takes:
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() { DB *dbp; DBT key, data; int 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; }
Normally, it is not necessary to clear the DBT structures passed to the Berkeley DB functions between calls. This is not necessarily true, when some of the less commonly used flags for those structures are specified, and the DBT manual page should be consulted for details in those cases.
It is possible, of course, to distinguish between system errors and the key/data pair simply not existing in the database. There are three possible returns from DB->get: