Skip to content

Commit 3c0434b

Browse files
authored
Use Opt in multiGet to indicate when values don't exist (#95)
1 parent 2f3132f commit 3c0434b

File tree

4 files changed

+48
-57
lines changed

4 files changed

+48
-57
lines changed

rocksdb/columnfamily.nim

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,9 @@ template multiGet*(
8282
cf: ColFamilyReadOnly | ColFamilyReadWrite,
8383
keys: openArray[seq[byte]],
8484
sortedInput = false,
85-
errorOnValueNotExists = true,
86-
): RocksDBResult[seq[seq[byte]]] =
85+
): RocksDBResult[seq[Opt[seq[byte]]]] =
8786
## Get a batch of values for the given set of keys.
88-
cf.db.multiGet(keys, sortedInput, errorOnValueNotExists, cf.handle)
87+
cf.db.multiGet(keys, sortedInput, cf.handle)
8988

9089
template put*(cf: ColFamilyReadWrite, key, val: openArray[byte]): RocksDBResult[void] =
9190
## Puts a value for the given key into the column family.

rocksdb/rocksdb.nim

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -286,9 +286,8 @@ proc multiGet*(
286286
db: RocksDbRef,
287287
keys: openArray[seq[byte]],
288288
sortedInput = false,
289-
errorOnValueNotExists = true,
290289
cfHandle = db.defaultCfHandle,
291-
): RocksDBResult[seq[seq[byte]]] =
290+
): RocksDBResult[seq[Opt[seq[byte]]]] =
292291
## Get a batch of values for the given set of keys.
293292
##
294293
## The multiGet API improves performance by batching operations
@@ -333,26 +332,26 @@ proc multiGet*(
333332
rocksdb_free(e)
334333
return res
335334

336-
var values = newSeq[seq[byte]](keys.len())
335+
var values = newSeq[Opt[seq[byte]]](keys.len())
337336
for i, v in valuesPtrs:
338337
if v.isNil():
339-
if errorOnValueNotExists:
340-
return err("rocksdb: value does not exist at index " & $i)
341-
else:
342-
continue
338+
values[i] = Opt.none(seq[byte])
339+
continue
343340

344-
var vLen: csize_t
341+
var vLen: csize_t = 0
345342
let src = rocksdb_pinnableslice_value(v, vLen.addr)
346-
347-
if vLen > 0:
348-
var dest =
349-
when NimMajor >= 2 and NimMinor >= 2:
350-
newSeqUninit[byte](vLen.int)
351-
else:
352-
newSeq[byte](vLen.int)
353-
copyMem(dest[0].addr, src, vLen)
354-
values[i] = dest
355-
343+
if vLen == 0:
344+
values[i] = Opt.some(default(seq[byte]))
345+
continue
346+
347+
assert vLen > 0
348+
var dest =
349+
when NimMajor >= 2 and NimMinor >= 2:
350+
newSeqUninit[byte](vLen.int)
351+
else:
352+
newSeq[byte](vLen.int)
353+
copyMem(dest[0].addr, src, vLen)
354+
values[i] = Opt.some(dest)
356355
rocksdb_pinnableslice_destroy(v)
357356

358357
ok(values)

tests/test_columnfamily.nim

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,6 @@ suite "ColFamily Tests":
144144
let dataRes = cf.multiGet(@[keyValue1, keyValue2, keyValue3]).expect("ok")
145145
check:
146146
dataRes.len() == 3
147-
dataRes[0] == keyValue1
148-
dataRes[1] == keyValue2
149-
dataRes[2] == default(seq[byte])
147+
dataRes[0] == Opt.some(keyValue1)
148+
dataRes[1] == Opt.some(keyValue2)
149+
dataRes[2] == Opt.some(default(seq[byte]))

tests/test_rocksdb.nim

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -574,45 +574,38 @@ suite "RocksDbRef Tests":
574574
let dataRes = db.multiGet(@[keyValue1]).expect("ok")
575575
check:
576576
dataRes.len() == 1
577-
dataRes[0] == keyValue1
577+
dataRes[0] == Opt.some(keyValue1)
578578

579579
block:
580580
let dataRes = db.multiGet(@[keyValue1, keyValue2]).expect("ok")
581581
check:
582582
dataRes.len() == 2
583-
dataRes[0] == keyValue1
584-
dataRes[1] == keyValue2
583+
dataRes[0] == Opt.some(keyValue1)
584+
dataRes[1] == Opt.some(keyValue2)
585585

586586
block:
587-
let dataRes =
588-
db.multiGet(@[keyValue2, keyValue3], errorOnValueNotExists = false).expect("ok")
587+
let dataRes = db.multiGet(@[keyValue2, keyValue3]).expect("ok")
589588
check:
590589
dataRes.len() == 2
591-
dataRes[0] == keyValue2
592-
dataRes[1] == default(seq[byte])
590+
dataRes[0] == Opt.some(keyValue2)
591+
dataRes[1] == Opt.none(seq[byte])
593592

594593
block:
595-
let
596-
res1 = db.multiGet(@[keyValue1, keyValue2, keyValue3])
597-
res2 =
598-
db.multiGet(@[keyValue1, keyValue2, keyValue3], errorOnValueNotExists = true)
594+
let dataRes = db.multiGet(@[keyValue1, keyValue2, keyValue3]).expect("ok")
599595
check:
600-
res1.isErr()
601-
res2.isErr()
596+
dataRes.len() == 3
597+
dataRes[0] == Opt.some(keyValue1)
598+
dataRes[1] == Opt.some(keyValue2)
599+
dataRes[2] == Opt.none(seq[byte])
602600

603601
block:
604-
let dataRes = db
605-
.multiGet(
606-
@[keyValue1, keyValue2, keyValue3],
607-
sortedInput = true,
608-
errorOnValueNotExists = false,
609-
)
610-
.expect("ok")
602+
let dataRes =
603+
db.multiGet(@[keyValue1, keyValue2, keyValue3], sortedInput = true).expect("ok")
611604
check:
612605
dataRes.len() == 3
613-
dataRes[0] == keyValue1
614-
dataRes[1] == keyValue2
615-
dataRes[2] == default(seq[byte])
606+
dataRes[0] == Opt.some(keyValue1)
607+
dataRes[1] == Opt.some(keyValue2)
608+
dataRes[2] == Opt.none(seq[byte])
616609

617610
block:
618611
let
@@ -621,15 +614,15 @@ suite "RocksDbRef Tests":
621614
keyValue1, keyValue2, keyValue3, keyValue4, keyValue5, keyValue6, keyValue7,
622615
keyValue8, keyValue9,
623616
]
624-
dataRes = db.multiGet(keys, errorOnValueNotExists = false).expect("ok")
617+
dataRes = db.multiGet(keys).expect("ok")
625618
check:
626619
dataRes.len() == 9
627-
dataRes[0] == keyValue1
628-
dataRes[1] == keyValue2
629-
dataRes[2] == default(seq[byte])
630-
dataRes[3] == default(seq[byte])
631-
dataRes[4] == keyValue5
632-
dataRes[5] == default(seq[byte])
633-
dataRes[6] == keyValue7
634-
dataRes[7] == default(seq[byte])
635-
dataRes[8] == keyValue9
620+
dataRes[0] == Opt.some(keyValue1)
621+
dataRes[1] == Opt.some(keyValue2)
622+
dataRes[2] == Opt.none(seq[byte])
623+
dataRes[3] == Opt.none(seq[byte])
624+
dataRes[4] == Opt.some(keyValue5)
625+
dataRes[5] == Opt.none(seq[byte])
626+
dataRes[6] == Opt.some(keyValue7)
627+
dataRes[7] == Opt.none(seq[byte])
628+
dataRes[8] == Opt.some(keyValue9)

0 commit comments

Comments
 (0)