r9185: first effort at support field names in QUERY calls, still needs testing
[clsql.git] / db-postgresql / postgresql-sql.lisp
index 3d1eca3a2b614c4ec2a4d4576d22b72536514899..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)))
     (format nil " AND (NOT (relowner=1))"))
    (t "")))
 
-(defmethod database-list-objects-of-type ((database postgresql-database)
-                                          type owner)
+(defun database-list-objects-of-type (database type owner)
   (mapcar #'car
          (database-query
           (format nil
        (setf conn-ptr (%pg-database-connection connection-spec))
        database))))
 
+;;; Database capabilities
+
+(defmethod db-type-has-fancy-math? ((db-type (eql :postgresql)))
+  t)
+
+(defmethod db-type-default-case ((db-type (eql :postgresql)))
+  :lower)
+
 (when (clsql-base-sys:database-type-library-loaded :postgresql)
   (clsql-base-sys:initialize-database-type :database-type :postgresql))