Berkeley DB在Queue模式下的使用
Queue模式下僅能存儲(chǔ)定長(zhǎng)的記錄,既value的長(zhǎng)度為定長(zhǎng)。Queue的key是一個(gè)邏輯增長(zhǎng)的數(shù),一般就是int。
不需要開(kāi)發(fā)者去改變這個(gè)類型。
Queue模式下只能存儲(chǔ)定長(zhǎng)的記錄。所以一定要調(diào)用DB的set_re_length函數(shù)來(lái)設(shè)定數(shù)據(jù)庫(kù)中記錄的長(zhǎng)度。
如果沒(méi)有設(shè)定,默認(rèn)的為0。這樣當(dāng)存儲(chǔ)記錄時(shí)一定會(huì)報(bào)異常。程序出錯(cuò)。
在讀取記錄時(shí),當(dāng)記錄的長(zhǎng)度小于設(shè)定的長(zhǎng)度時(shí),會(huì)填充字符達(dá)到設(shè)定長(zhǎng)度。
默認(rèn)的字符為0x02(ASCII中的)。可以設(shè)定自己的填充字符。調(diào)用DB的set_re_pad。
一個(gè)簡(jiǎn)單的示例
#include < time.h >
#include < iostream >
#include < bdb/db_cxx.h >
struct ValueType
{
int _int;
char _char;
char _array[256];
};
void writeDB( void )
{
Db bdb( 0, 0 );
bdb.set_re_len( sizeof( ValueType ) ); //用Queue模式一定要調(diào)用,而且一定要在open前調(diào)用
bdb.set_re_pad( 0x00 ); //為了字符串的填充為0。
bdb.open( 0, "SaveRecodeDB.db", 0, DB_QUEUE, DB_CREATE, 0 );
size_t k;
ValueType v;
Dbt key( &k, sizeof( size_t ) );
Dbt value( &v, sizeof( ValueType ) );
//直接用數(shù)據(jù)庫(kù)的寫(xiě)函數(shù)
for( int i=0; i<1000000; ++i )
{
bdb.put( 0, &key, &value, DB_APPEND );
}
bdb.close( 0 );
}
int main( int argc, char* argv[] )
{
clock_t et1 = clock();
writeDB();
clock_t et2 = clock();
std::cout << "work is fine, " << "have times : " << et2 - et1 << std::endl;
return 0;
}
在Queue模式下不能用游標(biāo)進(jìn)行數(shù)據(jù)的插入。只能進(jìn)行數(shù)據(jù)的修改。