/* Initialize the database. */ void BulkExample::initDb(int dups, int sflag, int pagesize) { DbTxn *txnp; int ret; txnp = NULL; ret = 0; dbp = new Db(dbenv, 0); dbp->set_error_stream(&cerr); dbp->set_errpfx(progname); try{ if ((ret = dbp->set_bt_compare(compare_int)) != 0) throwException(dbenv, NULL, ret, "DB->set_bt_compare"); if ((ret = dbp->set_pagesize(pagesize)) != 0) throwException(dbenv, NULL, ret, "DB->set_pagesize"); if (dups && (ret = dbp->set_flags(DB_DUP)) != 0) throwException(dbenv, NULL, ret, "DB->set_flags"); if ((ret = dbenv->txn_begin(NULL, &txnp, 0)) != 0) throwException(dbenv, NULL, ret, "DB_ENV->txn_begin"); if ((ret = dbp->open(txnp, DATABASE, "primary", DB_BTREE, DB_CREATE, 0664)) != 0) throwException(dbenv, txnp, ret, "DB->open"); if (sflag) { sdbp = new Db(dbenv, 0); if ((ret = sdbp->set_flags(DB_DUPSORT)) != 0) throwException(dbenv, txnp, ret, "DB->set_flags"); if ((ret = sdbp->open(txnp, DATABASE, "secondary", DB_BTREE, DB_CREATE, 0664)) != 0) throwException(dbenv, txnp, ret, "DB->open"); if ((ret = dbp->associate( txnp, sdbp, get_first_str, 0)) != 0) throwException(dbenv, txnp, ret, "DB->associate"); } ret = txnp->commit(0); txnp = NULL; if (ret != 0) throwException(dbenv, NULL, ret, "DB_TXN->commit"); } catch(DbException &dbe) { cerr << "initDb " << dbe.what() << endl; if (txnp != NULL) (void)txnp->abort(); throw dbe; } }
void StlAdvancedFeaturesExample::secondary_containers() { int i; if (explicit_txn) begin_txn(0, penv); // test secondary db cout<<"\ndb container backed by secondary database."; dbp3->associate(dbstl::current_txn(penv), dbp3sec, get_dest_secdb_callback, DB_CREATE); typedef db_multimap<int, BaseMsg> sec_mmap_t; sec_mmap_t secmmap(dbp3sec, penv);// index "to" field db_map<int, BaseMsg> basemsgs(dbp3, penv); basemsgs.clear(); BaseMsg tmpmsg; multiset<BaseMsg> bsmsgs, bsmsgs2; multiset<BaseMsg>::iterator bsitr1, bsitr2; // populate primary and sec db for (i = 0; i < 10; i++) { tmpmsg.when = time(NULL); tmpmsg.to = 100 - i % 3;// sec index multiple tmpmsg.from = i + 20; bsmsgs.insert( tmpmsg); basemsgs.insert(make_pair(i, tmpmsg)); } check_expr(basemsgs.size() == 10); // check retrieved data is identical to those fed in sec_mmap_t::iterator itrsec; for (itrsec = secmmap.begin( ReadModifyWriteOption::no_read_modify_write(), true); itrsec != secmmap.end(); itrsec++) { bsmsgs2.insert(itrsec->second); } for (bsitr1 = bsmsgs.begin(), bsitr2 = bsmsgs2.begin(); bsitr1 != bsmsgs.end() && bsitr2 != bsmsgs2.end(); bsitr1++, bsitr2++) { check_expr(*bsitr1 == *bsitr2); } check_expr(bsitr1 == bsmsgs.end() && bsitr2 == bsmsgs2.end()); // search using sec index, check the retrieved data is expected // and exists in bsmsgs check_expr(secmmap.size() == 10); pair<sec_mmap_t::iterator, sec_mmap_t::iterator> secrg = secmmap.equal_range(98); for (itrsec = secrg.first; itrsec != secrg.second; itrsec++) { check_expr(itrsec->second.to == 98 && bsmsgs.count(itrsec->second) > 0); } // delete via sec db size_t nersd = secmmap.erase(98); check_expr(10 - nersd == basemsgs.size()); secrg = secmmap.equal_range(98); check_expr(secrg.first == secrg.second); if (explicit_txn) dbstl::commit_txn(penv); } // secondary_containers