mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-11 07:23:03 +00:00
Merge pull request #2866 from nanoant/patch/db-deffered-rows
db: InstantRow and instantRows
This commit is contained in:
@@ -16,6 +16,8 @@ type
|
||||
DbConn* = PSqlite3 ## encapsulates a database connection
|
||||
Row* = seq[string] ## a row of a dataset. NULL database values will be
|
||||
## transformed always to the empty string.
|
||||
InstantRow* = Pstmt ## a handle that can be used to get a row's column
|
||||
## text on demand
|
||||
EDb* = object of IOError ## exception that is raised if a database error occurs
|
||||
|
||||
SqlQuery* = distinct string ## an SQL query string
|
||||
@@ -109,6 +111,24 @@ iterator fastRows*(db: DbConn, query: SqlQuery,
|
||||
yield result
|
||||
if finalize(stmt) != SQLITE_OK: dbError(db)
|
||||
|
||||
iterator instantRows*(db: DbConn, query: SqlQuery,
|
||||
args: varargs[string, `$`]): InstantRow
|
||||
{.tags: [FReadDb].} =
|
||||
## same as fastRows but returns a handle that can be used to get column text
|
||||
## on demand using []. Returned handle is valid only within interator body.
|
||||
var stmt = setupQuery(db, query, args)
|
||||
while step(stmt) == SQLITE_ROW:
|
||||
yield stmt
|
||||
if finalize(stmt) != SQLITE_OK: dbError(db)
|
||||
|
||||
proc `[]`*(row: InstantRow, col: int32): string {.inline.} =
|
||||
## returns text for given column of the row
|
||||
$column_text(row, col)
|
||||
|
||||
proc len*(row: InstantRow): int32 {.inline.} =
|
||||
## returns number of columns in the row
|
||||
column_count(row)
|
||||
|
||||
proc getRow*(db: DbConn, query: SqlQuery,
|
||||
args: varargs[string, `$`]): Row {.tags: [FReadDb].} =
|
||||
## retrieves a single row. If the query doesn't return any rows, this proc
|
||||
@@ -216,5 +236,7 @@ when not defined(testing) and isMainModule:
|
||||
#db.query("insert into tbl1 values('goodbye', 20)")
|
||||
for r in db.rows(sql"select * from tbl1", []):
|
||||
echo(r[0], r[1])
|
||||
|
||||
for r in db.instantRows(sql"select * from tbl1", []):
|
||||
echo(r[0], r[1])
|
||||
|
||||
db_sqlite.close(db)
|
||||
|
||||
Reference in New Issue
Block a user