X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=sql%2Ffdml.lisp;h=b9a1153268e87ab2bb6f7691212eb450f9abf406;hb=6c83b1d3ad63edfc36a5bb5aee451d1eacc0d555;hp=34062620389844cb3bf61ba93650db782b6b2db5;hpb=e567409d9fff3f7231c2a0bb69b345e19de2b246;p=clsql.git diff --git a/sql/fdml.lisp b/sql/fdml.lisp index 3406262..b9a1153 100644 --- a/sql/fdml.lisp +++ b/sql/fdml.lisp @@ -1,8 +1,6 @@ ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*- ;;;; ************************************************************************* ;;;; -;;;; $Id$ -;;;; ;;;; The CLSQL Functional Data Manipulation Language (FDML). ;;;; ;;;; This file is part of CLSQL. @@ -140,6 +138,7 @@ columns." (let ((insert (make-instance 'sql-insert :into into))) (with-slots (attributes values query) insert + (cond ((and vals (not attrs) (not query) (not av-pairs)) (setf values vals)) ((and vals attrs (not subquery) (not av-pairs)) @@ -210,29 +209,33 @@ types are automatically computed for each field." (qe (gensym "QUERY-EXPRESSION-")) (columns (gensym "COLUMNS-")) (row (gensym "ROW-")) - (db (gensym "DB-"))) - `(let ((,qe ,query-expression)) + (db (gensym "DB-")) + (last-form-eval (gensym "LFE-"))) + `(let ((,qe ,query-expression) + (,db ,database)) (typecase ,qe (sql-object-query - (dolist (,row (query ,qe)) + (dolist (,row (query ,qe :database ,db)) (destructuring-bind ,args ,row ,@body))) (t ;; Functional query - (let ((,db ,database)) - (multiple-value-bind (,result-set ,columns) - (database-query-result-set ,qe ,db - :full-set nil + (multiple-value-bind (,result-set ,columns) + (database-query-result-set ,qe ,db + :full-set nil :result-types ,result-types) - (when ,result-set - (unwind-protect - (do ((,row (make-list ,columns))) - ((not (database-store-next-row ,result-set ,db ,row)) - nil) - (destructuring-bind ,args ,row - ,@body)) - (database-dump-result-set ,result-set ,db)))))))))) + (when ,result-set + (unwind-protect + (do ((,row (make-list ,columns)) + (,last-form-eval nil)) + ((not (database-store-next-row ,result-set ,db ,row)) + ,last-form-eval) + (destructuring-bind ,args ,row + (setq ,last-form-eval + (progn + ,@body)))) + (database-dump-result-set ,result-set ,db))))))))) (defun map-query (output-type-spec function query-expression &key (database *default-database*)