Skip to content

Commit f922ad8

Browse files
authored
kv-store: add list method (#74)
2 parents 94bf27a + 487d2e1 commit f922ad8

2 files changed

Lines changed: 19 additions & 0 deletions

File tree

sdk/typescript/src/kvstore.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ export class KvStore {
6969
return JSON.parse(row.value);
7070
}
7171

72+
async list(prefix: string): Promise<{ key: string, value: any }[]> {
73+
await this.initialized;
74+
75+
const stmt = this.db.prepare(`SELECT key, value FROM kv_store WHERE key LIKE ? ESCAPE '\\'`);
76+
const escaped = prefix.replace('\\', '\\\\').replace('%', '\\%').replace('_', '\\_');
77+
const rows = await stmt.all(escaped + '%') as { key: string, value: string }[];
78+
return rows.map(r => ({ key: r.key, value: JSON.parse(r.value) }));
79+
}
80+
7281
async delete(key: string): Promise<void> {
7382
await this.initialized;
7483

sdk/typescript/tests/kvstore.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@ describe('KvStore Integration Tests', () => {
6262
const value = await kvStore.get('array-key');
6363
expect(value).toEqual(testArray);
6464
});
65+
it('should set and list values', async () => {
66+
await kvStore.set('g1:k1', 1);
67+
await kvStore.set('g1:k2', 2);
68+
await kvStore.set('g2:k1', 3);
69+
await kvStore.set('g2:k2', 4);
70+
expect(await kvStore.list('g1:')).toEqual([{ key: 'g1:k1', value: 1 }, { key: 'g1:k2', value: 2 }]);
71+
expect(await kvStore.list('g1:k1')).toEqual([{ key: 'g1:k1', value: 1 }]);
72+
expect(await kvStore.list('g1:k3')).toEqual([]);
73+
expect(await kvStore.list('g2:')).toEqual([{ key: 'g2:k1', value: 3 }, { key: 'g2:k2', value: 4 }]);
74+
});
6575
});
6676

6777
describe('Update Operations', () => {

0 commit comments

Comments
 (0)