|
|
@ -51,10 +51,10 @@ public: |
|
|
|
void CheckpointLSN(std::string strFile); |
|
|
|
void CheckpointLSN(std::string strFile); |
|
|
|
void SetDetach(bool fDetachDB_) { fDetachDB = fDetachDB_; } |
|
|
|
void SetDetach(bool fDetachDB_) { fDetachDB = fDetachDB_; } |
|
|
|
|
|
|
|
|
|
|
|
DbTxn *TxnBegin(DbTxn *baseTxn, int flags=DB_TXN_WRITE_NOSYNC) |
|
|
|
DbTxn *TxnBegin(int flags=DB_TXN_WRITE_NOSYNC) |
|
|
|
{ |
|
|
|
{ |
|
|
|
DbTxn* ptxn = NULL; |
|
|
|
DbTxn* ptxn = NULL; |
|
|
|
int ret = dbenv.txn_begin(baseTxn, &ptxn, flags); |
|
|
|
int ret = dbenv.txn_begin(NULL, &ptxn, flags); |
|
|
|
if (!ptxn || ret != 0) |
|
|
|
if (!ptxn || ret != 0) |
|
|
|
return NULL; |
|
|
|
return NULL; |
|
|
|
return ptxn; |
|
|
|
return ptxn; |
|
|
@ -70,7 +70,7 @@ class CDB |
|
|
|
protected: |
|
|
|
protected: |
|
|
|
Db* pdb; |
|
|
|
Db* pdb; |
|
|
|
std::string strFile; |
|
|
|
std::string strFile; |
|
|
|
std::vector<DbTxn*> vTxn; |
|
|
|
DbTxn *activeTxn; |
|
|
|
bool fReadOnly; |
|
|
|
bool fReadOnly; |
|
|
|
|
|
|
|
|
|
|
|
explicit CDB(const char* pszFile, const char* pszMode="r+"); |
|
|
|
explicit CDB(const char* pszFile, const char* pszMode="r+"); |
|
|
@ -97,7 +97,7 @@ protected: |
|
|
|
// Read
|
|
|
|
// Read
|
|
|
|
Dbt datValue; |
|
|
|
Dbt datValue; |
|
|
|
datValue.set_flags(DB_DBT_MALLOC); |
|
|
|
datValue.set_flags(DB_DBT_MALLOC); |
|
|
|
int ret = pdb->get(GetTxn(), &datKey, &datValue, 0); |
|
|
|
int ret = pdb->get(activeTxn, &datKey, &datValue, 0); |
|
|
|
memset(datKey.get_data(), 0, datKey.get_size()); |
|
|
|
memset(datKey.get_data(), 0, datKey.get_size()); |
|
|
|
if (datValue.get_data() == NULL) |
|
|
|
if (datValue.get_data() == NULL) |
|
|
|
return false; |
|
|
|
return false; |
|
|
@ -133,7 +133,7 @@ protected: |
|
|
|
Dbt datValue(&ssValue[0], ssValue.size()); |
|
|
|
Dbt datValue(&ssValue[0], ssValue.size()); |
|
|
|
|
|
|
|
|
|
|
|
// Write
|
|
|
|
// Write
|
|
|
|
int ret = pdb->put(GetTxn(), &datKey, &datValue, (fOverwrite ? 0 : DB_NOOVERWRITE)); |
|
|
|
int ret = pdb->put(activeTxn, &datKey, &datValue, (fOverwrite ? 0 : DB_NOOVERWRITE)); |
|
|
|
|
|
|
|
|
|
|
|
// Clear memory in case it was a private key
|
|
|
|
// Clear memory in case it was a private key
|
|
|
|
memset(datKey.get_data(), 0, datKey.get_size()); |
|
|
|
memset(datKey.get_data(), 0, datKey.get_size()); |
|
|
@ -156,7 +156,7 @@ protected: |
|
|
|
Dbt datKey(&ssKey[0], ssKey.size()); |
|
|
|
Dbt datKey(&ssKey[0], ssKey.size()); |
|
|
|
|
|
|
|
|
|
|
|
// Erase
|
|
|
|
// Erase
|
|
|
|
int ret = pdb->del(GetTxn(), &datKey, 0); |
|
|
|
int ret = pdb->del(activeTxn, &datKey, 0); |
|
|
|
|
|
|
|
|
|
|
|
// Clear memory
|
|
|
|
// Clear memory
|
|
|
|
memset(datKey.get_data(), 0, datKey.get_size()); |
|
|
|
memset(datKey.get_data(), 0, datKey.get_size()); |
|
|
@ -176,7 +176,7 @@ protected: |
|
|
|
Dbt datKey(&ssKey[0], ssKey.size()); |
|
|
|
Dbt datKey(&ssKey[0], ssKey.size()); |
|
|
|
|
|
|
|
|
|
|
|
// Exists
|
|
|
|
// Exists
|
|
|
|
int ret = pdb->exists(GetTxn(), &datKey, 0); |
|
|
|
int ret = pdb->exists(activeTxn, &datKey, 0); |
|
|
|
|
|
|
|
|
|
|
|
// Clear memory
|
|
|
|
// Clear memory
|
|
|
|
memset(datKey.get_data(), 0, datKey.get_size()); |
|
|
|
memset(datKey.get_data(), 0, datKey.get_size()); |
|
|
@ -233,45 +233,33 @@ protected: |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
DbTxn* GetTxn() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (!vTxn.empty()) |
|
|
|
|
|
|
|
return vTxn.back(); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public: |
|
|
|
public: |
|
|
|
bool TxnBegin() |
|
|
|
bool TxnBegin() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!pdb) |
|
|
|
if (!pdb || activeTxn) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
DbTxn* ptxn = bitdb.TxnBegin(GetTxn()); |
|
|
|
DbTxn* ptxn = bitdb.TxnBegin(); |
|
|
|
if (!ptxn) |
|
|
|
if (!ptxn) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
vTxn.push_back(ptxn); |
|
|
|
activeTxn = ptxn; |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool TxnCommit() |
|
|
|
bool TxnCommit() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!pdb) |
|
|
|
if (!pdb || !activeTxn) |
|
|
|
return false; |
|
|
|
|
|
|
|
if (vTxn.empty()) |
|
|
|
|
|
|
|
return false; |
|
|
|
return false; |
|
|
|
int ret = vTxn.back()->commit(0); |
|
|
|
int ret = activeTxn->commit(0); |
|
|
|
vTxn.pop_back(); |
|
|
|
activeTxn = NULL; |
|
|
|
return (ret == 0); |
|
|
|
return (ret == 0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool TxnAbort() |
|
|
|
bool TxnAbort() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!pdb) |
|
|
|
if (!pdb || !activeTxn) |
|
|
|
return false; |
|
|
|
|
|
|
|
if (vTxn.empty()) |
|
|
|
|
|
|
|
return false; |
|
|
|
return false; |
|
|
|
int ret = vTxn.back()->abort(); |
|
|
|
int ret = activeTxn->abort(); |
|
|
|
vTxn.pop_back(); |
|
|
|
activeTxn = NULL; |
|
|
|
return (ret == 0); |
|
|
|
return (ret == 0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|