r11232: 16 Oct 2006 Kevin Rosenberg <kevin@rosenberg.net>
[clsql.git] / db-postgresql / postgresql-sql.lisp
index bcfda5ecb5ae6ee8b8e295927b3eeb8b8969b076..82f03e2454a0d63fff2ddfb4822fd96f31169d9d 100644 (file)
        (declare (type pgsql-conn-def connection))
        (when (not (eq (PQstatus connection) 
                       pgsql-conn-status-type#connection-ok))
-         (error 'sql-connection-error
-                :database-type database-type
-                :connection-spec connection-spec
-                :error-id (PQstatus connection)
-                :message (tidy-error-message 
-                          (PQerrorMessage connection))))
+          (let ((pqstatus (PQstatus connection))
+                (pqmessage (tidy-error-message (PQerrorMessage connection))))
+            (PQfinish connection)
+            (error 'sql-connection-error
+                   :database-type database-type
+                   :connection-spec connection-spec
+                   :error-id pqstatus
+                   :message  pqmessage)))
        (make-instance 'postgresql-database
                       :name (database-name-from-spec connection-spec
                                                      database-type)
                  :message (tidy-error-message (PQerrorMessage conn-ptr))))
         (unwind-protect
             (case (PQresultStatus result)
+             ;; User gave a command rather than a query 
+              (#.pgsql-exec-status-type#command-ok
+               nil)
               (#.pgsql-exec-status-type#empty-query
                nil)
               (#.pgsql-exec-status-type#tuples-ok
               (let ((num-fields (PQnfields result)))
-                (setq result-types
-                  (canonicalize-types result-types num-fields
-                                            result))
-                 (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)))))
+                (when result-types
+                  (setq result-types
+                    (canonicalize-types result-types num-fields
+                                        result)))
+                (let ((res (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)))))
+                  (if field-names
+                      (values res (result-field-names num-fields result))
+                    res))))
               (t
                (error 'sql-database-data-error
                       :database database
                (error 'sql-database-data-error
                       :database database
                       :expression sql-expression
-                      :error-id (PQresultStatus result)
+                      :error-id (PQresultErrorField result +PG-DIAG-SQLSTATE+)
                       :message (tidy-error-message
                                (PQresultErrorMessage result)))))
           (PQclear result))))))
 
 (defmethod database-probe (connection-spec (type (eql :postgresql)))
   (when (find (second connection-spec) (database-list connection-spec type)
-             :key #'car :test #'string-equal)
+              :test #'string-equal)
     t))
 
 
       (coerce-string user)
       (let ((connection (PQsetdbLogin host port options tty db user password)))
         (declare (type postgresql::pgsql-conn-ptr connection))
-        (unless (eq (PQstatus connection) :connection-ok)
+        (unless (eq (PQstatus connection)
+                   pgsql-conn-status-type#connection-ok)
           ;; Connect failed
           (error 'sql-connection-error
                  :database-type :postgresql
 
 ;;; 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-sys:database-type-library-loaded :postgresql)
   (clsql-sys:initialize-database-type :database-type :postgresql))