diff options
-rw-r--r-- | src/clojure/contrib/sql.clj | 20 | ||||
-rw-r--r-- | src/clojure/contrib/sql/internal.clj | 46 |
2 files changed, 42 insertions, 24 deletions
diff --git a/src/clojure/contrib/sql.clj b/src/clojure/contrib/sql.clj index 75242b5c..ca9e1c71 100644 --- a/src/clojure/contrib/sql.clj +++ b/src/clojure/contrib/sql.clj @@ -24,13 +24,19 @@ (defmacro with-connection "Evaluates body in the context of a new connection to a database then - 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 - If db-spec contains additional keys (such as :user, :password, etc.) and - associated values, they will be passed along to the driver as properties." + closes the connection. db-spec is a map containing values for one of the + following parameter sets: + + DataSource: + :datasource (required) a javax.sql.DataSource + :username (optional) a String + :password (optional) a String + + DriverManager: + :classname (required) a String, the jdbc driver class name + :subprotocol (required) a String, the jdbc subprotocol + :subname (required) a String, the jdbc subname + (others) (optional) passed to the driver as properties." [db-spec & body] `(with-connection* ~db-spec (fn [] ~@body))) diff --git a/src/clojure/contrib/sql/internal.clj b/src/clojure/contrib/sql/internal.clj index 9f1aca7e..714fd99b 100644 --- a/src/clojure/contrib/sql/internal.clj +++ b/src/clojure/contrib/sql/internal.clj @@ -52,23 +52,35 @@ (defn with-connection* "Evaluates func in the context of a new connection to a database then - 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 - If db-spec contains additional keys (such as :user, :password, etc.) and - associated values, they will be passed along to the driver as properties." - [{:keys [classname subprotocol subname] :as db-spec} func] - (clojure.lang.RT/loadClassForName classname) - (with-open - [con - (java.sql.DriverManager/getConnection - (format "jdbc:%s:%s" subprotocol subname) - (properties (dissoc db-spec :classname :subprotocol :subname)))] - (binding [*db* (assoc *db* :connection con :level 0 - :rollback-only (atom false))] - (func)))) + closes the connection. db-spec is a map containing values for one of the + following parameter sets: + + DataSource: + :datasource (required) a javax.sql.DataSource + :username (optional) a String + :password (optional) a String + + DriverManager: + :classname (required) a String, the jdbc driver class name + :subprotocol (required) a String, the jdbc subprotocol + :subname (required) a String, the jdbc subname + (others) (optional) passed to the driver as properties." + [{:keys [datasource username password classname subprotocol subname] + :as db-spec} func] + (when-not datasource + (clojure.lang.RT/loadClassForName classname)) + (let [con + (if datasource + (if username + (.getConnection datasource username password) + (.getConnection datasource)) + (java.sql.DriverManager/getConnection + (format "jdbc:%s:%s" subprotocol subname) + (properties (dissoc db-spec :classname :subprotocol :subname))))] + (with-open [con con] + (binding [*db* (assoc *db* :connection con :level 0 + :rollback-only (atom false))] + (func))))) (defn transaction* "Evaluates func as a transaction on the open database connection. Any |