r9335: Automated commit for Debian build of clsql upstream-version-2.10.16
[clsql.git] / base / conditions.lisp
index d5a918ade3ad10388a10d906cc8d4c0ee04cbd75..6b7d971d6cf3df623922b11c06e7aeadeaa87fff 100644 (file)
 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
 ;;;; *************************************************************************
 
-(in-package #:clsql-base-sys)
+(in-package #:clsql-base)
+
+(defvar *backend-warning-behavior* :warn
+  "Action to perform on warning messages from backend. Default is to :warn. May also be
+set to :error to signal an error or :ignore/nil to silently ignore the warning.")
 
 ;;; Conditions
 (define-condition clsql-condition ()
 (define-condition clsql-simple-warning (simple-condition clsql-warning)
   ())
 
+(define-condition clsql-generic-error (clsql-error)
+  ((message :initarg :message
+           :reader clsql-generic-error-message))
+  (:report (lambda (c stream)
+            (format stream (clsql-generic-error-message c)))))
+
 (define-condition clsql-invalid-spec-error (clsql-error)
   ((connection-spec :initarg :connection-spec
                    :reader clsql-invalid-spec-error-connection-spec)
@@ -88,15 +98,20 @@ and signal an clsql-invalid-spec-error if they don't match."
 
 (define-condition clsql-sql-error (clsql-error)
   ((database :initarg :database :reader clsql-sql-error-database)
-   (expression :initarg :expression :reader clsql-sql-error-expression)
-   (errno :initarg :errno :reader clsql-sql-error-errno)
-   (error :initarg :error :reader clsql-sql-error-error))
+   (message :initarg :message :initform nil :reader clsql-sql-error-message)
+   (expression :initarg :expression :initarg nil :reader clsql-sql-error-expression)
+   (errno :initarg :errno :initarg nil :reader clsql-sql-error-errno)
+   (error :initarg :error :initarg nil :reader clsql-sql-error-error))
   (:report (lambda (c stream)
-            (format stream "While accessing database ~A~%  with expression ~S:~%  Error ~D / ~A~%  has occurred."
-                    (clsql-sql-error-database c)
-                    (clsql-sql-error-expression c)
-                    (clsql-sql-error-errno c)
-                    (clsql-sql-error-error c)))))
+            (if (clsql-sql-error-message c)
+                (format stream "While accessing database ~A~%, Error~%  ~A~%  has occurred."
+                        (clsql-sql-error-database c)
+                        (clsql-sql-error-message c))
+              (format stream "While accessing database ~A~%  with expression ~S:~%  Error ~D / ~A~%  has occurred."
+                      (clsql-sql-error-database c)
+                      (clsql-sql-error-expression c)
+                      (clsql-sql-error-errno c)
+                      (clsql-sql-error-error c))))))
 
 (define-condition clsql-database-warning (clsql-warning)
   ((database :initarg :database :reader clsql-database-warning-database)
@@ -145,12 +160,21 @@ and signal an clsql-invalid-spec-error if they don't match."
             (format stream "The database ~A has already been closed."
                     (clsql-closed-error-database c)))))
 
-(define-condition clsql-nodb-error (clsql-error)
-  ((database :initarg :database :reader clsql-nodb-error-database))
+(define-condition clsql-no-database-error (clsql-error)
+  ((database :initarg :database :reader clsql-no-database-error-database))
   (:report (lambda (c stream)
-            (format stream "No such database ~S is open." 
-                    (clsql-nodb-error-database c)))))
-
+            (format stream "~S is not a CLSQL database." 
+                    (clsql-no-database-error-database c)))))
+
+(define-condition clsql-odbc-error (clsql-error)
+  ((odbc-message :initarg :odbc-message
+                :reader clsql-odbc-error-message)
+   (sql-state :initarg :sql-state :initform nil
+             :reader clsql-odbc-error-sql-state))
+  (:report (lambda (c stream)
+            (format stream "[ODBC error] ~A; state: ~A"
+                    (clsql-odbc-error-message c)
+                    (clsql-odbc-error-sql-state c)))))
 
 ;; Signal conditions
 
@@ -160,14 +184,8 @@ and signal an clsql-invalid-spec-error if they don't match."
          'clsql-closed-error
          :database database))
 
-(defun signal-nodb-error (database)
-  (cerror "Ignore this error and return nil."
-         'clsql-nodb-error
-         :database database))
-
-(defun signal-no-database-error ()
-  (cerror "Ignore this error and return nil."
-         'clsql-nodb-error))
+(defun signal-no-database-error (database)
+  (error 'clsql-no-database-error :database database))
 
 (define-condition clsql-type-error (clsql-error clsql-condition)
   ((slotname :initarg :slotname
@@ -189,3 +207,4 @@ and signal an clsql-invalid-spec-error if they don't match."
   (:report (lambda (c stream)
             (format stream "Invalid SQL syntax: ~A"
                     (clsql-sql-syntax-error-reason c)))))
+