r9457: Reworked CLSQL file structure.
[clsql.git] / sql / conditions.lisp
1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:     conditions.lisp
6 ;;;; Purpose:  Error conditions for CLSQL
7 ;;;;
8 ;;;; $Id$
9 ;;;;
10 ;;;; This file, part of CLSQL, is Copyright (c) 2002-2004 by Kevin M. Rosenberg
11 ;;;;
12 ;;;; CLSQL users are granted the rights to distribute and use this software
13 ;;;; as governed by the terms of the Lisp Lesser GNU Public License
14 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
15 ;;;; *************************************************************************
16
17 (in-package #:clsql-sys)
18
19 (defvar *backend-warning-behavior* :warn
20   "Action to perform on warning messages from backend. Default is to :warn. May also be
21 set to :error to signal an error or :ignore/nil to silently ignore the warning.")
22
23 ;;; CommonSQL-compatible conditions
24  
25 (define-condition sql-condition ()
26   ())
27
28 (define-condition sql-error (simple-error)
29   ())
30
31 (define-condition sql-database-error (sql-error)
32   ((error-id :initarg :error-id 
33              :initform nil
34              :reader sql-error-error-id)
35    (secondary-error-id :initarg :secondary-error-id
36                        :initform nil
37                        :reader sql-error-secondary-error-id)
38    (database-message :initarg :message
39                      :initform nil
40                      :reader sql-error-database-message)
41    (database :initarg :database
42                      :initform nil
43                      :reader sql-error-database))
44   (:report (lambda (c stream)
45              (format stream "A database error occurred~A: ~A / ~A~%  ~A"
46                      (if (sql-error-database c)
47                          (format nil " on database ~A" (sql-error-database c))
48                          "")
49                      (sql-error-error-id c)
50                      (sql-error-secondary-error-id c)
51                      (sql-error-database-message c))))
52   (:documentation "Used to signal an error in a CLSQL database interface."))
53
54 (define-condition sql-connection-error (sql-database-error)
55   ((database-type :initarg :database-type :initform nil
56                   :reader sql-error-database-type)
57    (connection-spec :initarg :connection-spec :initform nil
58                   :reader sql-error-connection-spec))
59   (:report (lambda (c stream)
60              (format stream "While trying to connect to database ~A~%  using database-type ~A:~%  Error ~D / ~A~%  has occurred."
61                      (database-name-from-spec
62                       (sql-error-connection-spec c)
63                       (sql-error-database-type c))
64                      (sql-error-database-type c)
65                      (sql-error-error-id c)
66                      (sql-error-database-message c))))
67   (:documentation "Used to signal an error in connecting to a database."))
68
69 (define-condition sql-database-data-error (sql-database-error)
70   ((expression :initarg :expression :initarg nil 
71                :reader sql-error-expression))
72   (:report (lambda (c stream)
73              (format stream "While accessing database ~A~%  with expression ~S:~%  Error ~D / ~A~%  has occurred."
74                      (sql-error-database c)
75                      (sql-error-expression c)
76                      (sql-error-error-id c)
77                      (sql-error-database-message c))))
78   (:documentation "Used to signal an error with the SQL data
79   passed to a database."))
80
81 (define-condition sql-temporary-error (sql-database-error)
82   ()
83   (:documentation "Used to signal an error when the database
84 cannot currently process a valid interaction because, for
85 example, it is still executing another command possibly issued by
86 another user."))
87
88 (define-condition sql-timeout-error (sql-connection-error)
89   ()
90   (:documentation "Used to signal an error when the database
91 times out while processing some operation."))
92
93 (define-condition sql-fatal-error (sql-connection-error)
94   ()
95   (:documentation "Used to signal an error when the database
96 connection is no longer usable."))
97
98 (define-condition sql-user-error (sql-error)
99   ((message :initarg :message
100             :initform "Unspecified error"
101             :reader sql-user-error-message))
102   (:report (lambda (c stream)
103              (format stream "A CLSQL lisp code error occurred: ~A "
104                      (sql-user-error-message c))))
105   (:documentation  "Used to signal lisp errors inside CLSQL."))
106
107
108
109 ;; Signal conditions
110
111 (defun signal-closed-database-error (database)
112   (error 'sql-fatal-error
113          :database database
114          :message "Database is closed."))
115
116 (defun signal-no-database-error (database)
117   (error 'sql-database-error
118          :database database
119          :message (format nil "~A is not a database." database)))
120
121
122 ;;; CLSQL Extensions
123
124 (define-condition sql-warning (warning sql-condition)
125   ((message :initarg :message :reader sql-warning-message))
126   (:report (lambda (c stream)
127              (format stream (sql-warning-message c)))))
128
129 (define-condition sql-database-warning (sql-warning)
130   ((database :initarg :database :reader sql-warning-database))
131   (:report (lambda (c stream)
132              (format stream 
133                      "While accessing database ~A~%  Warning: ~A~%  has occurred."
134                      (sql-warning-database c)
135                      (sql-warning-message c)))))