I had used this before.. and this correctly shows the NULL values for the
example which crashes in the higher level case. I don't yet see how that is
happening :)
import strutils, os
# NOTE: Some versions of the nim library have the wrong size for TFIELDS
import mysql
template mRaise(m: string) =
var e = new IOError
e.msg = m
raise e
template mRaise(con: PMySQL) =
var e = new IOError
e.msg = $ mysql.error(con)
raise e
template traceIt(m: string, doit: stmt): stmt =
echo "Trace: ", m
doit
proc showFields*(res: PRES) =
let fnum = int(mysql.numFields(res)) # cast string to int
#var fnames: seq[string]
#newSeq(fnames, fnum)
for i in 0.. <fnum:
let fp = mysql.fetch_field_direct(res, cast[cint](i))
case fp.ftype
of FIELD_TYPE_VAR_STRING: echo i, " ", fp.name, " (vstring)"
of FIELD_TYPE_STRING: echo i, " ", fp.name, " (string)"
of FIELD_TYPE_LONG: echo i, " ", fp.name, " (int32)"
of FIELD_TYPE_INT24: echo i, " ", fp.name, " (int24)"
of FIELD_TYPE_TINY: echo i, " ", fp.name, " (int8)"
of FIELD_TYPE_DECIMAL: echo i, " ", fp.name, " (decimal)"
of FIELD_TYPE_TIMESTAMP: echo i, " ", fp.name, " (timestamp)"
of FIELD_TYPE_DATE: echo i, " ", fp.name, " (date)"
of FIELD_TYPE_BLOB: echo i, " ", fp.name, " (binary)"
else: echo i, " ", fp.name, " (", fp.ftype, ")!!!!!!!!!!!!!!!!!!"
#fnames.add ($fp.name)
let con: PMySQL = mysql.init(nil)
if con == nil: mRaise "init failed"
if mysql.realConnect(con, "localhost", "root", "", "test", 0, nil, 0) ==
nil:
defer: traceIt "close con", mysql.close(con)
mRaise con
let q = "SELECT * FROM data"
if mysql.realQuery(con, q, q.len) != 0: mRaise con
#var res = mysql.storeResult(con)
var res = mysql.useResult(con)
if res != nil:
showFields res
#var f = cast[ptr array[2, TFIELD]](mysql.fetch_fields(res))
#quit 0
#echo res.row_count
#echo mysql.affected_rows con
#echo mysql.num_rows res
var row: cstringArray
while true:
row = mysql.fetchRow(res)
if row == nil: break
let fnum = int(mysql.numFields(res)) # cast string to int
for i in 0.. <fnum:
if row[i] == nil:
echo "NULL"
else:
echo row[i]
if row != nil:
while mysql.fetchRow(res) != nil: discard
mysql.freeResult(res)