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))))))))