ストレージにBerkeleyDBを使用する単純なC++プログラムを作成しようとしています。データベースのキーはタイプtime_t
であり、データはinteger
です。
2つのキーの間の2つの隣接するデータの違いを理解する必要があります。フラグDB_SET_RANGEでカーソルを開き、DB_NEXTを使用して繰り返します。
私の問題は、カーソルがソートされていないデータを返すことです。カーソルのカスタムソーター関数を指定する方法はありますか?
ストレージにBerkeleyDBを使用する単純なC++プログラムを作成しようとしています。データベースのキーはタイプtime_t
であり、データはinteger
です。
2つのキーの間の2つの隣接するデータの違いを理解する必要があります。フラグDB_SET_RANGEでカーソルを開き、DB_NEXTを使用して繰り返します。
私の問題は、カーソルがソートされていないデータを返すことです。カーソルのカスタムソーター関数を指定する方法はありますか?
カスタムの並べ替え関数を提供する理由には、次のようなものがあります。
リトルエンディアン システム (x86 など) を使用しており、データベースのキーとして整数を使用しています。Berkeley DB はキーをバイト文字列として格納し、リトルエンディアン整数はバイト文字列として表示するとうまくソートされません。この問題にはいくつかの解決策があります。その 1 つは、カスタム比較関数を提供することです。詳細については、 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);
}
データのセカンダリ インデックスを作成する必要があると思います。
Sleeping Cat Berkeley Database を試しましたが (コードのメンテナンスのため)、セカンダリ インデックスは試しませんでした。
パフォーマンスがそれほど重要ではなく、データベース エンジンを切り替えることができる場合は、SQLiteをお勧めします:-)