+;;; 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 '())
+ #+ignore (field-vec (mysql-fetch-fields res-ptr)))
+ (dotimes (i num-fields)
+ (declare (fixnum i))
+ (let* ((field (mysql-fetch-field-direct res-ptr i))
+ #+ignore
+ (field-test (uffi:deref-array field-vec 'mysql-field-vector i))
+ (type (uffi:get-slot-value field 'mysql-field 'type)))
+ (push
+ (case type
+ ((#.mysql-field-types#tiny
+ #.mysql-field-types#short
+ #.mysql-field-types#int24
+ #.mysql-field-types#long)
+ :int)
+ ((#.mysql-field-types#double
+ #.mysql-field-types#float
+ #.mysql-field-types#decimal)
+ :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)))))
+