X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Fcommand-object.lisp;h=6af4bc86287a6e7aadfad03c179d01127c1140f8;hp=d931bac46ed4fd63240c5ada0b0003844b4804a0;hb=d0f4349abfed43cdb9b618509b8e39579f224326;hpb=48f84bec50c78292501df91ae2f845d0e5172c51 diff --git a/sql/command-object.lisp b/sql/command-object.lisp index d931bac..6af4bc8 100644 --- a/sql/command-object.lisp +++ b/sql/command-object.lisp @@ -35,18 +35,30 @@ :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