diff options
author | scgilardi <scgilardi@gmail.com> | 2009-01-21 14:40:16 +0000 |
---|---|---|
committer | scgilardi <scgilardi@gmail.com> | 2009-01-21 14:40:16 +0000 |
commit | 27a1523c91c426a9152e886fa2f5eae5bfcdc55e (patch) | |
tree | 417e275a8b3427459ab1156186b33146dc0e495c /src/clojure/contrib/sql | |
parent | 68509921a5784ae1a7d5ec5d0c794641c6a8af1f (diff) |
sql: in transaction*, separate simple nested case from outermost case
Diffstat (limited to 'src/clojure/contrib/sql')
-rw-r--r-- | src/clojure/contrib/sql/internal.clj | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/src/clojure/contrib/sql/internal.clj b/src/clojure/contrib/sql/internal.clj index 4eb0955a..4aa4709e 100644 --- a/src/clojure/contrib/sql/internal.clj +++ b/src/clojure/contrib/sql/internal.clj @@ -94,32 +94,27 @@ transaction, the entire transaction will be rolled back rather than committed when complete." [func] - (io! - (let [con (connection*) - outermost (zero? (:level *db*)) - auto-commit (when outermost (.getAutoCommit con))] - (binding [*db* (update-in *db* [:level] inc)] - (when outermost - (.setAutoCommit con false)) - (try - (let [value (func)] - (when outermost + (binding [*db* (update-in *db* [:level] inc)] + (if (= (:level *db*) 1) + (let [con (connection*) + auto-commit (.getAutoCommit con)] + (io! + (.setAutoCommit con false) + (try + (let [value (func)] (if (rollback-only) (.rollback con) - (.commit con))) - value) - (catch Exception e - (if outermost - (do - (.rollback con) - (throw (Exception. - (format "transaction rolled back: %s" - (.getMessage e)) e))) - (throw e))) - (finally - (when outermost + (.commit con)) + value) + (catch Exception e + (.rollback con) + (throw (Exception. + (format "transaction rolled back: %s" + (.getMessage e)) e))) + (finally (rollback-only false) - (.setAutoCommit con auto-commit)))))))) + (.setAutoCommit con auto-commit))))) + (func)))) (defn with-query-results* "Executes a query, then evaluates func passing in a seq of the results as |