aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/clojure/contrib/sql.clj16
-rw-r--r--src/clojure/contrib/sql/internal.clj62
2 files changed, 51 insertions, 27 deletions
diff --git a/src/clojure/contrib/sql.clj b/src/clojure/contrib/sql.clj
index 677d598d..9bb809ba 100644
--- a/src/clojure/contrib/sql.clj
+++ b/src/clojure/contrib/sql.clj
@@ -36,16 +36,20 @@
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."
+ (others) (optional) passed to the driver as properties.
+
+ DataSource:
+ :datasource (required) a javax.sql.DataSource
+ :username (optional) a String
+ :password (optional) a String, required if :username is supplied
+
+ JNDI:
+ :name (required) a String or javax.naming.Name
+ :environment (optional) a java.util.Map"
[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 506748f9..b4ad2b33 100644
--- a/src/clojure/contrib/sql/internal.clj
+++ b/src/clojure/contrib/sql/internal.clj
@@ -12,11 +12,17 @@
;; Created 3 October 2008
(ns clojure.contrib.sql.internal
- (:use (clojure.contrib
- [except :only (throw-arg)]
- [java-utils :only (as-properties)]
- [seq-utils :only (indexed)]))
- (:import (java.sql Statement SQLException BatchUpdateException)))
+ (:use
+ (clojure.contrib
+ [except :only (throw-arg)]
+ [java-utils :only (as-properties)]
+ [seq-utils :only (indexed)]))
+ (:import
+ (clojure.lang RT)
+ (java.sql BatchUpdateException DriverManager SQLException Statement)
+ (java.util Hashtable Map)
+ (javax.naming InitialContext Name)
+ (javax.sql DataSource)))
(def *db* {:connection nil :level 0})
@@ -46,28 +52,42 @@
"Creates a connection to a database. 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]
+ (others) (optional) passed to the driver as properties.
+
+ DataSource:
+ :datasource (required) a javax.sql.DataSource
+ :username (optional) a String
+ :password (optional) a String, required if :username is supplied
+
+ JNDI:
+ :name (required) a String or javax.naming.Name
+ :environment (optional) a java.util.Map"
+ [{:keys [classname subprotocol subname
+ datasource username password
+ name environment]
:as db-spec}]
- (when classname
- (clojure.lang.RT/loadClassForName classname))
- (if datasource
- (if username
- (.getConnection datasource username password)
+ (cond
+ (and classname subprotocol subname)
+ (let [url (format "jdbc:%s:%s" subprotocol subname)
+ etc (dissoc db-spec :classname :subprotocol :subname)]
+ (RT/loadClassForName classname)
+ (DriverManager/getConnection url (as-properties etc)))
+ (and datasource username password)
+ (.getConnection datasource username password)
+ datasource
+ (.getConnection datasource)
+ name
+ (let [env (and environment (Hashtable. environment))
+ context (InitialContext. env)
+ datasource (.lookup context name)]
(.getConnection datasource))
- (java.sql.DriverManager/getConnection
- (format "jdbc:%s:%s" subprotocol subname)
- (as-properties (dissoc db-spec :classname :subprotocol :subname)))))
-
+ :else
+ (throw-arg "db-spec %s is missing a required parameter" db-spec)))
+
(defn with-connection*
"Evaluates func in the context of a new connection to a database then
closes the connection."