@ -207,6 +207,12 @@ class BerkeleyBatch
operator Dbt * ( ) ;
operator Dbt * ( ) ;
} ;
} ;
private :
bool ReadKey ( CDataStream & key , CDataStream & value ) ;
bool WriteKey ( CDataStream & key , CDataStream & value , bool overwrite = true ) ;
bool EraseKey ( CDataStream & key ) ;
bool HasKey ( CDataStream & key ) ;
protected :
protected :
Db * pdb ;
Db * pdb ;
std : : string strFile ;
std : : string strFile ;
@ -236,91 +242,65 @@ public:
template < typename K , typename T >
template < typename K , typename T >
bool Read ( const K & key , T & value )
bool Read ( const K & key , T & value )
{
{
if ( ! pdb )
return false ;
// Key
// Key
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
ssKey . reserve ( 1000 ) ;
ssKey . reserve ( 1000 ) ;
ssKey < < key ;
ssKey < < key ;
SafeDbt datKey ( ssKey . data ( ) , ssKey . size ( ) ) ;
// Read
CDataStream ssValue ( SER_DISK , CLIENT_VERSION ) ;
SafeDbt datValue ;
int ret = pdb - > get ( activeTxn , datKey , datValue , 0 ) ;
bool success = false ;
bool success = false ;
if ( datValue . get_data ( ) ! = nullptr ) {
bool ret = ReadKey ( ssKey , ssValue ) ;
if ( ret ) {
// Unserialize value
// Unserialize value
try {
try {
CDataStream ssValue ( ( char * ) datValue . get_data ( ) , ( char * ) datValue . get_data ( ) + datValue . get_size ( ) , SER_DISK , CLIENT_VERSION ) ;
ssValue > > value ;
ssValue > > value ;
success = true ;
success = true ;
} catch ( const std : : exception & ) {
} catch ( const std : : exception & ) {
// In this case success remains 'false'
// In this case success remains 'false'
}
}
}
}
return ret == 0 && success ;
return ret && success ;
}
}
template < typename K , typename T >
template < typename K , typename T >
bool Write ( const K & key , const T & value , bool fOverwrite = true )
bool Write ( const K & key , const T & value , bool fOverwrite = true )
{
{
if ( ! pdb )
return true ;
if ( fReadOnly )
assert ( ! " Write called on database in read-only mode " ) ;
// Key
// Key
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
ssKey . reserve ( 1000 ) ;
ssKey . reserve ( 1000 ) ;
ssKey < < key ;
ssKey < < key ;
SafeDbt datKey ( ssKey . data ( ) , ssKey . size ( ) ) ;
// Value
// Value
CDataStream ssValue ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssValue ( SER_DISK , CLIENT_VERSION ) ;
ssValue . reserve ( 10000 ) ;
ssValue . reserve ( 10000 ) ;
ssValue < < value ;
ssValue < < value ;
SafeDbt datValue ( ssValue . data ( ) , ssValue . size ( ) ) ;
// Write
// Write
int ret = pdb - > put ( activeTxn , datKey , datValue , ( fOverwrite ? 0 : DB_NOOVERWRITE ) ) ;
return WriteKey ( ssKey , ssValue , fOverwrite ) ;
return ( ret = = 0 ) ;
}
}
template < typename K >
template < typename K >
bool Erase ( const K & key )
bool Erase ( const K & key )
{
{
if ( ! pdb )
return false ;
if ( fReadOnly )
assert ( ! " Erase called on database in read-only mode " ) ;
// Key
// Key
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
ssKey . reserve ( 1000 ) ;
ssKey . reserve ( 1000 ) ;
ssKey < < key ;
ssKey < < key ;
SafeDbt datKey ( ssKey . data ( ) , ssKey . size ( ) ) ;
// Erase
// Erase
int ret = pdb - > del ( activeTxn , datKey , 0 ) ;
return EraseKey ( ssKey ) ;
return ( ret = = 0 | | ret = = DB_NOTFOUND ) ;
}
}
template < typename K >
template < typename K >
bool Exists ( const K & key )
bool Exists ( const K & key )
{
{
if ( ! pdb )
return false ;
// Key
// Key
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
CDataStream ssKey ( SER_DISK , CLIENT_VERSION ) ;
ssKey . reserve ( 1000 ) ;
ssKey . reserve ( 1000 ) ;
ssKey < < key ;
ssKey < < key ;
SafeDbt datKey ( ssKey . data ( ) , ssKey . size ( ) ) ;
// Exists
// Exists
int ret = pdb - > exists ( activeTxn , datKey , 0 ) ;
return HasKey ( ssKey ) ;
return ( ret = = 0 ) ;
}
}
Dbc * GetCursor ( ) ;
Dbc * GetCursor ( ) ;