aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/sql.clj
diff options
context:
space:
mode:
authorscgilardi <scgilardi@gmail.com>2009-01-04 18:26:53 +0000
committerscgilardi <scgilardi@gmail.com>2009-01-04 18:26:53 +0000
commita2fc8fb7c7dd0f376246b8db452a58436cbc57c8 (patch)
tree6dd455af2932fdf19a08e693a322395fffe33cf6 /src/clojure/contrib/sql.clj
parent8df2e7e5274ca67f3d68f6a35a84a0a00cd69309 (diff)
sql.clj: simplify macros after some discussions on #clojure, move (connection) entirely into internal, change to clojure.lang.RT/loadClassForName for class loading, will move back if there's trouble
Diffstat (limited to 'src/clojure/contrib/sql.clj')
-rw-r--r--src/clojure/contrib/sql.clj65
1 files changed, 20 insertions, 45 deletions
diff --git a/src/clojure/contrib/sql.clj b/src/clojure/contrib/sql.clj
index b8aa64ef..172cd190 100644
--- a/src/clojure/contrib/sql.clj
+++ b/src/clojure/contrib/sql.clj
@@ -16,59 +16,33 @@
;; Created 2 April 2008
(ns clojure.contrib.sql
- (:use clojure.contrib.except
- clojure.contrib.sql.internal))
+ (:use clojure.contrib.sql.internal))
(defmacro with-connection
"Evaluates body in the context of a new connection to a database then
- closes it. db-spec is a map containing string values for these required
- keys:
+ closes the connection. db-spec is a map containing string values for
+ these required keys:
:classname the jdbc driver class name
:subprotocol the jdbc subprotocol
:subname the jdbc subname
db-spec may contain additional key-value pairs that are passed along to
the driver as properties such as :user, :password, etc."
[db-spec & body]
- `(do
- (Class/forName (:classname ~db-spec))
- (with-open [con#
- (java.sql.DriverManager/getConnection
- (format "jdbc:%s:%s" (:subprotocol ~db-spec) (:subname ~db-spec))
- (properties (dissoc ~db-spec :classname :subprotocol :subname)))]
- (binding [*db* (assoc *db* :connection con# :level 0)]
- ~@body))))
+ `(with-connection* ~db-spec (fn [] ~@body)))
(defmacro transaction
- "Evaluates body as a transaction on the open database connection. Updates
- are committed together as a group after evaluating body or rolled back on
- any uncaught exception. Any nested transactions will be absorbed into the
- outermost transaction."
+ "Evaluates body as a transaction on the open database connection. Any
+ database updates are committed together as a group after evaluating, or
+ rolled back on any uncaught exception. Any nested transactions are
+ absorbed into the outermost transaction."
[& body]
- `(let [con# (connection)
- level# (:level *db*)]
- (binding [*db* (assoc *db* :level (inc level#))]
- (let [auto-commit# (.getAutoCommit con#)]
- (when (zero? level#)
- (.setAutoCommit con# false))
- (try
- (let [value# (do ~@body)]
- (when (zero? level#)
- (.commit con#))
- value#)
- (catch Exception e#
- (.rollback con#)
- (throw (Exception.
- (format "transaction rolled back: %s"
- (.getMessage e#)) e#)))
- (finally
- (when (zero? level#)
- (.setAutoCommit con# auto-commit#))))))))
+ `(transaction* (fn [] ~@body)))
(defn do-commands
"Executes SQL commands that don't return results on the open database
connection"
[& commands]
- (with-open [stmt (.createStatement (connection))]
+ (with-open [stmt (create-statement)]
(doseq [cmd commands]
(.addBatch stmt cmd))
(.executeBatch stmt)))
@@ -77,7 +51,7 @@
"Executes a prepared statement on the open database connection with
parameter sets"
[sql & sets]
- (with-open [stmt (.prepareStatement (connection) sql)]
+ (with-open [stmt (prepare-statement sql)]
(doseq [set sets]
(doseq [[index value] (map vector (iterate inc 1) set)]
(.setObject stmt index value))
@@ -113,10 +87,11 @@
[table column-names & values]
(let [count (count (first values))
template (apply str (interpose "," (replicate count "?")))
- columns (if (seq column-names)
- (format "(%s)"
- (apply str (interpose "," (map the-str column-names))))
- "")]
+ columns
+ (if (seq column-names)
+ (format "(%s)"
+ (apply str (interpose "," (map the-str column-names))))
+ "")]
(apply do-prepared
(format "insert into %s %s values (%s)"
(the-str table) columns template)
@@ -132,7 +107,7 @@
"Executes a query and then evaluates body with results bound to a seq of
the results"
[results sql & body]
- `(with-open [stmt# (.prepareStatement (connection) ~sql)]
- (with-open [rset# (.executeQuery stmt#)]
- (let [~results (resultset-seq rset#)]
- ~@body))))
+ `(with-open [stmt# (prepare-statement ~sql)
+ rset# (.executeQuery stmt#)]
+ (let [~results (resultset-seq rset#)]
+ ~@body)))