r9185: first effort at support field names in QUERY calls, still needs testing
[clsql.git] / db-postgresql / postgresql-sql.lisp
index dd15e86b17c383d37fb90354c5f1fe41f234ab11..2f0ae75ba19a38917cd5cba388426bd984975b7a 100644 (file)
   (setf (database-conn-ptr database) nil)
   t)
 
-(defmethod database-query (query-expression (database postgresql-database) result-types)
+(defmethod database-query (query-expression (database postgresql-database) result-types field-names)
   (let ((conn-ptr (database-conn-ptr database)))
     (declare (type pgsql-conn-def conn-ptr))
     (uffi:with-cstring (query-native query-expression)
                 (setq result-types
                   (canonicalize-types result-types num-fields
                                             result))
-                (loop for tuple-index from 0 below (PQntuples result)
-                      collect
-                      (loop for i from 0 below num-fields
-                            collect
-                            (if (zerop (PQgetisnull result tuple-index i))
-                                (convert-raw-field
-                                 (PQgetvalue result tuple-index i)
-                                 result-types i)
-                                nil)))))
+                 (values
+                  (loop for tuple-index from 0 below (PQntuples result)
+                        collect
+                        (loop for i from 0 below num-fields
+                              collect
+                              (if (zerop (PQgetisnull result tuple-index i))
+                                  (convert-raw-field
+                                   (PQgetvalue result tuple-index i)
+                                   result-types i)
+                                nil)))
+                  (when field-names
+                    (result-field-names num-fields result)))))
               (t
                (error 'clsql-sql-error
                       :database database
                               (PQresultErrorMessage result)))))
           (PQclear result))))))
 
+(defun result-field-names (num-fields result)
+  "Return list of result field names."
+  (let ((names '()))
+    (dotimes (i num-fields (nreverse names))
+      (declare (fixnum i))
+      (push (uffi:convert-from-foreign-string (PQfname res-ptr i)) names))))
+
 (defmethod database-execute-command (sql-expression
                                      (database postgresql-database))
   (let ((conn-ptr (database-conn-ptr database)))