+;;; Field conversion functions
+
+(defun canonicalize-field-types (types num-fields res-ptr)
+ (cond
+ ((if (listp types)
+ (let ((length-types (length types))
+ (new-types '()))
+ (loop for i from 0 below num-fields
+ do
+ (if (>= i length-types)
+ (push t new-types) ;; types is shorted than num-fields
+ (push
+ (case (nth i types)
+ ((:int :long :double t)
+ (nth i types))
+ (t
+ t))
+ new-types)))
+ (nreverse new-types))))
+ ((eq types :auto)
+ (let ((new-types '()))
+ (dotimes (i num-fields)
+ (declare (fixnum i))
+ (let* ((type (PQftype res-ptr i)))
+ (push
+ (case type
+ ((#.pgsql-ftype#bytea
+ #.pgsql-ftype#int2
+ #.pgsql-ftype#int4)
+ :int)
+ ((#.pgsql-ftype#float4
+ #.pgsql-ftype#float8)
+ :double)
+ (otherwise
+ t))
+ new-types)))
+ (nreverse new-types)))
+ (t
+ nil)))
+
+
+(uffi:def-function "atoi"
+ ((str :cstring))
+ :returning :int)
+
+(uffi:def-function "atol"
+ ((str :cstring))
+ :returning :long)
+
+(uffi:def-function "atof"
+ ((str :cstring))
+ :returning :double)
+
+(defun convert-raw-field (char-ptr types index)
+ (let ((type (if (listp types)
+ (nth index types)
+ types)))
+ (case type
+ (:int
+ (atoi char-ptr))
+ (:long
+ (atol char-ptr))
+ (:double
+ (atof char-ptr))
+ (otherwise
+ (uffi:convert-from-foreign-string char-ptr)))))
+