summary refs log tree commit diff stats
path: root/lib/impure/db_sqlite.nim
diff options
context:
space:
mode:
Diffstat (limited to 'lib/impure/db_sqlite.nim')
-rw-r--r--lib/impure/db_sqlite.nim411
1 files changed, 203 insertions, 208 deletions
diff --git a/lib/impure/db_sqlite.nim b/lib/impure/db_sqlite.nim
index 5e648d097..f4661c9e1 100644
--- a/lib/impure/db_sqlite.nim
+++ b/lib/impure/db_sqlite.nim
@@ -26,79 +26,78 @@
 ## That is, using the `?` (question mark) to signify the place where a
 ## value should be placed. For example:
 ##
-## .. code-block:: Nim
-##
-##    sql"INSERT INTO my_table (colA, colB, colC) VALUES (?, ?, ?)"
+##   ```Nim
+##   sql"INSERT INTO my_table (colA, colB, colC) VALUES (?, ?, ?)"
+##   ```
 ##
 ## Opening a connection to a database
 ## ----------------------------------
 ##
-## .. code-block:: Nim
-##
-##    import std/db_sqlite
+##   ```Nim
+##   import std/db_sqlite
 ##
-##    # user, password, database name can be empty.
-##    # These params are not used on db_sqlite module.
-##    let db = open("mytest.db", "", "", "")
-##    db.close()
+##   # user, password, database name can be empty.
+##   # These params are not used on db_sqlite module.
+##   let db = open("mytest.db", "", "", "")
+##   db.close()
+##   ```
 ##
 ## Creating a table
 ## ----------------
 ##
-## .. code-block:: Nim
-##
-##    db.exec(sql"DROP TABLE IF EXISTS my_table")
-##    db.exec(sql"""CREATE TABLE my_table (
-##                     id   INTEGER,
-##                     name VARCHAR(50) NOT NULL
-##                  )""")
+##   ```Nim
+##   db.exec(sql"DROP TABLE IF EXISTS my_table")
+##   db.exec(sql"""CREATE TABLE my_table (
+##                    id   INTEGER,
+##                    name VARCHAR(50) NOT NULL
+##                 )""")
+##   ```
 ##
 ## Inserting data
 ## --------------
 ##
-## .. code-block:: Nim
-##
-##    db.exec(sql"INSERT INTO my_table (id, name) VALUES (0, ?)",
-##            "Jack")
+##   ```Nim
+##   db.exec(sql"INSERT INTO my_table (id, name) VALUES (0, ?)",
+##           "Jack")
+##   ```
 ##
 ## Larger example
 ## --------------
 ##
-## .. code-block:: nim
-##
-##    import std/[db_sqlite, math]
+##   ```Nim
+##   import std/[db_sqlite, math]
 ##
-##    let db = open("mytest.db", "", "", "")
+##   let db = open("mytest.db", "", "", "")
 ##
-##    db.exec(sql"DROP TABLE IF EXISTS my_table")
-##    db.exec(sql"""CREATE TABLE my_table (
-##                     id    INTEGER PRIMARY KEY,
-##                     name  VARCHAR(50) NOT NULL,
-##                     i     INT(11),
-##                     f     DECIMAL(18, 10)
-##                  )""")
+##   db.exec(sql"DROP TABLE IF EXISTS my_table")
+##   db.exec(sql"""CREATE TABLE my_table (
+##                    id    INTEGER PRIMARY KEY,
+##                    name  VARCHAR(50) NOT NULL,
+##                    i     INT(11),
+##                    f     DECIMAL(18, 10)
+##                 )""")
 ##
-##    db.exec(sql"BEGIN")
-##    for i in 1..1000:
-##      db.exec(sql"INSERT INTO my_table (name, i, f) VALUES (?, ?, ?)",
-##              "Item#" & $i, i, sqrt(i.float))
-##    db.exec(sql"COMMIT")
+##   db.exec(sql"BEGIN")
+##   for i in 1..1000:
+##     db.exec(sql"INSERT INTO my_table (name, i, f) VALUES (?, ?, ?)",
+##             "Item#" & $i, i, sqrt(i.float))
+##   db.exec(sql"COMMIT")
 ##
-##    for x in db.fastRows(sql"SELECT * FROM my_table"):
-##      echo x
+##   for x in db.fastRows(sql"SELECT * FROM my_table"):
+##     echo x
 ##
-##    let id = db.tryInsertId(sql"""INSERT INTO my_table (name, i, f)
-##                                  VALUES (?, ?, ?)""",
-##                            "Item#1001", 1001, sqrt(1001.0))
-##    echo "Inserted item: ", db.getValue(sql"SELECT name FROM my_table WHERE id=?", id)
+##   let id = db.tryInsertId(sql"""INSERT INTO my_table (name, i, f)
+##                                 VALUES (?, ?, ?)""",
+##                           "Item#1001", 1001, sqrt(1001.0))
+##   echo "Inserted item: ", db.getValue(sql"SELECT name FROM my_table WHERE id=?", id)
 ##
-##    db.close()
+##   db.close()
+##   ```
 ##
 ## Storing binary data example
 ##----------------------------
 ##
-## .. code-block:: nim
-##
+##   ```nim
 ##   import std/random
 ##
 ##   ## Generate random float datas
@@ -144,6 +143,7 @@
 ##     doAssert res == orig
 ##
 ##   db.close()
+##   ```
 ##
 ##
 ## Note
@@ -187,13 +187,12 @@ proc dbError*(db: DbConn) {.noreturn.} =
   ## Raises a `DbError` exception.
   ##
   ## **Examples:**
-  ##
-  ## .. code-block:: Nim
-  ##
-  ##    let db = open("mytest.db", "", "", "")
-  ##    if not db.tryExec(sql"SELECT * FROM not_exist_table"):
-  ##      dbError(db)
-  ##    db.close()
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
+  ##   if not db.tryExec(sql"SELECT * FROM not_exist_table"):
+  ##     dbError(db)
+  ##   db.close()
+  ##   ```
   var e: ref DbError
   new(e)
   e.msg = $sqlite3.errmsg(db)
@@ -227,13 +226,12 @@ proc tryExec*(db: DbConn, query: SqlQuery,
   ## Tries to execute the query and returns `true` if successful, `false` otherwise.
   ##
   ## **Examples:**
-  ##
-  ## .. code-block:: Nim
-  ##
-  ##    let db = open("mytest.db", "", "", "")
-  ##    if not db.tryExec(sql"SELECT * FROM my_table"):
-  ##      dbError(db)
-  ##    db.close()
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
+  ##   if not db.tryExec(sql"SELECT * FROM my_table"):
+  ##     dbError(db)
+  ##   db.close()
+  ##   ```
   assert(not db.isNil, "Database not connected.")
   var q = dbFormat(query, args)
   var stmt: sqlite3.PStmt
@@ -259,17 +257,16 @@ proc exec*(db: DbConn, query: SqlQuery, args: varargs[string, `$`])  {.
   ## Executes the query and raises a `DbError` exception if not successful.
   ##
   ## **Examples:**
-  ##
-  ## .. code-block:: Nim
-  ##
-  ##    let db = open("mytest.db", "", "", "")
-  ##    try:
-  ##      db.exec(sql"INSERT INTO my_table (id, name) VALUES (?, ?)",
-  ##              1, "item#1")
-  ##    except:
-  ##      stderr.writeLine(getCurrentExceptionMsg())
-  ##    finally:
-  ##      db.close()
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
+  ##   try:
+  ##     db.exec(sql"INSERT INTO my_table (id, name) VALUES (?, ?)",
+  ##             1, "item#1")
+  ##   except:
+  ##     stderr.writeLine(getCurrentExceptionMsg())
+  ##   finally:
+  ##     db.close()
+  ##   ```
   if not tryExec(db, query, args): dbError(db)
 
 proc newRow(L: int): Row =
@@ -310,24 +307,24 @@ iterator fastRows*(db: DbConn, query: SqlQuery,
   ##
   ## **Examples:**
   ##
-  ## .. code-block:: Nim
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
   ##
-  ##    let db = open("mytest.db", "", "", "")
+  ##   # Records of my_table:
+  ##   # | id | name     |
+  ##   # |----|----------|
+  ##   # |  1 | item#1   |
+  ##   # |  2 | item#2   |
   ##
-  ##    # Records of my_table:
-  ##    # | id | name     |
-  ##    # |----|----------|
-  ##    # |  1 | item#1   |
-  ##    # |  2 | item#2   |
-  ##
-  ##    for row in db.fastRows(sql"SELECT id, name FROM my_table"):
-  ##      echo row
+  ##   for row in db.fastRows(sql"SELECT id, name FROM my_table"):
+  ##     echo row
   ##
-  ##    # Output:
-  ##    # @["1", "item#1"]
-  ##    # @["2", "item#2"]
+  ##   # Output:
+  ##   # @["1", "item#1"]
+  ##   # @["2", "item#2"]
   ##
-  ##    db.close()
+  ##   db.close()
+  ##   ```
   var stmt = setupQuery(db, query, args)
   var L = (column_count(stmt))
   var result = newRow(L)
@@ -359,8 +356,7 @@ iterator instantRows*(db: DbConn, query: SqlQuery,
   ##
   ## **Examples:**
   ##
-  ## .. code-block:: Nim
-  ##
+  ##   ```Nim
   ##    let db = open("mytest.db", "", "", "")
   ##
   ##    # Records of my_table:
@@ -383,6 +379,7 @@ iterator instantRows*(db: DbConn, query: SqlQuery,
   ##    # length:2
   ##
   ##    db.close()
+  ##    ```
   var stmt = setupQuery(db, query, args)
   try:
     while step(stmt) == SQLITE_ROW:
@@ -429,28 +426,28 @@ iterator instantRows*(db: DbConn; columns: var DbColumns; query: SqlQuery,
   ##
   ## **Examples:**
   ##
-  ## .. code-block:: Nim
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
   ##
-  ##    let db = open("mytest.db", "", "", "")
+  ##   # Records of my_table:
+  ##   # | id | name     |
+  ##   # |----|----------|
+  ##   # |  1 | item#1   |
+  ##   # |  2 | item#2   |
   ##
-  ##    # Records of my_table:
-  ##    # | id | name     |
-  ##    # |----|----------|
-  ##    # |  1 | item#1   |
-  ##    # |  2 | item#2   |
+  ##   var columns: DbColumns
+  ##   for row in db.instantRows(columns, sql"SELECT * FROM my_table"):
+  ##     discard
+  ##   echo columns[0]
   ##
-  ##    var columns: DbColumns
-  ##    for row in db.instantRows(columns, sql"SELECT * FROM my_table"):
-  ##      discard
-  ##    echo columns[0]
+  ##   # Output:
+  ##   # (name: "id", tableName: "my_table", typ: (kind: dbNull,
+  ##   # notNull: false, name: "INTEGER", size: 0, maxReprLen: 0, precision: 0,
+  ##   # scale: 0, min: 0, max: 0, validValues: @[]), primaryKey: false,
+  ##   # foreignKey: false)
   ##
-  ##    # Output:
-  ##    # (name: "id", tableName: "my_table", typ: (kind: dbNull,
-  ##    # notNull: false, name: "INTEGER", size: 0, maxReprLen: 0, precision: 0,
-  ##    # scale: 0, min: 0, max: 0, validValues: @[]), primaryKey: false,
-  ##    # foreignKey: false)
-  ##
-  ##    db.close()
+  ##   db.close()
+  ##   ```
   var stmt = setupQuery(db, query, args)
   setColumns(columns, stmt)
   try:
@@ -490,28 +487,28 @@ proc getRow*(db: DbConn, query: SqlQuery,
   ##
   ## **Examples:**
   ##
-  ## .. code-block:: Nim
-  ##
-  ##    let db = open("mytest.db", "", "", "")
-  ##
-  ##    # Records of my_table:
-  ##    # | id | name     |
-  ##    # |----|----------|
-  ##    # |  1 | item#1   |
-  ##    # |  2 | item#2   |
-  ##
-  ##    doAssert db.getRow(sql"SELECT id, name FROM my_table"
-  ##                       ) == Row(@["1", "item#1"])
-  ##    doAssert db.getRow(sql"SELECT id, name FROM my_table WHERE id = ?",
-  ##                       2) == Row(@["2", "item#2"])
-  ##
-  ##    # Returns empty.
-  ##    doAssert db.getRow(sql"INSERT INTO my_table (id, name) VALUES (?, ?)",
-  ##                       3, "item#3") == @[]
-  ##    doAssert db.getRow(sql"DELETE FROM my_table WHERE id = ?", 3) == @[]
-  ##    doAssert db.getRow(sql"UPDATE my_table SET name = 'ITEM#1' WHERE id = ?",
-  ##                       1) == @[]
-  ##    db.close()
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
+  ##
+  ##   # Records of my_table:
+  ##   # | id | name     |
+  ##   # |----|----------|
+  ##   # |  1 | item#1   |
+  ##   # |  2 | item#2   |
+  ##
+  ##   doAssert db.getRow(sql"SELECT id, name FROM my_table"
+  ##                      ) == Row(@["1", "item#1"])
+  ##   doAssert db.getRow(sql"SELECT id, name FROM my_table WHERE id = ?",
+  ##                      2) == Row(@["2", "item#2"])
+  ##
+  ##   # Returns empty.
+  ##   doAssert db.getRow(sql"INSERT INTO my_table (id, name) VALUES (?, ?)",
+  ##                      3, "item#3") == @[]
+  ##   doAssert db.getRow(sql"DELETE FROM my_table WHERE id = ?", 3) == @[]
+  ##   doAssert db.getRow(sql"UPDATE my_table SET name = 'ITEM#1' WHERE id = ?",
+  ##                      1) == @[]
+  ##   db.close()
+  ##   ```
   var stmt = setupQuery(db, query, args)
   var L = (column_count(stmt))
   result = newRow(L)
@@ -525,18 +522,18 @@ proc getAllRows*(db: DbConn, query: SqlQuery,
   ##
   ## **Examples:**
   ##
-  ## .. code-block:: Nim
-  ##
-  ##    let db = open("mytest.db", "", "", "")
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
   ##
-  ##    # Records of my_table:
-  ##    # | id | name     |
-  ##    # |----|----------|
-  ##    # |  1 | item#1   |
-  ##    # |  2 | item#2   |
+  ##   # Records of my_table:
+  ##   # | id | name     |
+  ##   # |----|----------|
+  ##   # |  1 | item#1   |
+  ##   # |  2 | item#2   |
   ##
-  ##    doAssert db.getAllRows(sql"SELECT id, name FROM my_table") == @[Row(@["1", "item#1"]), Row(@["2", "item#2"])]
-  ##    db.close()
+  ##   doAssert db.getAllRows(sql"SELECT id, name FROM my_table") == @[Row(@["1", "item#1"]), Row(@["2", "item#2"])]
+  ##   db.close()
+  ##   ```
   result = @[]
   for r in fastRows(db, query, args):
     result.add(r)
@@ -554,24 +551,24 @@ iterator rows*(db: DbConn, query: SqlQuery,
   ##
   ## **Examples:**
   ##
-  ## .. code-block:: Nim
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
   ##
-  ##    let db = open("mytest.db", "", "", "")
+  ##   # Records of my_table:
+  ##   # | id | name     |
+  ##   # |----|----------|
+  ##   # |  1 | item#1   |
+  ##   # |  2 | item#2   |
   ##
-  ##    # Records of my_table:
-  ##    # | id | name     |
-  ##    # |----|----------|
-  ##    # |  1 | item#1   |
-  ##    # |  2 | item#2   |
+  ##   for row in db.rows(sql"SELECT id, name FROM my_table"):
+  ##     echo row
   ##
-  ##    for row in db.rows(sql"SELECT id, name FROM my_table"):
-  ##      echo row
+  ##   ## Output:
+  ##   ## @["1", "item#1"]
+  ##   ## @["2", "item#2"]
   ##
-  ##    ## Output:
-  ##    ## @["1", "item#1"]
-  ##    ## @["2", "item#2"]
-  ##
-  ##    db.close()
+  ##   db.close()
+  ##   ```
   for r in fastRows(db, query, args): yield r
 
 iterator rows*(db: DbConn, stmtName: SqlPrepared): Row
@@ -586,22 +583,22 @@ proc getValue*(db: DbConn, query: SqlQuery,
   ##
   ## **Examples:**
   ##
-  ## .. code-block:: Nim
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
   ##
-  ##    let db = open("mytest.db", "", "", "")
-  ##
-  ##    # Records of my_table:
-  ##    # | id | name     |
-  ##    # |----|----------|
-  ##    # |  1 | item#1   |
-  ##    # |  2 | item#2   |
+  ##   # Records of my_table:
+  ##   # | id | name     |
+  ##   # |----|----------|
+  ##   # |  1 | item#1   |
+  ##   # |  2 | item#2   |
   ##
-  ##    doAssert db.getValue(sql"SELECT name FROM my_table WHERE id = ?",
-  ##                         2) == "item#2"
-  ##    doAssert db.getValue(sql"SELECT id, name FROM my_table") == "1"
-  ##    doAssert db.getValue(sql"SELECT name, id FROM my_table") == "item#1"
+  ##   doAssert db.getValue(sql"SELECT name FROM my_table WHERE id = ?",
+  ##                        2) == "item#2"
+  ##   doAssert db.getValue(sql"SELECT id, name FROM my_table") == "1"
+  ##   doAssert db.getValue(sql"SELECT name, id FROM my_table") == "item#1"
   ##
-  ##    db.close()
+  ##   db.close()
+  ##   ```
   var stmt = setupQuery(db, query, args)
   if step(stmt) == SQLITE_ROW:
     let cb = column_bytes(stmt, 0)
@@ -643,14 +640,14 @@ proc tryInsertID*(db: DbConn, query: SqlQuery,
   ##
   ## **Examples:**
   ##
-  ## .. code-block:: Nim
-  ##
-  ##    let db = open("mytest.db", "", "", "")
-  ##    db.exec(sql"CREATE TABLE my_table (id INTEGER, name VARCHAR(50) NOT NULL)")
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
+  ##   db.exec(sql"CREATE TABLE my_table (id INTEGER, name VARCHAR(50) NOT NULL)")
   ##
-  ##    doAssert db.tryInsertID(sql"INSERT INTO not_exist_table (id, name) VALUES (?, ?)",
-  ##                            1, "item#1") == -1
-  ##    db.close()
+  ##   doAssert db.tryInsertID(sql"INSERT INTO not_exist_table (id, name) VALUES (?, ?)",
+  ##                           1, "item#1") == -1
+  ##   db.close()
+  ##   ```
   assert(not db.isNil, "Database not connected.")
   var q = dbFormat(query, args)
   var stmt: sqlite3.PStmt
@@ -674,21 +671,21 @@ proc insertID*(db: DbConn, query: SqlQuery,
   ##
   ## **Examples:**
   ##
-  ## .. code-block:: Nim
-  ##
-  ##    let db = open("mytest.db", "", "", "")
-  ##    db.exec(sql"CREATE TABLE my_table (id INTEGER, name VARCHAR(50) NOT NULL)")
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
+  ##   db.exec(sql"CREATE TABLE my_table (id INTEGER, name VARCHAR(50) NOT NULL)")
   ##
-  ##    for i in 0..2:
-  ##      let id = db.insertID(sql"INSERT INTO my_table (id, name) VALUES (?, ?)", i, "item#" & $i)
-  ##      echo "LoopIndex = ", i, ", InsertID = ", id
+  ##   for i in 0..2:
+  ##     let id = db.insertID(sql"INSERT INTO my_table (id, name) VALUES (?, ?)", i, "item#" & $i)
+  ##     echo "LoopIndex = ", i, ", InsertID = ", id
   ##
-  ##    # Output:
-  ##    # LoopIndex = 0, InsertID = 1
-  ##    # LoopIndex = 1, InsertID = 2
-  ##    # LoopIndex = 2, InsertID = 3
+  ##   # Output:
+  ##   # LoopIndex = 0, InsertID = 1
+  ##   # LoopIndex = 1, InsertID = 2
+  ##   # LoopIndex = 2, InsertID = 3
   ##
-  ##    db.close()
+  ##   db.close()
+  ##   ```
   result = tryInsertID(db, query, args)
   if result < 0: dbError(db)
 
@@ -713,19 +710,19 @@ proc execAffectedRows*(db: DbConn, query: SqlQuery,
   ##
   ## **Examples:**
   ##
-  ## .. code-block:: Nim
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
   ##
-  ##    let db = open("mytest.db", "", "", "")
+  ##   # Records of my_table:
+  ##   # | id | name     |
+  ##   # |----|----------|
+  ##   # |  1 | item#1   |
+  ##   # |  2 | item#2   |
   ##
-  ##    # Records of my_table:
-  ##    # | id | name     |
-  ##    # |----|----------|
-  ##    # |  1 | item#1   |
-  ##    # |  2 | item#2   |
+  ##   doAssert db.execAffectedRows(sql"UPDATE my_table SET name = 'TEST'") == 2
   ##
-  ##    doAssert db.execAffectedRows(sql"UPDATE my_table SET name = 'TEST'") == 2
-  ##
-  ##    db.close()
+  ##   db.close()
+  ##   ```
   exec(db, query, args)
   result = changes(db)
 
@@ -738,11 +735,10 @@ proc close*(db: DbConn) {.tags: [DbEffect].} =
   ## Closes the database connection.
   ##
   ## **Examples:**
-  ##
-  ## .. code-block:: Nim
-  ##
-  ##    let db = open("mytest.db", "", "", "")
-  ##    db.close()
+  ##   ```Nim
+  ##   let db = open("mytest.db", "", "", "")
+  ##   db.close()
+  ##   ```
   if sqlite3.close(db) != SQLITE_OK: dbError(db)
 
 proc open*(connection, user, password, database: string): DbConn {.
@@ -753,16 +749,15 @@ proc open*(connection, user, password, database: string): DbConn {.
   ## **Note:** Only the `connection` parameter is used for `sqlite`.
   ##
   ## **Examples:**
-  ##
-  ## .. code-block:: Nim
-  ##
-  ##    try:
-  ##      let db = open("mytest.db", "", "", "")
-  ##      ## do something...
-  ##      ## db.getAllRows(sql"SELECT * FROM my_table")
-  ##      db.close()
-  ##    except:
-  ##      stderr.writeLine(getCurrentExceptionMsg())
+  ##   ```Nim
+  ##   try:
+  ##     let db = open("mytest.db", "", "", "")
+  ##     ## do something...
+  ##     ## db.getAllRows(sql"SELECT * FROM my_table")
+  ##     db.close()
+  ##   except:
+  ##     stderr.writeLine(getCurrentExceptionMsg())
+  ##   ```
   var db: DbConn
   if sqlite3.open(connection, db) == SQLITE_OK:
     result = db