@@ -224,7 +224,7 @@ type SqliteDestroctor* = proc (p: pointer) {.cdecl.}
224
224
const StaticDestructor* = cast[SqliteDestroctor](0)
225
225
const TransientDestructor* = cast[SqliteDestroctor](-1)
226
226
227
- type SqliteDateType * = enum
227
+ type SqliteDataType * = enum
228
228
dt_integer = 1,
229
229
dt_float = 2,
230
230
dt_text = 3,
@@ -385,7 +385,9 @@ proc sqlite3_bind_pointer*(st: ptr RawStatement, idx: int, val: pointer, name: c
385
385
proc sqlite3_bind_zeroblob64*(st: ptr RawStatement, idx: int , len: int ): ResultCode {.sqlite3linkage.}
386
386
proc sqlite3_changes*(st: ptr RawDatabase): int {.sqlite3linkage.}
387
387
proc sqlite3_last_insert_rowid*(st: ptr RawDatabase): int {.sqlite3linkage.}
388
- proc sqlite3_column_type*(st: ptr RawStatement, idx: int ): SqliteDateType {.sqlite3linkage.}
388
+ proc sqlite3_column_count*(st: ptr RawStatement): int {.sqlite3linkage.}
389
+ proc sqlite3_column_type*(st: ptr RawStatement, idx: int ): SqliteDataType {.sqlite3linkage.}
390
+ proc sqlite3_column_name*(st: ptr RawStatement, idx: int ): cstring {.sqlite3linkage.}
389
391
proc sqlite3_column_blob*(st: ptr RawStatement, idx: int ): pointer {.sqlite3linkage.}
390
392
proc sqlite3_column_bytes*(st: ptr RawStatement, idx: int ): int {.sqlite3linkage.}
391
393
proc sqlite3_column_double*(st: ptr RawStatement, idx: int ): float64 {.sqlite3linkage.}
@@ -497,6 +499,9 @@ proc `[]=`*[T](st: ref Statement, idx: int, val: Option[T]) =
497
499
else:
498
500
st[idx] = val.get
499
501
502
+ proc `[]=`*[T](st: ref Statement, name: string , value: T) =
503
+ st[st.getParameterIndex(name ) ] = value
504
+
500
505
proc reset* (st: ref Statement) =
501
506
st.raw.sqliteCheck sqlite3_reset(st.raw)
502
507
@@ -515,7 +520,7 @@ proc withColumnBlob*(st: ref Statement, idx: int, recv: proc(vm: openarray[byte]
515
520
let l = sqlite3_column_bytes(st.raw, idx)
516
521
recv(cast [ptr UncheckedArray[byte ]](p).toOpenArray(0 , l))
517
522
518
- proc getColumnType* (st: ref Statement, idx: int ): SqliteDateType =
523
+ proc getColumnType* (st: ref Statement, idx: int ): SqliteDataType =
519
524
sqlite3_column_type(st.raw, idx)
520
525
521
526
proc getColumn* (st: ref Statement, idx: int , T: typedesc [seq [byte ]]): seq [byte ] =
@@ -542,6 +547,31 @@ proc getColumn*[T](st: ref Statement, idx: int, _: typedesc[Option[T]]): Option[
542
547
else:
543
548
some(st.getColumn(idx, T))
544
549
550
+ type ColumnDef* = object
551
+ st*: ref Statement
552
+ idx*: int
553
+ data_type*: SqliteDataType
554
+ name*: string
555
+
556
+ proc columns*(st: ref Statement): seq [ref ColumnDef] =
557
+ result = @[]
558
+ var idx = 0
559
+ let count = sqlite3_column_count(st.raw)
560
+ while idx < count:
561
+ let col = new(ColumnDef)
562
+ col.st = st
563
+ col.idx = idx
564
+ col.data_type = sqlite3_column_type(st.raw, idx)
565
+ col.name = $sqlite3_column_name(st.raw, idx)
566
+ result .add(col)
567
+ idx += 1
568
+
569
+ proc `[]`*(st: ref Statement, idx: int ): ref ColumnDef =
570
+ result = st.columns[idx]
571
+
572
+ proc `[]`*[T](col: ref ColumnDef, t: typedesc [T]): T =
573
+ result = col.st.getColumn(col.idx, t)
574
+
545
575
proc unpack*[T: tuple](st: ref Statement, _: typedesc [T]): T =
546
576
var idx = 0
547
577
for value in result .fields:
@@ -568,3 +598,10 @@ proc execM*(db: var Database, sqls: varargs[string]) {.discardable.} =
568
598
except CatchableError:
569
599
discard db.exec "ROLLBACK"
570
600
raise getCurrentException()
601
+
602
+ iterator rows*(st: ref Statement): seq [ref ColumnDef] =
603
+ try:
604
+ while st.step():
605
+ yield st.columns()
606
+ finally:
607
+ st.reset()
0 commit comments