@@ -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