2009-10-15 94 views
0

我正在嘗試編寫一個使用Berkeley DB進行存儲的簡單C++程序。數據庫的密鑰類型爲time_t,數據爲integerBerkeley DB和C++的問題

我需要在兩個鍵之間取兩個相鄰數據之間的差異。我用DB_SET_RANGE標誌打開遊標,然後使用DB_NEXT進行迭代。

我的問題是光標返回未排序的數據。有沒有辦法爲光標指定一個自定義的分類器函數?

回答

4

一些原因,你可能想提供一個自定義排序功能是:

你是使用一個小端系統(比如x86),並且你使用整數作爲數據庫的關鍵字。 Berkeley DB將密鑰存儲爲字節字符串,小端存儲器整數在按字節字符串查看時排序不佳。這個問題有幾種解決方案,一種是提供自定義比較功能。有關更多信息,請參閱http://www.oracle.com/technology/documentation/berkeley-db/db/ref/am_misc/faq.html

您使用DB-> set_bt_compare()設置BTree的密鑰比較函數。

例如,用於在數據庫中整數密鑰進行排序的示例例程是:

int 
compare_int(DB *dbp, const DBT *a, const DBT *b) 
{ 
    int ai, bi; 

    /* 
    * Returns: 
    * < 0 if a < b 
    * = 0 if a = b 
    * > 0 if a > b 
    */ 
    memcpy(&ai, a->data, sizeof(int)); 
    memcpy(&bi, b->data, sizeof(int)); 
    return (ai - bi); 
} 
0

我認爲你必須爲你的數據創建一個secondary index

我曾試過睡貓伯克利數據庫(由於代碼維護),但我沒有嘗試二級索引。
如果性能比較不是那麼重要,你可以切換數據庫引擎,我建議SQLite :-)