Index: combined/src/odbc/error-base.lisp
===================================================================
--- combined/src/odbc/error-base.lisp	(revision combined,2.2.5)
+++ combined/src/odbc/error-base.lisp	(revision combined,2.2.5)
@@ -0,0 +1,53 @@
+(in-package :plain-odbc)
+
+
+
+;;; Basics of ODBC-ERRORs
+
+(defgeneric print-odbc-error (condition stream))
+
+(define-condition odbc-error (error)
+  ((message :initarg :message :reader error-message)
+   (code :initarg :code :reader error-code))
+  (:report print-odbc-error))
+
+(defmethod print-odbc-error (condition stream)
+  (with-slots (message code) condition
+    (format stream "[ODBC error] ~a; state: ~a" message code)))
+
+
+
+;;; Extended error definitions
+
+(defvar *errors-by-codes* (make-hash-table :test 'equal))
+
+(defmacro define-odbc-error (code class)
+  `(progn
+     (define-condition ,class (odbc-error) ())
+     (export ',class)
+     (setf (gethash ,code *errors-by-codes*) ',class)))
+
+(defmacro define-odbc-errors (&body defs)
+  `(progn
+     ,@(mapcar (lambda (def)
+                 (destructuring-bind (code class) def
+                   `(define-odbc-error ,code ,class)))
+               defs)))
+
+
+
+;;; Error selection and signalling
+
+(defun error-type-for-state (state)
+  (gethash state *errors-by-codes* 'odbc-error))
+
+(defun make-error (state message)
+  (let ((type (error-type-for-state state)))
+    (make-condition type :message message :code state)))
+
+(defun read-and-throw-error (henv hdbc hstmt)
+  (multiple-value-bind (error-message sql-state)
+      (handle-error (or henv (cffi:null-pointer))
+                    (or hdbc (cffi:null-pointer))
+                    (or hstmt (cffi:null-pointer)))
+    (error (make-error sql-state error-message))))
Index: combined/src/odbc/error-defs.lisp
===================================================================
--- combined/src/odbc/error-defs.lisp	(revision combined,2.2.4)
+++ combined/src/odbc/error-defs.lisp	(revision combined,2.2.4)
@@ -0,0 +1,181 @@
+(in-package :plain-odbc)
+
+
+
+(define-odbc-errors
+  ("00000" odbc-successful-completion)
+  ("01000" odbc-warning)
+  ("01003" odbc-null-value-eliminated-in-set-function)
+  ("01004" odbc-string-data-right-truncation)
+  ("01006" odbc-privilege-not-revoked)
+  ("01007" odbc-privilege-not-granted)
+  ("01008" odbc-implicit-zero-bit-padding)
+  ("0100C" odbc-dynamic-result-sets-returned)
+  ("01P01" odbc-deprecated-feature)
+  ("02000" odbc-no-data)
+  ("02001" odbc-no-additional-dynamic-result-sets-returned)
+  ("03000" odbc-sql-statement-not-yet-complete)
+  ("08000" odbc-connection-exception)
+  ("08001" odbc-sqlclient-unable-to-establish-sqlconnection)
+  ("08003" odbc-connection-does-not-exist)
+  ("08004" odbc-sqlserver-rejected-establishment-of-sqlconnection)
+  ("08006" odbc-connection-failure)
+  ("08007" odbc-transaction-resolution-unknown)
+  ("08P01" odbc-protocol-violation)
+  ("09000" odbc-triggered-action-exception)
+  ("0A000" odbc-feature-not-supported)
+  ("0B000" odbc-invalid-transaction-initiation)
+  ("0F000" odbc-locator-exception)
+  ("0F001" odbc-invalid-locator-specification)
+  ("0L000" odbc-invalid-grantor)
+  ("0LP01" odbc-invalid-grant-operation)
+  ("0P000" odbc-invalid-role-specification)
+  ("21000" odbc-cardinality-violation)
+  ("22000" odbc-data-exception)
+  ("22001" odbc-string-data-right-truncation)
+  ("22002" odbc-null-value-no-indicator-parameter)
+  ("22003" odbc-numeric-value-out-of-range)
+  ("22004" odbc-null-value-not-allowed)
+  ("22005" odbc-error-in-assignment)
+  ("22007" odbc-invalid-datetime-format)
+  ("22008" odbc-datetime-field-overflow)
+  ("22009" odbc-invalid-time-zone-displacement-value)
+  ("2200B" odbc-escape-character-conflict)
+  ("2200C" odbc-invalid-use-of-escape-character)
+  ("2200D" odbc-invalid-escape-octet)
+  ("2200F" odbc-zero-length-character-string)
+  ("2200G" odbc-most-specific-type-mismatch)
+  ("22010" odbc-invalid-indicator-parameter-value)
+  ("22011" odbc-substring-error)
+  ("22012" odbc-division-by-zero)
+  ("22015" odbc-interval-field-overflow)
+  ("22018" odbc-invalid-character-value-for-cast)
+  ("22019" odbc-invalid-escape-character)
+  ("2201B" odbc-invalid-regular-expression)
+  ("2201E" odbc-invalid-argument-for-logarithm)
+  ("2201F" odbc-invalid-argument-for-power-function)
+  ("2201G" odbc-invalid-argument-for-width-bucket-function)
+  ("22020" odbc-invalid-limit-value)
+  ("22021" odbc-character-not-in-repertoire)
+  ("22022" odbc-indicator-overflow)
+  ("22023" odbc-invalid-parameter-value)
+  ("22024" odbc-unterminated-c-string)
+  ("22025" odbc-invalid-escape-sequence)
+  ("22026" odbc-string-data-length-mismatch)
+  ("22027" odbc-trim-error)
+  ("2202E" odbc-array-subscript-error)
+  ("22P01" odbc-floating-point-exception)
+  ("22P02" odbc-invalid-text-representation)
+  ("22P03" odbc-invalid-binary-representation)
+  ("22P04" odbc-bad-copy-file-format)
+  ("22P05" odbc-untranslatable-character)
+  ("22P06" odbc-nonstandard-use-of-escape-character)
+  ("23000" odbc-integrity-constraint-violation)
+  ("23001" odbc-restrict-violation)
+  ("23502" odbc-not-null-violation)
+  ("23503" odbc-foreign-key-violation)
+  ("23505" odbc-unique-violation)
+  ("23514" odbc-check-violation)
+  ("24000" odbc-invalid-cursor-state)
+  ("25000" odbc-invalid-transaction-state)
+  ("25001" odbc-active-sql-transaction)
+  ("25002" odbc-branch-transaction-already-active)
+  ("25003" odbc-inappropriate-access-mode-for-branch-transaction)
+  ("25004" odbc-inappropriate-isolation-level-for-branch-transaction)
+  ("25005" odbc-no-active-sql-transaction-for-branch-transaction)
+  ("25006" odbc-read-only-sql-transaction)
+  ("25007" odbc-schema-and-data-statement-mixing-not-supported)
+  ("25008" odbc-held-cursor-requires-same-isolation-level)
+  ("25P01" odbc-no-active-sql-transaction)
+  ("25P02" odbc-in-failed-sql-transaction)
+  ("26000" odbc-invalid-sql-statement-name)
+  ("27000" odbc-triggered-data-change-violation)
+  ("28000" odbc-invalid-authorization-specification)
+  ("2B000" odbc-dependent-privilege-descriptors-still-exist)
+  ("2BP01" odbc-dependent-objects-still-exist)
+  ("2D000" odbc-invalid-transaction-termination)
+  ("2F000" odbc-sql-routine-exception)
+  ("2F002" odbc-modifying-sql-data-not-permitted)
+  ("2F003" odbc-prohibited-sql-statement-attempted)
+  ("2F004" odbc-reading-sql-data-not-permitted)
+  ("2F005" odbc-function-executed-no-return-statement)
+  ("34000" odbc-invalid-cursor-name)
+  ("38000" odbc-external-routine-exception)
+  ("38001" odbc-containing-sql-not-permitted)
+  ("38002" odbc-modifying-sql-data-not-permitted)
+  ("38003" odbc-prohibited-sql-statement-attempted)
+  ("38004" odbc-reading-sql-data-not-permitted)
+  ("39000" odbc-external-routine-invocation-exception)
+  ("39001" odbc-invalid-sqlstate-returned)
+  ("39004" odbc-null-value-not-allowed)
+  ("39P01" odbc-trigger-protocol-violated)
+  ("39P02" odbc-srf-protocol-violated)
+  ("3B000" odbc-savepoint-exception)
+  ("3B001" odbc-invalid-savepoint-specification)
+  ("3D000" odbc-invalid-catalog-name)
+  ("3F000" odbc-invalid-schema-name)
+  ("40000" odbc-transaction-rollback)
+  ("40001" odbc-serialization-failure)
+  ("40002" odbc-transaction-integrity-constraint-violation)
+  ("40003" odbc-statement-completion-unknown)
+  ("40P01" odbc-deadlock-detected)
+  ("42000" odbc-syntax-error-or-access-rule-violation)
+  ("42501" odbc-insufficient-privilege)
+  ("42601" odbc-syntax-error)
+  ("42602" odbc-invalid-name)
+  ("42611" odbc-invalid-column-definition)
+  ("42622" odbc-name-too-long)
+  ("42701" odbc-duplicate-column)
+  ("42702" odbc-ambiguous-column)
+  ("42703" odbc-undefined-column)
+  ("42704" odbc-undefined-object)
+  ("42710" odbc-duplicate-object)
+  ("42712" odbc-duplicate-alias)
+  ("42723" odbc-duplicate-function)
+  ("42725" odbc-ambiguous-function)
+  ("42803" odbc-grouping-error)
+  ("42804" odbc-datatype-mismatch)
+  ("42809" odbc-wrong-object-type)
+  ("42830" odbc-invalid-foreign-key)
+  ("42846" odbc-cannot-coerce)
+  ("42883" odbc-undefined-function)
+  ("42939" odbc-reserved-name)
+  ("42P01" odbc-undefined-table)
+  ("42P02" odbc-undefined-parameter)
+  ("42P03" odbc-duplicate-cursor)
+  ("42P04" odbc-duplicate-database)
+  ("42P05" odbc-duplicate-prepared-statement)
+  ("42P06" odbc-duplicate-schema)
+  ("42P07" odbc-duplicate-table)
+  ("42P08" odbc-ambiguous-parameter)
+  ("42P09" odbc-ambiguous-alias)
+  ("42P10" odbc-invalid-column-reference)
+  ("42P11" odbc-invalid-cursor-definition)
+  ("42P12" odbc-invalid-database-definition)
+  ("42P13" odbc-invalid-function-definition)
+  ("42P14" odbc-invalid-prepared-statement-definition)
+  ("42P15" odbc-invalid-schema-definition)
+  ("42P16" odbc-invalid-table-definition)
+  ("42P17" odbc-invalid-object-definition)
+  ("42P18" odbc-indeterminate-datatype)
+  ("44000" odbc-with-check-option-violation)
+  ("53000" odbc-insufficient-resources)
+  ("53100" odbc-disk-full)
+  ("53200" odbc-out-of-memory)
+  ("53300" odbc-too-many-connections)
+  ("54000" odbc-program-limit-exceeded)
+  ("54001" odbc-statement-too-complex)
+  ("54011" odbc-too-many-columns)
+  ("54023" odbc-too-many-arguments)
+  ("55000" odbc-object-not-in-prerequisite-state)
+  ("55006" odbc-object-in-use)
+  ("55P02" odbc-cant-change-runtime-param)
+  ("55P03" odbc-lock-not-available)
+  ("57000" odbc-operator-intervention)
+  ("57014" odbc-query-canceled)
+  ("57P01" odbc-admin-shutdown)
+  ("57P02" odbc-crash-shutdown)
+  ("57P03" odbc-cannot-connect-now)
+  ("58030" odbc-io-error)
+  ("58P01" odbc-undefined-file)
+  ("58P02" odbc-duplicate-file))
Index: combined/plain-odbc.asd
===================================================================
--- combined/plain-odbc.asd	(revision combined,5)
+++ combined/plain-odbc.asd	(revision combined,2.2.5)
@@ -11,4 +11,6 @@
                          (:file "ffi-support")
                          (:file "odbc-ff-interface")
+                         (:file "error-base")
+                         (:file "error-defs")
                          (:file "odbc-functions")
                          (:file "parameter")
Index: combined/src/odbc/odbc-functions.lisp
===================================================================
--- combined/src/odbc/odbc-functions.lisp	(revision combined,2.1.14)
+++ combined/src/odbc/odbc-functions.lisp	(revision combined,9)
@@ -88,11 +88,11 @@
         (declare (ignore msg-length)) 
         (values result-code
-                (make-condition
                  (if (eql result-code #.$SQL_SUCCESS_WITH_INFO)
-                   'sql-warning
-                   'sql-error)
-                 :error-message error-message
-                 :sql-state sql-state
-                 :error-code error-code))))
+                   (make-condition
+                    'sql-warning
+                    :error-message error-message
+                    :sql-state sql-state
+                    :error-code error-code)
+                   (make-error sql-state error-message)))))
     ; this can happen, using  a wrong handle
     (#.$SQL_INVALID_HANDLE
@@ -109,4 +109,5 @@
     (otherwise (error "unknown result of odbc execution: ~A" result-code))
     ))
+
 
 
Index: combined/src/odbc/plain-odbc-package.lisp
===================================================================
--- combined/src/odbc/plain-odbc-package.lisp	(revision combined,5)
+++ combined/src/odbc/plain-odbc-package.lisp	(revision combined,2.2.5)
@@ -14,4 +14,9 @@
 ; #+mcl "CCL" #+cormanlisp "WIN32" "CFFI")
   (:export
+   "PRINT-ODBC-ERROR"
+   "ODBC-ERROR"
+   "ERROR-MESSAGE"
+   "ERROR-CODE"
+
    "EXEC-SQL"
    "EXEC-QUERY" 
