Files
Baradb/clients/nim/ormin/ormin/query_hooks.nim
T
dimgigov 4e54075078
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
Add Ormin ORM support for BaraDB (Nim client)
2026-05-15 21:49:08 +03:00

55 lines
1.4 KiB
Nim

import options, json
type
DbValue*[T] = object
isNull*: bool
value*: T
template fromQueryHook*[T, S](val: var T, x: S) =
## Default conversion hook used by `query(T): ...`.
## Users can overload this proc to customize field/type conversions.
val = x
template toQueryHook*[T, S](val: var T, x: S) =
## Default conversion hook used for query parameters.
## Users can overload this proc to customize parameter conversions.
val = x
proc nullQueryValueError() {.noreturn.} =
raise newException(ValueError, "cannot map NULL query result")
proc fromQueryHook*[T, S](val: var Option[T], x: var DbValue[S]) =
if x.isNull:
val = none(T)
else:
var converted: T
fromQueryHook(converted, move x.value)
val = some(converted)
proc fromQueryHook*[T, S](val: var T, x: var DbValue[S]) =
if x.isNull:
when T is string:
val = ""
elif T is JsonNode:
val = newJNull()
else:
nullQueryValueError()
else:
fromQueryHook(val, move x.value)
proc bindFromQueryHook*[T, S](dest: var T, x: var DbValue[S]) =
fromQueryHook(dest, x)
proc toQueryHook*[S, T](val: var DbValue[S], x: Option[T]) =
if x.isSome:
val.isNull = false
toQueryHook(val.value, x.get)
else:
val.isNull = true
when compiles(val.value = default(S)):
val.value = default(S)
proc toQueryHook*[S, T](val: var DbValue[S], x: T) =
val.isNull = false
toQueryHook(val.value, x)