DB open(const DBEnv &env, const DBTxn &txn, const char *fname, const char *dbname, DBTYPE dbtype, uint32_t flags, int mode) const { ::DB *db; int r = db_create(&db, env.env(), 0); handle_ft_retval(r); if (_readpagesize) { r = db->set_readpagesize(db, _readpagesize); handle_ft_retval(r); } if (_compression_method >= 0) { r = db->set_compression_method(db, TOKU_COMPRESSION_METHOD(_compression_method)); handle_ft_retval(r); } if (_fanout) { r = db->set_fanout(db, _fanout); handle_ft_retval(r); } if (_memcmp_magic) { r = db->set_memcmp_magic(db, _memcmp_magic); handle_ft_retval(r); } if (_pagesize) { r = db->set_pagesize(db, _pagesize); handle_ft_retval(r); } const DBTxn *txnp = &txn; DBTxn writeTxn; if (txn.is_read_only()) { writeTxn = DBTxn(env, DB_SERIALIZABLE); txnp = &writeTxn; } r = db->open(db, txnp->txn(), fname, dbname, dbtype, flags, mode); handle_ft_retval(r); if (!_descriptor.empty()) { DBT desc = _descriptor.dbt(); r = db->change_descriptor(db, txnp->txn(), &desc, DB_UPDATE_CMP_DESCRIPTOR); handle_ft_retval(r); } if (txn.is_read_only()) { writeTxn.commit(); } return DB(db, true); }
DBC::DBC(const DBEnv &env, const DBTxn &txn) : _txn(), _dbc(nullptr) { if (env.env() != nullptr) { DB_TXN *txnp = txn.txn(); if (txnp == nullptr) { _txn = DBTxn(env, DB_TXN_READ_ONLY | DB_READ_UNCOMMITTED); txnp = _txn.txn(); } ::DBC *c; int r = env.env()->get_cursor_for_directory(env.env(), txnp, &c); handle_ft_retval(r); _dbc = c; } }
DBC::DBC(const DB &db, const DBTxn &txn, int flags) : _txn(), _dbc(nullptr) { if (db.db() != nullptr) { DB_TXN *txnp = txn.txn(); if (txnp == nullptr) { _txn = DBTxn(DBEnv(db.db()->dbenv), DB_TXN_READ_ONLY | DB_READ_UNCOMMITTED); txnp = _txn.txn(); } ::DBC *c; int r = db.db()->cursor(db.db(), txnp, &c, flags); handle_ft_retval(r); _dbc = c; } }