summary refs log tree commit diff stats
path: root/tests/stdlib/tsqlitebindatas.nim
blob: 754c80ae1d3b0f1dfa344896abcf317833dd658c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
discard """
  action: "run"
  exitcode: 0
"""
import db_sqlite
import random
import os
from stdtest/specialpaths import buildDir

block tsqlitebindatas: ## db_sqlite binary data
  const dbName = buildDir / "tsqlitebindatas.db"

  let origName = "Bobby"
  var orig = newSeq[float64](150)
  randomize()
  for x in orig.mitems:
    x = rand(1.0)/10.0

  discard tryRemoveFile(dbName)
  let db = open(dbName, "", "", "")
  let createTableStr = sql"""CREATE TABLE test(
    id INTEGER NOT NULL PRIMARY KEY,
    name TEXT,
    data BLOB
  )
  """
  db.exec(createTableStr)

  var dbuf = newSeq[byte](orig.len*sizeof(float64))
  copyMem(unsafeAddr(dbuf[0]), unsafeAddr(orig[0]), dbuf.len)

  var insertStmt = db.prepare("INSERT INTO test (id, name, data) VALUES (?, ?, ?)")
  insertStmt.bindParams(1, origName, dbuf)
  let bres = db.tryExec(insertStmt)
  doAssert(bres)

  finalize(insertStmt)

  var nameTest = db.getValue(sql"SELECT name FROM test WHERE id = ?", 1)
  doAssert nameTest == origName

  var dataTest = db.getValue(sql"SELECT data FROM test WHERE id = ?", 1)
  let seqSize = int(dataTest.len*sizeof(byte)/sizeof(float64))
  var res: seq[float64] = newSeq[float64](seqSize)
  copyMem(unsafeAddr(res[0]), addr(dataTest[0]), dataTest.len)
  doAssert res.len == orig.len
  doAssert res == orig

  db.close()
  doAssert tryRemoveFile(dbName)


block:
  block:
    const dbName = buildDir / "db.sqlite3"
    var db = db_sqlite.open(dbName, "", "", "")
    var witness = false
    try:
      db.exec(sql("CREATE TABLE table1 (url TEXT, other_field INT);"))
      db.exec(sql("REPLACE INTO table (url, another_field) VALUES (?, '123');"))
    except DbError as e:
      witness = true
      doAssert e.msg == "The number of \"?\" given exceeds the number of parameters present in the query."
    finally:
      db.close()
      removeFile(dbName)

    doAssert witness

  block:
    const dbName = buildDir / "db.sqlite3"
    var db = db_sqlite.open(dbName, "", "", "")
    try:
      db.exec(sql("CREATE TABLE table1 (url TEXT, other_field INT);"))
      db.exec(sql("INSERT INTO table1 (url, other_field) VALUES (?, ?);"), "http://domain.com/test?param=1", 123)
    finally:
      db.close()
      removeFile(dbName)