From a799cd5f5fd4420745782bc04b719082e871959e Mon Sep 17 00:00:00 2001 From: Dimitri Fontaine Date: Sat, 28 Jan 2017 17:47:44 +0100 Subject: [PATCH] Improve error handling for MS SQL. In particular, implement more solid handling of poorly encoded data or badly setup connections, by reporting the error and continuing the load. --- src/sources/mssql/mssql.lisp | 40 ++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/sources/mssql/mssql.lisp b/src/sources/mssql/mssql.lisp index e5ae068..02e67ce 100644 --- a/src/sources/mssql/mssql.lisp +++ b/src/sources/mssql/mssql.lisp @@ -34,19 +34,33 @@ (schema-source-name (table-schema (source mssql))) (table-source-name (source mssql))))) (log-message :debug "~a" sql) - (handler-case - (handler-bind - ((condition - #'(lambda (c) - (log-message :error "~a" c) - (update-stats :data (target mssql) :errs 1)))) - (mssql::map-query-results sql - :row-fn process-row-fn - :connection (conn-handle *mssql-db*))) - (condition (e) - (progn - (log-message :error "~a" e) - (update-stats :data (target mssql) :errs 1))))))) + (handler-bind + ((babel-encodings:end-of-input-in-character + #'(lambda (c) + (update-stats :data (target mssql) :errs 1) + (log-message :error "~a" c) + (invoke-restart 'mssql::use-nil))) + + (babel-encodings:character-decoding-error + #'(lambda (c) + (update-stats :data (target mssql) :errs 1) + (let ((encoding + (babel-encodings:character-coding-error-encoding c)) + (position + (babel-encodings:character-coding-error-position c)) + (character + (aref (babel-encodings:character-coding-error-buffer c) + (babel-encodings:character-coding-error-position c)))) + (log-message :error + "~a: Illegal ~a character starting at position ~a: ~a." + (table-schema (source mssql)) + encoding + position + character)) + (invoke-restart 'mssql::use-nil)))) + (mssql::map-query-results sql + :row-fn process-row-fn + :connection (conn-handle *mssql-db*)))))) (defmethod fetch-metadata ((mssql copy-mssql) (catalog catalog)