r9239: avoid multiple query-expression evaluation
[clsql.git] / base / basic-sql.lisp
index b0a2dad2ddc2138189ac64ada417101a55511ee7..2f25fd42bed99e1a58e0ba21e255b16db794af73 100644 (file)
@@ -61,26 +61,30 @@ pair."))
   (values))
 
 (defmacro do-query (((&rest args) query-expression
-                    &key (database '*default-database*) (result-types nil))
+                    &key (database '*default-database*) (result-types :auto))
                    &body body)
   "Repeatedly executes BODY within a binding of ARGS on the
 attributes of each record resulting from QUERY-EXPRESSION. The
 return value is determined by the result of executing BODY. The
 default value of DATABASE is *DEFAULT-DATABASE*."
-  (let ((result-set (gensym))
-       (columns (gensym))
-       (row (gensym))
-       (db (gensym)))
-    `(if (listp ,query-expression)
+  (let ((result-set (gensym "RESULT-SET-"))
+       (qe (gensym "QUERY-EXPRESSION-"))
+       (columns (gensym "COLUMNS-"))
+       (row (gensym "ROW-"))
+       (db (gensym "DB-")))
+    `(let ((,qe ,query-expression))
+      (typecase ,qe
+       (list
         ;; Object query 
-         (dolist (,row ,query-expression)
+         (dolist (,row ,qe)
            (destructuring-bind ,args 
                ,row
-             ,@body))
+             ,@body)))
+       (t
         ;; Functional query 
         (let ((,db ,database))
           (multiple-value-bind (,result-set ,columns)
-              (database-query-result-set ,query-expression ,db
+              (database-query-result-set ,qe ,db
                                          :full-set nil 
                                          :result-types ,result-types)
             (when ,result-set
@@ -90,11 +94,11 @@ default value of DATABASE is *DEFAULT-DATABASE*."
                         nil)
                      (destructuring-bind ,args ,row
                        ,@body))
-                (database-dump-result-set ,result-set ,db))))))))
+                (database-dump-result-set ,result-set ,db))))))))))
 
 (defun map-query (output-type-spec function query-expression
                  &key (database *default-database*)
-                 (result-types nil))
+                 (result-types :auto))
   "Map the function over all tuples that are returned by the
 query in QUERY-EXPRESSION. The results of the function are
 collected as specified in OUTPUT-TYPE-SPEC and returned like in