In general, you will not modify a secondary database directly. In order to modify a secondary database, you should modify the primary database and simply allow DB to manage the secondary modifications for you.
However, as a convenience, you can delete a secondary database record directly. Doing so causes the associated primary key/data pair to be deleted. This in turn causes DB to delete all secondary database records that reference the primary record.
You can use the Db::del() method to delete a secondary database record. Note that if your secondary database contains duplicate records, then deleting a record from the set of duplicates causes all of the duplicates to be deleted as well.
You can delete a secondary database record using the previously described mechanism only if:
the secondary key extractor function returns 0 (see Implementing Key Extractors for information on this callback).
the primary database is opened for write access.
If either of these conditions are not met, then no delete operations can be performed on the secondary database.
For example:
#include <db_cxx.h> #include <string.h> ... Db my_database(NULL, 0); // Primary Db my_index(NULL, 0); // Secondary // Open the primary my_database.open(NULL, // Transaction pointer "my_db.db", // On-disk file that holds the database. NULL, // Optional logical database name DB_BTREE, // Database access method DB_CREATE, // Open flags 0); // File mode (using defaults) // Setup the secondary to use sorted duplicates. // This is often desireable for secondary databases. my_index.set_flags(DB_DUPSORT); // Open the secondary my_index.open(NULL, // Transaction pointer "my_secondary.db", // On-disk file that holds the database. NULL, // Optional logical database name DB_BTREE, // Database access method DB_CREATE, // Open flags. 0); // File mode (using defaults) // Now associate the primary and the secondary my_database.associate(NULL, // Txn id &my_index, // Associated secondary database get_sales_rep, // Callback used for key extraction. 0); // Flags // Name to delete char *search_name = "John Doe"; // Get a search key Dbt key(search_name, strlen(search_name) + 1); // Now delete the secondary record. This causes the associated primary // record to be deleted. If any other secondary databases have secondary // records referring to the deleted primary record, then those secondary // records are also deleted. my_index.del(NULL, &key, 0);