X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Fcommand-object.lisp;h=6af4bc86287a6e7aadfad03c179d01127c1140f8;hp=3b752ef3ca003a902c79b696eb4b8838a3d3773b;hb=d0f4349abfed43cdb9b618509b8e39579f224326;hpb=b49459599b33655a541817d317dfeb6f839f637e diff --git a/sql/command-object.lisp b/sql/command-object.lisp index 3b752ef..6af4bc8 100644 --- a/sql/command-object.lisp +++ b/sql/command-object.lisp @@ -23,27 +23,42 @@ (in-package #:clsql-sys) (defclass command-object () - ((expression :accessor expression :initarg :expression :initform nil) - (parameters :accessor parameters :initarg :parameters :initform nil) + ((expression :accessor expression :initarg :expression :initform nil + :documentation "query that refers to parameters using \"$1\", \"$2\", \"$n\". + These match positions in the parameters list.") + (parameters :accessor parameters :initarg :parameters :initform nil + :documentation "list of parameters") (prepared-name :accessor prepared-name :initarg :prepared-name :initform "" :documentation "If we want this to be a prepared statement, give it a name to identify it to this session") (has-been-prepared :accessor has-been-prepared :initarg :has-been-prepared :initform nil - :documentation "Have we already prepared this command object") + :documentation "Have we already prepared this command object?") )) + +(defgeneric prepare-sql-parameter (sql-parameter) + (:documentation "This method is responsible for formatting parameters + as the database expects them (eg: :false is nil, nil is :null, dates are iso8601 strings)") + (:method (sql-parameter) + (typecase sql-parameter + (null :null) + (symbol + (if (member sql-parameter (list :false :F)) + nil + (princ-to-string sql-parameter))) + (clsql-sys:date (format-date nil sql-parameter :format :iso8601)) + (clsql-sys:wall-time (format-time nil sql-parameter :format :iso8601)) + (t sql-parameter)))) + (defmethod initialize-instance :after ((o command-object) &key &allow-other-keys ) - ;; Inits parameter nulls + ;; Inits parameter value coersion (setf (parameters o) (parameters o))) (defmethod (setf parameters) (new (o command-object)) " This causes the semantics to match cl-sql instead of cl-postgresql " (setf (slot-value o 'parameters) - (loop for p in new - collecting (cond ((null p) :null) - ((member p (list :false :F)) nil) - (T p))))) + (loop for p in new collecting (prepare-sql-parameter p)))) (defun reset-command-object (co) "Resets the command object to have no name and to be unprepared