京都キャビネットサポートキーレンジ検索
-
16-12-2019 - |
質問
京都キャビネットは鍵の範囲を検索していますか? もしそうなら、どのような種類のキーが範囲検索をサポートしていますか? Long(64bit)キーで範囲検索を行うことができますか?
感謝 RG
解決
LevelDBはバイナリキーとレンジ色のクエリをサポートします。
編集:範囲クエリが機能するためには、バイナリ値を同等の方法で梱包する必要があることを忘れています。あなたの長い例のために、あなたはそれが大きなエンディアンエンコードされたことを確認する必要があります。
他のヒント
キープレフィックスクエリをサポートしていますが、プレフィックスクエリの効率は内部ストレージ構造の内部に依存します。hashdbを使用している場合は、キーと値が下線ファイルで散在しているので、それは良い考えではないかもしれません。
はい、整数の場合は
B + Treeデータベースは、順番に順次整数の順番で順次アクセスをサポートします。
はい、あなたはただ前方へのジャンプが必要です。
C.64ビットキーを含む5レコード(1~5)を記録してから、フィルタを適用し(2~4):
#include <kclangc.h>
#include <inttypes.h>
int main(void)
{
KCDB *db;
KCCUR *cur;
char *kbuf;
size_t ksiz, vsiz;
const char *cvbuf;
int64_t i, val, min, max;
int64_t keys[] = {1, 2, 3, 4, 5};
const char *values[] = {"one", "two", "three", "four", "five"};
char i64[8]; /* A buffer to store byte sequences */
/* create the database object */
db = kcdbnew();
/* open the database */
if (!kcdbopen(db, "db64.kct", KCOWRITER | KCOCREATE)) {
fprintf(stderr, "open error: %s\n", kcecodename(kcdbecode(db)));
}
/* store records */
for (i = 0; i < 5; i++) {
memcpy(i64, &keys[i], 8);
if (!kcdbset(db, i64, 8, values[i], strlen(values[i]))) {
fprintf(stderr, "set error: %s\n", kcecodename(kcdbecode(db)));
exit(EXIT_FAILURE);
}
}
/* traverse records */
min = 2;
max = 4;
printf("Range from %" PRId64 " to %" PRId64 "\n", min, max);
memcpy(i64, &min, 8);
cur = kcdbcursor(db);
kccurjumpkey(cur, i64, 8);
while ((kbuf = kccurget(cur, &ksiz, &cvbuf, &vsiz, 1)) != NULL) {
memcpy(&val, kbuf, 8);
if (val > max) {
break;
}
printf("Found %s\n", cvbuf);
kcfree(kbuf);
}
kccurdel(cur);
/* close the database */
if (!kcdbclose(db)) {
fprintf(stderr, "close error: %s\n", kcecodename(kcdbecode(db)));
}
/* delete the database object */
kcdbdel(db);
return 0;
}
. 所属していません StackOverflow