X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Fsyntax.lisp;h=f00545e9c22d288fd2afffbf985790e1264195e5;hp=eb19060c4b6ad655eab3c542d1a1482aa03a7925;hb=837ef5c074e599060d89b5fd51abbe6fcd960094;hpb=528064c179b6b74f0a9d6a43c42e71de3f0e9a3a diff --git a/sql/syntax.lisp b/sql/syntax.lisp index eb19060..f00545e 100644 --- a/sql/syntax.lisp +++ b/sql/syntax.lisp @@ -16,9 +16,7 @@ (in-package #:clsql-sys) -(defvar *original-reader-enter* nil) - -(defvar *original-reader-exit* nil) +(defvar *original-readtable* nil) (defvar *sql-macro-open-char* #\[) @@ -45,9 +43,9 @@ the current syntax state." (%disable-sql-reader-syntax))) (defun %disable-sql-reader-syntax () - (when *original-reader-enter* - (set-macro-character *sql-macro-open-char* *original-reader-enter*)) - (setf *original-reader-enter* nil) + (when *original-readtable* + (setf *readtable* *original-readtable* + *original-readtable* nil)) (values)) @@ -69,10 +67,11 @@ the current syntax state." (%enable-sql-reader-syntax))) (defun %enable-sql-reader-syntax () - (unless *original-reader-enter* - (setf *original-reader-enter* (get-macro-character *sql-macro-open-char*))) - (set-macro-character *sql-macro-open-char* #'sql-reader-open) - (enable-sql-close-syntax) + (unless *original-readtable* + (setf *original-readtable* *readtable* + *readtable* (copy-readtable)) + (set-macro-character *sql-macro-open-char* #'sql-reader-open) + (set-macro-character *sql-macro-close-char* (get-macro-character #\)))) (values)) (defmacro restore-sql-reader-syntax-state () @@ -88,25 +87,19 @@ reader syntax is disabled." (defun sql-reader-open (stream char) (declare (ignore char)) (let ((sqllist (read-delimited-list #\] stream t))) - (cond ((string= (write-to-string (car sqllist)) "||") - (cons (sql-operator 'concat-op) (cdr sqllist))) - ((and (= (length sqllist) 1) (eql (car sqllist) '*)) - (apply #'generate-sql-reference sqllist)) - ((sql-operator (car sqllist)) - (cons (sql-operator (car sqllist)) (cdr sqllist))) - (t (apply #'generate-sql-reference sqllist))))) - -(defun disable-sql-close-syntax () - "Internal function that disables the close syntax when leaving - sql context." - (set-macro-character *sql-macro-close-char* *original-reader-exit*) - (setf *original-reader-exit* nil)) - -(defun enable-sql-close-syntax () - "Internal function that enables close syntax when entering SQL - context." - (setf *original-reader-exit* (get-macro-character *sql-macro-close-char*)) - (set-macro-character *sql-macro-close-char* (get-macro-character #\)))) + (unless *read-suppress* + (handler-case + (cond ((string= (write-to-string (car sqllist)) "||") + (cons (sql-operator 'concat-op) (cdr sqllist))) + ((and (= (length sqllist) 1) (eql (car sqllist) '*)) + (apply #'generate-sql-reference sqllist)) + ((sql-operator (car sqllist)) + (cons (sql-operator (car sqllist)) (cdr sqllist))) + (t (apply #'generate-sql-reference sqllist))) + (sql-user-error (c) + (error 'sql-user-error + :message (format nil "Error ~A occured while attempting to parse '~A' at file position ~A" + (sql-user-error-message c) sqllist (file-position stream)))))))) (defun generate-sql-reference (&rest arglist) (cond ((= (length arglist) 1) ; string, table or attribute