本文整理汇总了C++中DbTxn类的典型用法代码示例。如果您正苦于以下问题:C++ DbTxn类的具体用法?C++ DbTxn怎么用?C++ DbTxn使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了DbTxn类的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: k_histdbt
//
// XXX Figure out the appropriate way to pick out IDs.
//
int
TpcbExample::txn(Db *adb, Db *bdb, Db *tdb, Db *hdb,
int accounts, int branches, int tellers)
{
Dbc *acurs = NULL;
Dbc *bcurs = NULL;
Dbc *tcurs = NULL;
DbTxn *t = NULL;
db_recno_t key;
Defrec rec;
Histrec hrec;
int account, branch, teller;
Dbt d_dbt;
Dbt d_histdbt;
Dbt k_dbt;
Dbt k_histdbt(&key, sizeof(key));
//
// XXX We could move a lot of this into the driver to make this
// faster.
//
account = random_id(ACCOUNT, accounts, branches, tellers);
branch = random_id(BRANCH, accounts, branches, tellers);
teller = random_id(TELLER, accounts, branches, tellers);
k_dbt.set_size(sizeof(int));
d_dbt.set_flags(DB_DBT_USERMEM);
d_dbt.set_data(&rec);
d_dbt.set_ulen(sizeof(rec));
hrec.aid = account;
hrec.bid = branch;
hrec.tid = teller;
hrec.amount = 10;
// Request 0 bytes since we're just positioning.
d_histdbt.set_flags(DB_DBT_PARTIAL);
// START TIMING
if (txn_begin(NULL, &t, 0) != 0)
goto err;
if (adb->cursor(t, &acurs, 0) != 0 ||
bdb->cursor(t, &bcurs, 0) != 0 ||
tdb->cursor(t, &tcurs, 0) != 0)
goto err;
// Account record
k_dbt.set_data(&account);
if (acurs->get(&k_dbt, &d_dbt, DB_SET) != 0)
goto err;
rec.balance += 10;
if (acurs->put(&k_dbt, &d_dbt, DB_CURRENT) != 0)
goto err;
// Branch record
k_dbt.set_data(&branch);
if (bcurs->get(&k_dbt, &d_dbt, DB_SET) != 0)
goto err;
rec.balance += 10;
if (bcurs->put(&k_dbt, &d_dbt, DB_CURRENT) != 0)
goto err;
// Teller record
k_dbt.set_data(&teller);
if (tcurs->get(&k_dbt, &d_dbt, DB_SET) != 0)
goto err;
rec.balance += 10;
if (tcurs->put(&k_dbt, &d_dbt, DB_CURRENT) != 0)
goto err;
// History record
d_histdbt.set_flags(0);
d_histdbt.set_data(&hrec);
d_histdbt.set_ulen(sizeof(hrec));
if (hdb->put(t, &k_histdbt, &d_histdbt, DB_APPEND) != 0)
goto err;
if (acurs->close() != 0 || bcurs->close() != 0 ||
tcurs->close() != 0)
goto err;
if (t->commit(0) != 0)
goto err;
// END TIMING
return (0);
err:
if (acurs != NULL)
(void)acurs->close();
if (bcurs != NULL)
(void)bcurs->close();
if (tcurs != NULL)
(void)tcurs->close();
//.........这里部分代码省略.........
示例2: run
//.........这里部分代码省略.........
if(!outputFile.empty())
{
IceUtilInternal::ofstream of(outputFile);
if(!of.good())
{
cerr << appName << ": unable to open file `" << outputFile << "'" << endl;
return EXIT_FAILURE;
}
of << descriptors << endl;
of.close();
return EXIT_SUCCESS;
}
}
else
{
IceUtilInternal::ifstream in(inputFile);
char buff[1024];
while(true)
{
in.read(buff, 1024);
descriptors.append(buff, static_cast<size_t>(in.gcount()));
if(in.gcount() < 1024)
{
break;
}
}
in.close();
}
FreezeScript::ObjectFactoryPtr objectFactory = new FreezeScript::ObjectFactory;
communicator->addObjectFactory(objectFactory, "");
DbEnv dbEnv(0);
DbTxn* txn = 0;
Freeze::ConnectionPtr connection;
int status = EXIT_SUCCESS;
try
{
#ifdef _WIN32
//
// Berkeley DB may use a different C++ runtime.
//
dbEnv.set_alloc(::malloc, ::realloc, ::free);
#endif
//
// Open the database environment and start a transaction.
//
{
u_int32_t flags = DB_THREAD | DB_CREATE | DB_INIT_TXN | DB_INIT_MPOOL;
dbEnv.open(dbEnvName.c_str(), flags, FREEZE_SCRIPT_DB_MODE);
}
//
// We're creating a connection just to make sure the database environment
// isn't locked.
//
connection = Freeze::createConnection(communicator, dbEnvName, dbEnv);
dbEnv.txn_begin(0, &txn, 0);
FreezeScript::ErrorReporterPtr errorReporter = new FreezeScript::ErrorReporter(cerr, false);
try
{
FreezeScript::DataFactoryPtr factory = new FreezeScript::DataFactory(communicator, unit, errorReporter);
FreezeScript::DescriptorHandler dh(factory, unit, errorReporter, objectFactory);
示例3: bool
bool BerkeleyBatch::Recover(const fs::path& file_path, void *callbackDataIn, bool (*recoverKVcallback)(void* callbackData, CDataStream ssKey, CDataStream ssValue), std::string& newFilename)
{
std::string filename;
BerkeleyEnvironment* env = GetWalletEnv(file_path, filename);
// Recovery procedure:
// move wallet file to walletfilename.timestamp.bak
// Call Salvage with fAggressive=true to
// get as much data as possible.
// Rewrite salvaged data to fresh wallet file
// Set -rescan so any missing transactions will be
// found.
int64_t now = GetTime();
newFilename = strprintf("%s.%d.bak", filename, now);
int result = env->dbenv->dbrename(nullptr, filename.c_str(), nullptr,
newFilename.c_str(), DB_AUTO_COMMIT);
if (result == 0)
LogPrintf("Renamed %s to %s\n", filename, newFilename);
else
{
LogPrintf("Failed to rename %s to %s\n", filename, newFilename);
return false;
}
std::vector<BerkeleyEnvironment::KeyValPair> salvagedData;
bool fSuccess = env->Salvage(newFilename, true, salvagedData);
if (salvagedData.empty())
{
LogPrintf("Salvage(aggressive) found no records in %s.\n", newFilename);
return false;
}
LogPrintf("Salvage(aggressive) found %u records\n", salvagedData.size());
std::unique_ptr<Db> pdbCopy = MakeUnique<Db>(env->dbenv.get(), 0);
int ret = pdbCopy->open(nullptr, // Txn pointer
filename.c_str(), // Filename
"main", // Logical db name
DB_BTREE, // Database type
DB_CREATE, // Flags
0);
if (ret > 0) {
LogPrintf("Cannot create database file %s\n", filename);
pdbCopy->close(0);
return false;
}
DbTxn* ptxn = env->TxnBegin();
for (BerkeleyEnvironment::KeyValPair& row : salvagedData)
{
if (recoverKVcallback)
{
CDataStream ssKey(row.first, SER_DISK, CLIENT_VERSION);
CDataStream ssValue(row.second, SER_DISK, CLIENT_VERSION);
if (!(*recoverKVcallback)(callbackDataIn, ssKey, ssValue))
continue;
}
Dbt datKey(&row.first[0], row.first.size());
Dbt datValue(&row.second[0], row.second.size());
int ret2 = pdbCopy->put(ptxn, &datKey, &datValue, DB_NOOVERWRITE);
if (ret2 > 0)
fSuccess = false;
}
ptxn->commit(0);
pdbCopy->close(0);
return fSuccess;
}
示例4: bulkUpdate
/* Bulk fill a database. */
void BulkExample::bulkUpdate(
int num, int dups, int *countp, int *iterp, int verbose)
{
Dbt key, data;
u_int32_t flag;
DbTxn *txnp;
int count, i, iter, ret;
DbMultipleDataBuilder *ptrd, *ptrk;
DbMultipleKeyDataBuilder *ptrkd;
txnp = NULL;
count = flag = iter = ret = 0;
ptrk = ptrd = NULL;
if (data_val == NULL)
data_val = (struct data *)malloc(DATALEN);
memset(data_val, 0, DATALEN);
memset(&key, 0, sizeof(Dbt));
memset(&data, 0, sizeof(Dbt));
/*
* The buffer must be at least as large as the page size of
* the underlying database and aligned for unsigned integer
* access. Its size must be a multiple of 1024 bytes.
*/
if (klen != (u_int32_t) UPDATES_PER_BULK_PUT *
(sizeof(u_int32_t) + DATALEN) * 1024) {
klen = (u_int32_t) UPDATES_PER_BULK_PUT *
(sizeof(u_int32_t) + DATALEN) * 1024;
kbuf = realloc(kbuf, klen);
}
memset(kbuf, 0, klen);
key.set_ulen(klen);
key.set_flags(DB_DBT_USERMEM | DB_DBT_BULK);
key.set_data(kbuf);
if (dlen != (u_int32_t) UPDATES_PER_BULK_PUT *
(sizeof(u_int32_t) + DATALEN) * 1024) {
dlen = (u_int32_t) UPDATES_PER_BULK_PUT *
(sizeof(u_int32_t) + DATALEN) * 1024;
dbuf = realloc(dbuf, dlen);
}
memset(dbuf, 0, dlen);
data.set_ulen(dlen);
data.set_flags(DB_DBT_USERMEM | DB_DBT_BULK);
data.set_data(dbuf);
/*
* Bulk insert with either DB_MULTIPLE in two buffers or
* DB_MULTIPLE_KEY in a single buffer. With DB_MULTIPLE, all keys are
* constructed in the key Dbt, and all data is constructed in the data
* Dbt. With DB_MULTIPLE_KEY, all key/data pairs are constructed in the
* key Dbt. We use DB_MULTIPLE mode when there are duplicate records.
*/
flag |= (dups) ? DB_MULTIPLE : DB_MULTIPLE_KEY;
if (dups) {
ptrk = new DbMultipleDataBuilder(key);
ptrd = new DbMultipleDataBuilder(data);
} else
ptrkd = new DbMultipleKeyDataBuilder(key);
try {
for (i = 0; i < num; i++) {
if (i % UPDATES_PER_BULK_PUT == 0) {
if (txnp != NULL) {
ret = txnp->commit(0);
txnp = NULL;
if (ret != 0)
throwException(dbenv, NULL,
ret, "DB_TXN->commit");
}
if ((ret = dbenv->txn_begin(NULL,
&txnp, 0)) != 0)
throwException(dbenv,
NULL, ret, "DB_ENV->txn_begin");
}
data_val->id = 0;
get_string(tstring, data_val->str, i);
do {
if (dups) {
if (ptrk->append(&i,
sizeof(i)) == false)
throwException(dbenv,
txnp, EXIT_FAILURE,
"DbMultipleDataBuilder->append");
if (ptrd->append(data_val,
DATALEN) == false)
throwException(dbenv,
txnp, EXIT_FAILURE,
"DbMultipleDataBuilder->append");
} else {
if (ptrkd->append(&i, sizeof(i),
data_val, DATALEN) == false)
throwException(dbenv,
txnp, EXIT_FAILURE,
"DbMultipleKeyDataBuilder->append");
}
if (verbose)
printf(
"Insert key: %d, \t data: (id %d, str %s)\n",
//.........这里部分代码省略.........
示例5: bulkRead
/* Loop get batches of records. */
void BulkExample::bulkRead(
int num, int dups, int iter, int *countp, int verbose)
{
Dbc *dbcp;
Dbt data, dp, key, kp;
DbTxn *txnp;
DbMultipleDataIterator *ptrd;
DbMultipleKeyDataIterator *ptrkd;
u_int32_t flags;
int count, i, j, ret;
count = klen = ret = 0;
dbcp = NULL;
txnp = NULL;
/* Initialize key Dbt and data Dbt, malloc bulk buffer. */
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.set_size(sizeof(j));
if (dlen != DATALEN * 16 * 1024) {
dlen = DATALEN * 16 * 1024;
dbuf = realloc(dbuf, dlen);
}
memset(dbuf, 0, dlen);
data.set_flags(DB_DBT_USERMEM);
data.set_data(dbuf);
data.set_ulen(dlen);
data.set_size(dlen);
flags = DB_SET;
flags |= (dups) ? DB_MULTIPLE: DB_MULTIPLE_KEY;
try {
for (i = 0; i < iter; i++) {
if ((ret =
dbenv->txn_begin(NULL, &txnp, 0)) != 0)
throwException(dbenv, NULL,
ret, "DB_ENV->txn_begin");
if ((ret = dbp->cursor(txnp, &dbcp, 0)) != 0)
throwException(dbenv, txnp,
ret, "DB->cursor");
/*
* Bulk retrieve by a random key which is a random
* non-negative integer smaller than "num".
* If there are duplicates in the database, retrieve
* with DB_MULTIPLE and use the DbMultipleDataIterator
* to iterate the data of the random key in the data
* Dbt. Otherwise retrieve with DB_MULTIPLE_KEY and use
* the DbMultipleKeyDataIterator to iterate the
* key/data pairs of the specific set of keys which
* includes all integers >= the random key and < "num".
*/
j = rand() % num;
key.set_data(&j);
if ((ret = dbcp->get(&key, &data, flags)) != 0)
throwException(dbenv, NULL, ret, "DBC->get");
if (dups) {
ptrd = new DbMultipleDataIterator(data);
while (ptrd->next(dp) == true) {
count++;
if (verbose)
printf(
"Retrieve key: %d, \tdata: (id %d, str %s)\n", j, ((struct data *)(
dp.get_data()))->id,
(char *)((struct data *)(
dp.get_data()))->str);
}
} else {
ptrkd = new DbMultipleKeyDataIterator(data);
while (ptrkd->next(kp, dp) == true) {
count++;
if (verbose)
printf(
"Retrieve key: %d, \tdata: (id %d, str %s)\n", *((int *)kp.get_data()),
((struct data *)(
dp.get_data()))->id,
(char *)((struct data *)(
dp.get_data()))->str);
}
}
ret = dbcp->close();
dbcp = NULL;
if (ret != 0)
throwException(dbenv, txnp, ret, "DBC->close");
ret = txnp->commit(0);
txnp = NULL;
if (ret != 0)
throwException(dbenv, NULL,
ret, "DB_TXN->commit");
}
*countp = count;
} catch (DbException &dbe) {
cerr << "bulkRead " << dbe.what() << endl;
if (dbcp != NULL)
(void)dbcp->close();
//.........这里部分代码省略.........
示例6: bulkSecondaryDelete
/* Bulk delete from a secondary db. */
void BulkExample::bulkSecondaryDelete(
int num, int pair, int *countp, int *iterp, int verbose)
{
Dbt key;
DbTxn *txnp;
DbMultipleDataBuilder *ptrd;
DbMultipleKeyDataBuilder *ptrkd;
u_int32_t flag;
int count, i, iter, j, k, rc, ret;
char ch;
memset(&key, 0, sizeof(Dbt));
txnp = NULL;
count = flag = iter = ret = 0;
rc = rand() % (STRLEN - 1);
/*
* The buffer must be at least as large as the page size of the
* underlying database and aligned for unsigned integer access.
* Its size must be a multiple of 1024 bytes.
*/
if (klen != (u_int32_t)UPDATES_PER_BULK_PUT *
(sizeof(u_int32_t) + DATALEN) * 1024) {
klen = (u_int32_t)UPDATES_PER_BULK_PUT *
(sizeof(u_int32_t) + DATALEN) * 1024;
kbuf = realloc(kbuf, klen);
}
memset(kbuf, 0, klen);
key.set_ulen(klen);
key.set_flags(DB_DBT_USERMEM | DB_DBT_BULK);
key.set_data(kbuf);
/*
* Bulk delete all records of a specific set of keys which includes all
* characters before the random key in the tstring. The random key is
* one of the characters in the tstring.
* If DB_MULTIPLE, construct the key Dbt by the DbMultipleDataBuilder
* with the specific set of keys. If DB_MULTIPLE_KEY, construct the key
* Dbt by the DbMultipleKeyDataBuilder with all key/data pairs of the
* specific set of keys.
*/
flag |= (pair) ? DB_MULTIPLE_KEY : DB_MULTIPLE;
if (pair)
ptrkd = new DbMultipleKeyDataBuilder(key);
else
ptrd = new DbMultipleDataBuilder(key);
try {
for (i = 0; i <= rc; i++) {
if (i % UPDATES_PER_BULK_PUT == 0) {
if (txnp != NULL) {
ret = txnp->commit(0);
txnp = NULL;
if (ret != 0)
throwException(dbenv, NULL,
ret, "DB_TXN->commit");
}
if ((ret = dbenv->txn_begin(NULL,
&txnp, 0)) != 0)
throwException(dbenv,
NULL, ret, "DB_ENV->txn_begin");
}
ch = tstring[i];
if (!pair) {
if (ptrd->append(&ch, sizeof(ch)) == false)
throwException(dbenv,
txnp, EXIT_FAILURE,
"DbMultipleDataBuilder->append");
count++;
if (verbose)
printf("Delete key: %c\n", ch);
} else {
j = 0;
do {
k = j * (STRLEN - 1) + i;
if (ptrkd->append(&ch, sizeof(ch),
&k, sizeof(k)) == false)
throwException(dbenv,
txnp, EXIT_FAILURE,
"DbMultipleKeyDataBuilder->append");
count++;
if (verbose)
printf(
"Delete secondary key: %c, \tdata: %d\n",
ch, k);
} while (++j < (int)(num / (STRLEN - 1)));
}
if ((i + 1) % UPDATES_PER_BULK_PUT == 0) {
if ((ret = sdbp->del(txnp, &key, flag)) != 0)
throwException(dbenv,
txnp, ret, "Bulk DB->del");
iter++;
if (pair)
ptrkd = new
DbMultipleKeyDataBuilder(key);
else
ptrd = new DbMultipleDataBuilder(key);
}
//.........这里部分代码省略.........
示例7: bulkDelete
/* Bulk delete from a database. */
void BulkExample::bulkDelete(
int num, int dups, int *countp, int *iterp, int verbose)
{
Dbt key;
DbTxn *txnp;
DbMultipleDataBuilder *ptrd;
DbMultipleKeyDataBuilder *ptrkd;
u_int32_t flag;
int count, i, j, iter, ret;
txnp = NULL;
count = flag = iter = ret = 0;
memset(&key, 0, sizeof(Dbt));
j = rand() % num;
/*
* The buffer must be at least as large as the page size of the
* underlying database and aligned for unsigned integer access.
* Its size must be a multiple of 1024 bytes.
*/
if (klen != (u_int32_t)UPDATES_PER_BULK_PUT *
(sizeof(u_int32_t) + DATALEN) * 1024) {
klen = (u_int32_t)UPDATES_PER_BULK_PUT *
(sizeof(u_int32_t) + DATALEN) * 1024;
kbuf = realloc(kbuf, klen);
}
memset(kbuf, 0, klen);
key.set_ulen(klen);
key.set_flags(DB_DBT_USERMEM | DB_DBT_BULK);
key.set_data(kbuf);
if (data_val == NULL)
data_val = (data *)malloc(DATALEN);
memset(data_val, 0, DATALEN);
/*
* Bulk delete all records of a specific set of keys which includes all
* non-negative integers smaller than the random key. The random key is
* a random non-negative integer smaller than "num".
* If DB_MULTIPLE, construct the key Dbt by the DbMultipleDataBuilder
* with the specific set of keys. If DB_MULTIPLE_KEY, construct the key
* Dbt by the DbMultipleKeyDataBuilder with all key/data pairs of the
* specific set of keys.
*/
flag |= (dups) ? DB_MULTIPLE_KEY : DB_MULTIPLE;
if (dups)
ptrkd = new DbMultipleKeyDataBuilder(key);
else
ptrd = new DbMultipleDataBuilder(key);
try {
for (i = 0; i < j; i++) {
if (i % UPDATES_PER_BULK_PUT == 0) {
if (txnp != NULL) {
ret = txnp->commit(0);
txnp = NULL;
if (ret != 0)
throwException(dbenv, NULL,
ret, "DB_TXN->commit");
}
if ((ret = dbenv->txn_begin(NULL,
&txnp, 0)) != 0)
throwException(dbenv, NULL,
ret, "DB_ENV->txn_begin");
}
if (dups) {
data_val->id = 0;
get_string(tstring, data_val->str, i);
do {
if(ptrkd->append(&i,sizeof(i),
data_val, DATALEN) == false)
throwException(dbenv,
txnp, EXIT_FAILURE,
"DbMultipleKeyDataBuilder->append");
count++;
if (verbose)
printf(
"Delete key: %d, \tdata: (id %d, str %s)\n",
i, data_val->id,
data_val->str);
} while (data_val->id++ < dups);
} else {
if(ptrd->append(&i,sizeof(i)) == false)
throwException(dbenv, txnp, ret,
"DbMultipleDataBuilder->append");
count++;
if (verbose)
printf("Delete key: %d\n", i);
}
if ((i + 1) % UPDATES_PER_BULK_PUT == 0) {
if ((ret = dbp->del(txnp, &key, flag)) != 0)
throwException(dbenv,
txnp, ret, "Bulk DB->del");
iter++;
if (dups)
ptrkd = new
DbMultipleKeyDataBuilder(key);
else
//.........这里部分代码省略.........
示例8: k_histdbt
//
// XXX Figure out the appropriate way to pick out IDs.
//
int
TpcbExample::txn(Db *adb, Db *bdb, Db *tdb, Db *hdb,
int accounts, int branches, int tellers)
{
Dbc *acurs = NULL;
Dbc *bcurs = NULL;
Dbc *tcurs = NULL;
DbTxn *t = NULL;
db_recno_t key;
Defrec rec;
Histrec hrec;
int account, branch, teller, ret;
Dbt d_dbt;
Dbt d_histdbt;
Dbt k_dbt;
Dbt k_histdbt(&key, sizeof(key));
// !!!
// This is sample code -- we could move a lot of this into the driver
// to make it faster.
//
account = random_id(ACCOUNT, accounts, branches, tellers);
branch = random_id(BRANCH, accounts, branches, tellers);
teller = random_id(TELLER, accounts, branches, tellers);
k_dbt.set_size(sizeof(int));
d_dbt.set_flags(DB_DBT_USERMEM);
d_dbt.set_data(&rec);
d_dbt.set_ulen(sizeof(rec));
hrec.aid = account;
hrec.bid = branch;
hrec.tid = teller;
hrec.amount = 10;
// Request 0 bytes since we're just positioning.
d_histdbt.set_flags(DB_DBT_PARTIAL);
// START PER-TRANSACTION TIMING.
//
// Technically, TPCB requires a limit on response time, you only get
// to count transactions that complete within 2 seconds. That's not
// an issue for this sample application -- regardless, here's where
// the transaction begins.
if (txn_begin(NULL, &t, 0) != 0)
goto err;
if (adb->cursor(t, &acurs, 0) != 0 ||
bdb->cursor(t, &bcurs, 0) != 0 ||
tdb->cursor(t, &tcurs, 0) != 0)
goto err;
// Account record
k_dbt.set_data(&account);
if (acurs->get(&k_dbt, &d_dbt, DB_SET) != 0)
goto err;
rec.balance += 10;
if (acurs->put(&k_dbt, &d_dbt, DB_CURRENT) != 0)
goto err;
// Branch record
k_dbt.set_data(&branch);
if (bcurs->get(&k_dbt, &d_dbt, DB_SET) != 0)
goto err;
rec.balance += 10;
if (bcurs->put(&k_dbt, &d_dbt, DB_CURRENT) != 0)
goto err;
// Teller record
k_dbt.set_data(&teller);
if (tcurs->get(&k_dbt, &d_dbt, DB_SET) != 0)
goto err;
rec.balance += 10;
if (tcurs->put(&k_dbt, &d_dbt, DB_CURRENT) != 0)
goto err;
// History record
d_histdbt.set_flags(0);
d_histdbt.set_data(&hrec);
d_histdbt.set_ulen(sizeof(hrec));
if (hdb->put(t, &k_histdbt, &d_histdbt, DB_APPEND) != 0)
goto err;
if (acurs->close() != 0 || bcurs->close() != 0 || tcurs->close() != 0)
goto err;
ret = t->commit(0);
t = NULL;
if (ret != 0)
goto err;
// END PER-TRANSACTION TIMING.
return (0);
err:
//.........这里部分代码省略.........
示例9: main
int main(int argc, char *argv[])
{
try {
DbEnv *dbenv = new DbEnv(0);
DbTxn *dbtxn;
u_int8_t conflicts[10];
dbenv->set_error_stream(&cerr);
dbenv->set_timeout(0x90000000,
DB_SET_LOCK_TIMEOUT);
dbenv->set_lg_bsize(0x1000);
dbenv->set_lg_dir(".");
dbenv->set_lg_max(0x10000000);
dbenv->set_lg_regionmax(0x100000);
dbenv->set_lk_conflicts(conflicts, sizeof(conflicts));
dbenv->set_lk_detect(DB_LOCK_DEFAULT);
dbenv->set_lk_max_lockers(100);
dbenv->set_lk_max_locks(10);
dbenv->set_lk_max_objects(1000);
dbenv->set_mp_mmapsize(0x10000);
// Need to open the environment so we
// can get a transaction.
//
dbenv->open(".", DB_CREATE | DB_INIT_TXN |
DB_INIT_LOCK | DB_INIT_LOG |
DB_INIT_MPOOL,
0644);
dbenv->txn_begin(NULL, &dbtxn, DB_TXN_NOWAIT);
dbtxn->set_timeout(0xA0000000, DB_SET_TXN_TIMEOUT);
dbtxn->abort();
dbenv->close(0);
// We get a db, one for each type.
// That's because once we call (for instance)
// set_bt_minkey, DB 'knows' that this is a
// Btree Db, and it cannot be used to try Hash
// or Recno functions.
//
Db *db_bt = new Db(NULL, 0);
db_bt->set_bt_minkey(100);
db_bt->set_cachesize(0, 0x100000, 0);
db_bt->close(0);
Db *db_h = new Db(NULL, 0);
db_h->set_h_ffactor(0x10);
db_h->set_h_nelem(100);
db_h->set_lorder(0);
db_h->set_pagesize(0x10000);
db_h->close(0);
Db *db_re = new Db(NULL, 0);
db_re->set_re_delim('@');
db_re->set_re_pad(10);
db_re->set_re_source("re.in");
db_re->close(0);
Db *db_q = new Db(NULL, 0);
db_q->set_q_extentsize(200);
db_q->close(0);
}
catch (DbException &dbe) {
cerr << "Db Exception: " << dbe.what() << "\n";
}
return 0;
}
示例10: str2num
/* Get all scores of a certain patient.
* Returns 0 if everything is ok;
* returns -1 if permission is denied, and error message is not sent out successfully;
* returns 1 if permission is denied, but error message is sent out successfully;
* returns -2 if patient ID is invalid, and error message is not sent out successfully;
* returns 2 if patient ID is invalid, but error message is sent out successfully;
* returns -3 if error occurs when searching score value table, and error message is not sent out successfully;
* returns 3 if error occurs when searching score value table, but error message is sent out successfully;
* returns -4 if no score value record is found, and error message is not sent out successfully;
* returns 4 if no score value record is found, but error message is sent out successfully;
* returns -5 if data size message is not sent out successfully;
* returns -6 if score value data are not sent out successfully;
* returns -7 if no session is available, and the message is not sent out successfully;
* returns -8 if error occurs when searching session table, and error message is not sent out successfully;
* returns 8 if error occurs when searching session table, but error message is sent out successfully;
* returns -9 if session data are not sent out successfully. */
int srvSession::sendPatientScores()
{
if (!permissions.size()) {
statMsg = "Permission denied";
if (sendStatMsg())
return -1;
return 1;
}
// send error message to client if patient ID is invalid or score values not found
int32 pID;
bool conv_stat = str2num(c_tokens[1], pID);
if (!conv_stat || pID <= 0) {
statMsg = "no_data: Invalid patient ID " + c_tokens[1];
if (sendStatMsg())
return -2;
return 2;
}
// get score values
set<int32> sid_set;
DbTxn* txn = NULL;
dbs.env.getEnv()->txn_begin(NULL, &txn, 0);
Dbc* cursorp = NULL;
if (dbs.scoreValueDB.getDb().cursor(txn, &cursorp, 0)) {
txn->abort();
statMsg = "no_data: db error when searching score value table";
if (sendStatMsg())
return -3;
return 3;
}
// Iterate over score values table
Dbt key, data;
int ret;
int32 status = 0;
while ((ret = cursorp->get(&key, &data, DB_NEXT_NODUP)) == 0) {
DBscorevalue svData;
svData.deserializeHdr(data.get_data());
if (pID != svData.patient || svData.deleted)
continue;
string tmpPerm = getMaxPerm(svData, permissions);
if (tmpPerm.empty())
continue;
/* Add session IDs into session_list vector (session 0 is ignored here
* because this session doesn't exist in session table anyway) */
int32 sess_id = svData.sessionid;
if (sess_id)
sid_set.insert(sess_id);
// Add real score value records into DBscorevalue vector.
status = 1;
uint32 dat_size = data.get_size();
statMsg = "scorevalue: " + num2str(dat_size) + " " + tmpPerm;
if (sendStatMsg()) {
cursorp->close();
txn->abort();
return -4;
}
if (sendBuffer(g_session, dat_size, (char*) data.get_data())) {
statMsg = "Error when sending score value to client";
cursorp->close();
txn->abort();
return -4;
}
}
// Returns -1 if ret is non-zero and it doesn't reach the end of table
if (ret && ret != DB_NOTFOUND) {
cursorp->close();
txn->abort();
statMsg = "no_data: db error when searching score value table";
if (sendStatMsg())
return -3;
return 3;
}
cursorp->close();
if (status == 0) {
txn->commit(0);
statMsg = "no_scorevalue";
if (sendStatMsg())
//.........这里部分代码省略.........