r9403: Rework conditions to be CommonSQL backward compatible
[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-database-error (simple-error sql-condition)
29   ((error-id :initarg :error-id 
30              :initform nil
31              :reader sql-error-error-id)
32    (secondary-error-id :initarg :secondary-error-id
33                        :initform nil
34                        :reader sql-error-secondary-error-id)
35    (database-message :initarg :message
36                      :initform nil
37                      :reader sql-error-database-message)
38    (database :initarg :database
39                      :initform nil
40                      :reader sql-error-database))
41   (:report (lambda (c stream)
42              (format stream "A database error occurred: ~A / ~A~%  ~A"
43                      (if (sql-error-database c)
44                          (format nil " on database ~A" (sql-error-database c))
45                          "")
46                      (sql-error-error-id c)
47                      (sql-error-secondary-error-id c)
48                      (sql-error-database-message c)))))
49
50 (define-condition sql-connection-error (sql-database-error)
51   ((database-type :initarg :database-type :initform nil
52                   :reader sql-error-database-type)
53    (connection-spec :initarg :connection-spec :initform nil
54                   :reader sql-error-connection-spec))
55   (:report (lambda (c stream)
56              (format stream "While trying to connect to database ~A~%  using database-type ~A:~%  Error ~D / ~A~%  has occurred."
57                      (database-name-from-spec
58                       (sql-error-connection-spec c)
59                       (sql-error-database-type c))
60                      (sql-error-database-type c)
61                      (sql-error-error-id c)
62                      (sql-error-database-message c)))))
63
64 (define-condition sql-database-data-error (sql-database-error)
65   ((expression :initarg :expression :initarg nil 
66                :reader sql-error-expression))
67   (:report (lambda (c stream)
68              (format stream "While accessing database ~A~%  with expression ~S:~%  Error ~D / ~A~%  has occurred."
69                      (sql-error-database c)
70                      (sql-error-expression c)
71                      (sql-error-error-id c)
72                      (sql-error-database-message c)))))
73
74 (define-condition sql-temporary-error (sql-database-error)
75   ())
76
77 (define-condition sql-user-error (simple-error sql-condition)
78   ((message :initarg :message
79             :initform "Unspecified error"
80             :reader sql-user-error-message))
81   (:report (lambda (c stream)
82              (format stream "A CLSQL lisp code error occurred: ~A "
83                      (sql-user-error-message c)))))
84
85
86 ;; Signal conditions
87
88 (defun signal-closed-database-error (database)
89   (cerror 'sql-connection-error
90           :message
91           (format nil "Trying to perform operation on closed database ~A."
92                   database)))
93
94 (defun signal-no-database-error (database)
95   (error 'sql-database-error 
96          :message "Not a database: ~A." database))
97
98
99 ;;; CLSQL Extensions
100
101 (define-condition sql-warning (warning sql-condition)
102   ((message :initarg :message :reader sql-warning-message))
103   (:report (lambda (c stream)
104              (format stream (sql-warning-message c)))))
105
106 (define-condition sql-database-warning (sql-warning)
107   ((database :initarg :database :reader sql-warning-database))
108   (:report (lambda (c stream)
109              (format stream 
110                      "While accessing database ~A~%  Warning: ~A~%  has occurred."
111                      (sql-warning-database c)
112                      (sql-warning-message c)))))