- query-expression)))
- ;;; To obtain column number/datatypes we have to read the first row.
- (multiple-value-bind (n-col cols col-names)
- (sqlite:sqlite-step vm)
- (let ((result-set (make-sqlite-result-set
- :vm vm
- :first-row cols
- :n-col n-col
- :col-names col-names
- :result-types
- (canonicalize-result-types
- result-types
- n-col
- col-names))))
- (if full-set
- (values result-set n-col nil)
- (values result-set n-col)))))
+ query-expression))
+ (rows '())
+ (col-names '()))
+ (unwind-protect
+ ;; Read the first row to get column number and names.
+ (multiple-value-bind (n-col new-row sqlite-col-names)
+ (sqlite:sqlite-step vm)
+ (declare (type sqlite:sqlite-row-pointer-type new-row))
+ (when (> n-col 0)
+ (when field-names
+ (setf col-names (loop for i from 0 below n-col
+ collect (sqlite:sqlite-aref sqlite-col-names i (encoding database)))))
+ (let ((canonicalized-result-types
+ (canonicalize-result-types result-types n-col sqlite-col-names database)))
+ (flet ((extract-row-data (row)
+ (declare (type sqlite:sqlite-row-pointer-type row))
+ (loop for i from 0 below n-col
+ collect (clsql-uffi:convert-raw-field
+ (sqlite:sqlite-raw-aref row i)
+ (nth i canonicalized-result-types)
+ :encoding (encoding database)))))
+ (push (extract-row-data new-row) rows)
+
+ ;; Read subsequent rows.
+ (do () (nil)
+ (multiple-value-bind (n-col new-row)
+ (sqlite:sqlite-step vm)
+ (declare (type sqlite:sqlite-row-pointer-type new-row))
+ (if (> n-col 0)
+ (push (extract-row-data new-row) rows)
+ (return))))))))
+ (sqlite:sqlite-finalize vm))
+ (values (nreverse rows) col-names))