Re: clsql 5.1.1 with sqlite3 failing on OSX 64bit ccl - a BUGFIX?
JT Klein <[email protected]> Fri, 6 Aug 2010 00:37:03 +0000 (UTC)
| Newsgroups | gmane.lisp.clsql.general |
|---|---|
| Message-ID | <[email protected]> |
Further googling has turned up the following:
http://www.clozure.com/pipermail/openmcl-devel/2010-February/011214.html
It's a simple fix in clsql/uffi/clsql-uffi.lisp
I have clsql 5.1.1, which is the latest release on b9.com, and clsql-uffi.lisp
the git tree isn't modified as suggested by the link above, so I think this
bug (?) may be in the latest version.
It looks like problem is that uffi:convert-from-foreign-string is a
macro and the keyword arguments don't work at runtime, so
length/NIL-length and encoding/NIL-encoding
all need special tests in the code:
(defun convert-raw-field (char-ptr type &key length encoding)
(declare (optimize (speed 3) (safety 0) (space 0))
(type char-ptr-def char-ptr))
(cond
((uffi:null-pointer-p char-ptr)
nil)
(t
(case type
(:double
(atof char-ptr))
(:int
(atol char-ptr))
(:int32
(atoi char-ptr))
(:uint32
(strtoul char-ptr))
(:uint
(strtoul char-ptr))
((:int64 :uint64)
(uffi:with-foreign-object (high32-ptr :unsigned-int)
(let ((low32 (atol64 char-ptr high32-ptr))
(high32 (uffi:deref-pointer high32-ptr :unsigned-int)))
(if (zerop high32)
low32
(make-64-bit-integer high32 low32)))))
(:blob
(if length
(uffi:convert-from-foreign-usb8 char-ptr length)
(error "Can't return blob since length is not specified.")))
(t
(if encoding
(if length
(uffi:convert-from-foreign-string char-ptr
:null-terminated-p nil
:length length
:encoding encoding)
(uffi:convert-from-foreign-string char-ptr
:null-terminated-p t
:encoding encoding))
(if length
(uffi:convert-from-foreign-string char-ptr
:null-terminated-p nil
:length length)
(uffi:convert-from-foreign-string char-ptr
:null-terminated-p t))))))))