X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=base%2Fbasic-sql.lisp;h=2f25fd42bed99e1a58e0ba21e255b16db794af73;hb=1f4aee256a7a46f6501f9db7798874307c88e5f7;hp=b0a2dad2ddc2138189ac64ada417101a55511ee7;hpb=1751e5245c270bd1ee854a98dfe6caa665abe34e;p=clsql.git diff --git a/base/basic-sql.lisp b/base/basic-sql.lisp index b0a2dad..2f25fd4 100644 --- a/base/basic-sql.lisp +++ b/base/basic-sql.lisp @@ -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