summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/unit/kv_test.ts10
-rw-r--r--ext/kv/01_db.ts30
2 files changed, 40 insertions, 0 deletions
diff --git a/cli/tests/unit/kv_test.ts b/cli/tests/unit/kv_test.ts
index 1c0eed002..fcb0c7894 100644
--- a/cli/tests/unit/kv_test.ts
+++ b/cli/tests/unit/kv_test.ts
@@ -548,6 +548,16 @@ async function setupData(db: Deno.Kv) {
.commit();
}
+dbTest("get many", async (db) => {
+ await setupData(db);
+ const entries = await db.getMany([["b", "a"], ["a"], ["c"]]);
+ assertEquals(entries, [
+ { key: ["b", "a"], value: 100, versionstamp: "00000000000000010000" },
+ { key: ["a"], value: -1, versionstamp: "00000000000000010000" },
+ { key: ["c"], value: null, versionstamp: null },
+ ]);
+});
+
dbTest("list prefix", async (db) => {
await setupData(db);
const entries = await collect(db.list({ prefix: ["a"] }));
diff --git a/ext/kv/01_db.ts b/ext/kv/01_db.ts
index 571a1b3cd..b423a2553 100644
--- a/ext/kv/01_db.ts
+++ b/ext/kv/01_db.ts
@@ -72,6 +72,36 @@ class Kv {
return deserializeValue(entries[0]);
}
+ async getMany(
+ keys: Deno.KvKey[],
+ opts?: { consistency?: Deno.KvConsistencyLevel },
+ ): Promise<Deno.KvEntry[]> {
+ keys = keys.map(convertKey);
+ const ranges: RawKvEntry[][] = await core.opAsync(
+ "op_kv_snapshot_read",
+ this.#rid,
+ keys.map((key) => [
+ null,
+ key,
+ null,
+ 1,
+ false,
+ null,
+ ]),
+ opts?.consistency ?? "strong",
+ );
+ return ranges.map((entries, i) => {
+ if (!entries.length) {
+ return {
+ key: keys[i],
+ value: null,
+ versionstamp: null,
+ };
+ }
+ return deserializeValue(entries[0]);
+ });
+ }
+
async set(key: Deno.KvKey, value: unknown) {
key = convertKey(key);
value = serializeValue(value);