我正在嘗試編寫一個使用Berkeley DB進行存儲的簡單C++程序。數據庫的密鑰類型爲time_t
,數據爲integer
。Berkeley DB和C++的問題
我需要在兩個鍵之間取兩個相鄰數據之間的差異。我用DB_SET_RANGE標誌打開遊標,然後使用DB_NEXT進行迭代。
我的問題是光標返回未排序的數據。有沒有辦法爲光標指定一個自定義的分類器函數?
我正在嘗試編寫一個使用Berkeley DB進行存儲的簡單C++程序。數據庫的密鑰類型爲time_t
,數據爲integer
。Berkeley DB和C++的問題
我需要在兩個鍵之間取兩個相鄰數據之間的差異。我用DB_SET_RANGE標誌打開遊標,然後使用DB_NEXT進行迭代。
我的問題是光標返回未排序的數據。有沒有辦法爲光標指定一個自定義的分類器函數?
一些原因,你可能想提供一個自定義排序功能是:
你是使用一個小端系統(比如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);
}
我認爲你必須爲你的數據創建一個secondary index。
我曾試過睡貓伯克利數據庫(由於代碼維護),但我沒有嘗試二級索引。
如果性能比較不是那麼重要,你可以切換數據庫引擎,我建議SQLite :-)