berkeley db 5.x C APIを使用して、プレフィックスと一致するキーを持つすべてのレコードを取得する方法はありますか?
(データベース全体をスキャンせずに)
たぶんBtreeプレフィックス比較カスタムコールバックで?
berkeley db 5.x C APIを使用して、プレフィックスと一致するキーを持つすべてのレコードを取得する方法はありますか?
(データベース全体をスキャンせずに)
たぶんBtreeプレフィックス比較カスタムコールバックで?
ソリューションには2つの部分があります。まず、カスタムキー比較機能を使用する必要があります。
dbp->set_bt_compare(dbp, cmp_fn);
比較機能では、データベース内で同じプレフィックスを持つキーが隣り合ってソートされるようにします。これは、比較よりも小さいものの束と同じくらい単純である可能性があるため、のようなものは。0x000000000000000000000001
よりも小さくなり0x000000000000000000000002
ます。
検索を行うには、カーソルを開き、cursor->get()
フラグを使用してDB_SET_RANGE
を実行します。開始キーをプレフィックス範囲の先頭に設定します。たとえば、プレフィックスが付いたキーを探している場合は0x1138
、キーをに設定します0x113800000000000000000000
。cursor->get()
次に、で呼び出し続けDB_NEXT
ます。0x1138
プレフィックスのないキーが表示されたら、完了です。
この手法では、データベース全体をスキャンする必要はありません。最初のDB_SET_RANGE
呼び出しでカーソルが適切な場所から開始され、ツリー内でレコードがすべて隣り合っているためです。