diff --git a/src/kuzu/constants.nim b/src/kuzu/constants.nim index 3096b75..b4422b8 100644 --- a/src/kuzu/constants.nim +++ b/src/kuzu/constants.nim @@ -2,6 +2,7 @@ const KUZU_VERSION* = "0.2.0" const KUZU_EXPECTED_LIBVERSION* = "0.9.0" +const BLOB_MAXSIZE = 4096 let KUZU_DEFAULT_CONFIG* = kuzu_default_system_config() diff --git a/src/kuzu/value.nim b/src/kuzu/value.nim index 8f5675b..0f493e0 100644 --- a/src/kuzu/value.nim +++ b/src/kuzu/value.nim @@ -186,17 +186,20 @@ func `$`*( struct: KuzuStructValue ): string = result = $kuzu_value_to_string( addr struct.value.handle ) -# func toBlob*( value: KuzuValue ): array[ 4096, byte ] = -# ## Conversion from Kuzu type to Nim. -# if value.kind != KUZU_BLOB: -# raise newException( KuzuTypeError, &"Mismatched types: {value.kind} != blob" ) -# var rv: array[ 4096, byte ] -# assert( kuzu_value_get_blob( addr value.handle, addr rv[0] ) == KuzuSuccess ) -# return rv +proc toBlob*( value: KuzuValue ): seq[ byte ] = + ## Conversion from Kuzu type to Nim - returns a BLOB as a sequence of bytes. + if value.kind != KUZU_BLOB: + raise newException( KuzuTypeError, &"Mismatched types: {value.kind} != blob" ) + + result = @[] + var data: ptr byte + assert( kuzu_value_get_blob( addr value.handle, addr data ) == KuzuSuccess ) + + for idx in 0 .. BLOB_MAXSIZE: + var byte = cast[ptr byte](cast[uint](data) + idx.uint)[] + if byte == 0: break + result.add( byte ) + + kuzu_destroy_blob( data ) -#[ - BLOB - MAP -]# -