bugfixes for the high-level postgreSQL wrapper

This commit is contained in:
Andreas Rumpf
2010-01-29 01:50:39 +01:00
parent 5eea125ba7
commit ecb5a8db99
8 changed files with 29 additions and 49 deletions

0
lib/devel/httpclient.nim Normal file → Executable file
View File

0
lib/devel/parseurl.nim Normal file → Executable file
View File

View File

@@ -21,7 +21,7 @@ proc dbError(db: TDbConn) {.noreturn.} =
## raises an EDb exception.
var e: ref EDb
new(e)
e.msg = PQerrorMessage(db)
e.msg = $PQerrorMessage(db)
raise e
proc dbError*(msg: string) {.noreturn.} =
@@ -31,17 +31,9 @@ proc dbError*(msg: string) {.noreturn.} =
e.msg = msg
raise e
when false:
proc dbQueryOpt*(db: TDbConn, query: string, args: openarray[string]) =
var stmt = mysql_stmt_init(db)
if stmt == nil: dbError(db)
if mysql_stmt_prepare(stmt, query, len(query)) != 0:
dbError(db)
var
bindings: seq[MYSQL_BIND]
discard mysql_stmt_close(stmt)
proc dbQuote(s: string): string =
#if s.len > 0 and allCharsInSet(s, {'0'..'9'}): result = s
#else:
result = "'"
for c in items(s):
if c == '\'': add(result, "''")
@@ -86,7 +78,8 @@ proc setupQuery(db: TDbConn, query: TSqlQuery,
proc setRow(res: PPGresult, r: var TRow, line, cols: int) =
for col in 0..cols-1:
setLen(r[col], 0)
add(r[col], PQgetvalue(res, line, cols))
var x = PQgetvalue(res, line, col)
add(r[col], x)
iterator dbFastRows*(db: TDbConn, query: TSqlQuery,
args: openarray[string]): TRow =
@@ -118,10 +111,8 @@ proc dbGetValue*(db: TDbConn, query: TSqlQuery,
## executes the query and returns the result dataset's the first column
## of the first row. Returns "" if the dataset contains no rows. This uses
## `dbFastRows`, so it inherits its fragile behaviour.
result = ""
for row in dbFastRows(db, query, args):
result = row[0]
break
var x = PQgetvalue(setupQuery(db, query, args), 0, 0)
result = if isNil(x): "" else: $x
proc dbTryInsertID*(db: TDbConn, query: TSqlQuery,
args: openarray[string]): int64 =
@@ -134,11 +125,6 @@ proc dbTryInsertID*(db: TDbConn, query: TSqlQuery,
result = ParseBiggestInt(val)
else:
result = -1
#if mysqlRealQuery(db, q, q.len) != 0'i32:
# result = -1'i64
#else:
# result = mysql_insert_id(db)
#LAST_INSERT_ID()
proc dbInsertID*(db: TDbConn, query: TSqlQuery,
args: openArray[string]): int64 =

View File

@@ -194,13 +194,15 @@ proc signalHandler(sig: cint) {.exportc: "signalHandler", noconv.} =
rawWriteStackTrace(buf)
if s == SIGINT: add(buf, "SIGINT: Interrupted by Ctrl-C.\n")
elif s == SIGSEGV: add(buf, "SIGSEGV: Illegal storage access.\n")
elif s == SIGSEGV:
add(buf, "SIGSEGV: Illegal storage access. (Attempt to read from nil?)\n")
elif s == SIGABRT:
if dbgAborting: return # the debugger wants to abort
add(buf, "SIGABRT: Abnormal termination.\n")
elif s == SIGFPE: add(buf, "SIGFPE: Arithmetic error.\n")
elif s == SIGILL: add(buf, "SIGILL: Illegal operation.\n")
elif s == SIGBUS: add(buf, "SIGBUS: Illegal storage access.\n")
elif s == SIGBUS:
add(buf, "SIGBUS: Illegal storage access. (Attempt to read from nil?)\n")
else: add(buf, "unknown signal\n")
writeToStdErr(buf)
dbgAborting = True # play safe here...

View File

@@ -51,7 +51,6 @@ proc readLine(f: TFile): string =
result = ""
rawReadLine(f, result)
proc write(f: TFile, s: string) = fputs(s, f)
proc write(f: TFile, i: int) =
when sizeof(int) == 8:
fprintf(f, "%lld", i)
@@ -167,6 +166,10 @@ proc writeChars(f: TFile, a: openarray[char], start, len: int): int =
proc writeBuffer(f: TFile, buffer: pointer, len: int): int =
result = fwrite(buffer, 1, len, f)
proc write(f: TFile, s: string) =
if writeBuffer(f, cstring(s), s.len) != s.len:
raise newException(EIO, "cannot write string to file")
proc setFilePos(f: TFile, pos: int64) =
if fseek(f, clong(pos), 0) != 0:
raise newException(EIO, "cannot set file position")

View File

@@ -1,5 +1,7 @@
Discuss Nimrod in our `forum <http://force7.de/heimdall>`_.
We also have a `Wiki <http://force7.de/niwiki>`_.
Visit our project page at Launchpad: https://launchpad.net/nimrod.
Bug reports: https://bugs.launchpad.net/nimrod.

View File

@@ -14,7 +14,9 @@ Bugfixes
- Fixed bug #502670 (underscores in identifiers).
- Fixed a bug in the ``parsexml`` module concerning the parsing of
``<tag attr="value" />``.
- ``system.write(f: TFile, s: string)`` now works even if ``s`` contains binary
zeros.
Additions
---------

View File

@@ -25,6 +25,12 @@ flexibility for speed. You get both.
this programming modell as convenient as possible
Why is it named Nimrod?
-----------------------
You have to find out for yourself. If you don't find a tongue-in-cheek
interpretation you have to look harder.
How is Nimrod licensed?
-----------------------
@@ -54,9 +60,9 @@ If you delete the line ``gcc.path = r"$nimrod\dist\mingw\bin"``, Nimrod uses
the GCC from your ``PATH`` environment variable.
If you cannot modify ``$nimrod\config\nimrod.cfg``, copy
``$nimrod\config\nimrod.cfg`` to ``$APPDATA\nimrod.cfg`` and modify
``$APPDATA\nimrod.cfg`` instead. To determine what ``$APPDATA`` means for your
Windows account, use the shell command::
``$nimrod\config\nimrod.cfg`` to ``%APPDATA%\nimrod.cfg`` and modify
``%APPDATA%\nimrod.cfg`` instead. To determine what ``%APPDATA%`` means for
your Windows account, use the shell command::
echo %APPDATA%
@@ -90,26 +96,5 @@ different command line arguments try the ``--passc`` and ``--passl`` switches.
Unsupported compilers contain serious bugs that keep them from bootstrapping
Nimrod.
The linker outputs strange errors about missing symbols
-------------------------------------------------------
I have seen this bug only with the GNU linker. The reason for this unknown.
Try recompiling your code with the ``--force_build`` command line switch.
Why is compilation so slow?
---------------------------
There are two reasons for this:
(1) Nimrod always recompiles **everything** (but only calls the C compiler for
modules that changed). In a future version, only modules that have changed
will be recompiled.
(2) The C compiler that is called by Nimrod may be slow.
Especially GCC's compile times are not very heady. On Linux you may be able
to get `Tiny C <http://bellard.org/tcc/>`_ to work. TCC has excellent
compile times. You should not use TCC for producing the release version
though, as it has no optimizer.
Note that from version 0.7.10 onwards the default build produces an optimized
binary.