diff --git a/async_postgres/pg_types.nim b/async_postgres/pg_types.nim index cfedb3a..0546298 100644 --- a/async_postgres/pg_types.nim +++ b/async_postgres/pg_types.nim @@ -1,5 +1,6 @@ import std/[json, options, times] +import pg_protocol import pg_types/[core, encoding, decoding, accessors, user_types, ranges] export core, encoding, decoding, accessors, user_types, ranges @@ -207,3 +208,11 @@ nameAccessor(getNumMultirangeArrayOpt, Option[seq[PgMultirange[PgNumeric]]]) nameAccessor(getTsMultirangeArrayOpt, Option[seq[PgMultirange[DateTime]]]) nameAccessor(getTsTzMultirangeArrayOpt, Option[seq[PgMultirange[DateTime]]]) nameAccessor(getDateMultirangeArrayOpt, Option[seq[PgMultirange[DateTime]]]) + +# Generic Option[T] dispatch: delegates to the bare `get(col, T)` plus a NULL +# check, so every bare type overload automatically gains an Option counterpart. +proc get*[T](row: Row, col: int, _: typedesc[Option[T]]): Option[T] = + if row.isNull(col): + none(T) + else: + some(row.get(col, T)) diff --git a/async_postgres/pg_types/accessors.nim b/async_postgres/pg_types/accessors.nim index 37a49d9..8685bac 100644 --- a/async_postgres/pg_types/accessors.nim +++ b/async_postgres/pg_types/accessors.nim @@ -1807,6 +1807,12 @@ proc get*(row: Row, col: int, T: typedesc[PgXml]): PgXml = proc get*(row: Row, col: int, T: typedesc[PgBit]): PgBit = row.getBit(col) +proc get*(row: Row, col: int, T: typedesc[PgTime]): PgTime = + row.getTime(col) + +proc get*(row: Row, col: int, T: typedesc[PgTimeTz]): PgTimeTz = + row.getTimeTz(col) + proc get*(row: Row, col: int, T: typedesc[PgHstore]): PgHstore = row.getHstore(col) @@ -1857,6 +1863,9 @@ proc get*(row: Row, col: int, T: typedesc[seq[bool]]): seq[bool] = proc get*(row: Row, col: int, T: typedesc[seq[string]]): seq[string] = row.getStrArray(col) +proc get*(row: Row, col: int, T: typedesc[seq[seq[byte]]]): seq[seq[byte]] = + row.getBytesArray(col) + proc get*(row: Row, col: int, T: typedesc[seq[PgBit]]): seq[PgBit] = row.getBitArray(col) @@ -1926,6 +1935,29 @@ proc get*(row: Row, col: int, T: typedesc[seq[PgTsQuery]]): seq[PgTsQuery] = proc get*(row: Row, col: int, T: typedesc[seq[PgHstore]]): seq[PgHstore] = row.getHstoreArray(col) +# Per-element Option array types + +proc get*(row: Row, col: int, T: typedesc[seq[Option[int16]]]): seq[Option[int16]] = + row.getInt16ArrayElemOpt(col) + +proc get*(row: Row, col: int, T: typedesc[seq[Option[int32]]]): seq[Option[int32]] = + row.getIntArrayElemOpt(col) + +proc get*(row: Row, col: int, T: typedesc[seq[Option[int64]]]): seq[Option[int64]] = + row.getInt64ArrayElemOpt(col) + +proc get*(row: Row, col: int, T: typedesc[seq[Option[float32]]]): seq[Option[float32]] = + row.getFloat32ArrayElemOpt(col) + +proc get*(row: Row, col: int, T: typedesc[seq[Option[float64]]]): seq[Option[float64]] = + row.getFloatArrayElemOpt(col) + +proc get*(row: Row, col: int, T: typedesc[seq[Option[bool]]]): seq[Option[bool]] = + row.getBoolArrayElemOpt(col) + +proc get*(row: Row, col: int, T: typedesc[seq[Option[string]]]): seq[Option[string]] = + row.getStrArrayElemOpt(col) + proc columnIndex*(fields: seq[FieldDescription], name: string): int = ## Find the index of a column by name. Raises PgTypeError if not found. for i, f in fields: diff --git a/async_postgres/pg_types/ranges.nim b/async_postgres/pg_types/ranges.nim index 3924cc1..0aee3c3 100644 --- a/async_postgres/pg_types/ranges.nim +++ b/async_postgres/pg_types/ranges.nim @@ -1489,6 +1489,17 @@ proc get*( ): PgMultirange[PgNumeric] = row.getNumMultirange(col) +proc get*(row: Row, col: int, T: typedesc[seq[PgRange[int32]]]): seq[PgRange[int32]] = + row.getInt4RangeArray(col) + +proc get*(row: Row, col: int, T: typedesc[seq[PgRange[int64]]]): seq[PgRange[int64]] = + row.getInt8RangeArray(col) + +proc get*( + row: Row, col: int, T: typedesc[seq[PgRange[PgNumeric]]] +): seq[PgRange[PgNumeric]] = + row.getNumRangeArray(col) + proc get*( row: Row, col: int, T: typedesc[seq[PgMultirange[int32]]] ): seq[PgMultirange[int32]] =