Just like cursors on a primary database, you can use cursors on secondary databases to iterate over the records in a secondary database. Like cursors used with primary databases, you can also use cursors with secondary databases to search for specific records in a database, to seek to the first or last record in the database, to get the next duplicate record, and so forth. For a complete description on cursors and their capabilities, see Using Cursors.
However, when you use cursors with secondary databases:
Any data returned is the data contained on the primary database record referenced by the secondary record.
You cannot use DB_GET_BOTH and related flags with DB->c_get() and a secondary database. Instead, you must use DB->c_pget(). Also, in that case the primary and secondary key given on the call to DB->c_pget() must match the secondary key and associated primary record key in order for that primary record to be returned as a result of the call.
For example, suppose you are using the databases, classes, and key extractors described in Implementing Key Extractors . Then the following searches for a person's name in the secondary database, and deletes all secondary and primary records that use that name.
#include <db.h>
#include <string.h>
...
DB *sdbp; /* Secondary DB handle */
DBC *cursorp; /* Cursor */
DBT key, data; /* DBTs used for the delete */
char *search_name = "John Doe"; /* Name to delete */
/* Primary and secondary database opens omitted for brevity. */
/* Get a cursor on the secondary database */
sdbp->cursor(sdbp, NULL, &cursorp, 0);
/*
* Zero out the DBT before using it.
*/
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
key.data = search_name;
key.size = strlen(search_name) + 1;
/* Position the cursor */
while (cursorp->c_get(cursorp, &key, &data, DB_SET) == 0)
cursorp->c_del(cursorp, 0);