aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/sql
diff options
context:
space:
mode:
authorscgilardi <scgilardi@gmail.com>2009-01-21 14:40:16 +0000
committerscgilardi <scgilardi@gmail.com>2009-01-21 14:40:16 +0000
commit27a1523c91c426a9152e886fa2f5eae5bfcdc55e (patch)
tree417e275a8b3427459ab1156186b33146dc0e495c /src/clojure/contrib/sql
parent68509921a5784ae1a7d5ec5d0c794641c6a8af1f (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.clj41
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