From b3f590b43106e90aaa0aba53c020e31c334f53f1 Mon Sep 17 00:00:00 2001
From: technomancy <technomancy@domU-12-31-39-07-C4-F6.compute-1.internal>
Date: Mon, 17 Oct 2011 18:46:03 +0000
Subject: [PATCH] Infer :classname from :subprotocol.

---
 src/main/clojure/clojure/java/jdbc.clj          |    2 +-
 src/main/clojure/clojure/java/jdbc/internal.clj |   14 +++++++++++---
 src/test/clojure/clojure/java/test_jdbc.clj     |    9 +++------
 3 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/src/main/clojure/clojure/java/jdbc.clj b/src/main/clojure/clojure/java/jdbc.clj
index 3c71ba5..add1f0c 100644
--- a/src/main/clojure/clojure/java/jdbc.clj
+++ b/src/main/clojure/clojure/java/jdbc.clj
@@ -139,9 +139,9 @@ generated keys are returned (as a map)." }
     (others)     (optional) passed to the factory function in a map
 
   DriverManager:
-    :classname   (required) a String, the jdbc driver class name
     :subprotocol (required) a String, the jdbc subprotocol
     :subname     (required) a String, the jdbc subname
+    :classname   (optional) a String, the jdbc driver class name
     (others)     (optional) passed to the driver as properties.
 
   DataSource:
diff --git a/src/main/clojure/clojure/java/jdbc/internal.clj b/src/main/clojure/clojure/java/jdbc/internal.clj
index afe9e1a..7d41469 100644
--- a/src/main/clojure/clojure/java/jdbc/internal.clj
+++ b/src/main/clojure/clojure/java/jdbc/internal.clj
@@ -25,6 +25,13 @@
 
 (def ^{:dynamic true} *db* {:connection nil :level 0})
 
+(def ^{:private true :doc "Map of classnames to subprotocols"} classnames
+  {"postgresql" "org.postgresql.Driver"
+   "mysql" "com.mysql.jdbc.Driver"
+   "derby" "org.apache.derby.jdbc.EmbeddedDriver"
+   "hsqldb" "org.hsqldb.jdbcDriver"
+   "sqlite" "org.sqlite.JDBC"})
+
 (def special-counts
   {Statement/EXECUTE_FAILED "EXECUTE_FAILED"
    Statement/SUCCESS_NO_INFO "SUCCESS_NO_INFO"})
@@ -108,9 +115,9 @@
     (others)     (optional) passed to the factory function in a map
 
   DriverManager:
-    :classname   (required) a String, the jdbc driver class name
     :subprotocol (required) a String, the jdbc subprotocol
     :subname     (required) a String, the jdbc subname
+    :classname   (optional) a String, the jdbc driver class name
     (others)     (optional) passed to the driver as properties.
 
   DataSource:
@@ -129,9 +136,10 @@
   (cond
     factory
     (factory (dissoc db-spec :factory))
-    (and classname subprotocol subname)
+    (and subprotocol subname)
     (let [url (format "jdbc:%s:%s" subprotocol subname)
-          etc (dissoc db-spec :classname :subprotocol :subname)]
+          etc (dissoc db-spec :classname :subprotocol :subname)
+          classname (or classname (classnames subprotocol))]
       (RT/loadClassForName classname)
       (DriverManager/getConnection url (as-properties etc)))
     (and datasource username password)
diff --git a/src/test/clojure/clojure/java/test_jdbc.clj b/src/test/clojure/clojure/java/test_jdbc.clj
index ff041bb..33754cc 100644
--- a/src/test/clojure/clojure/java/test_jdbc.clj
+++ b/src/test/clojure/clojure/java/test_jdbc.clj
@@ -33,19 +33,16 @@
 
 ;; database connections used for testing:
 
-(def mysql-db {:classname "com.mysql.jdbc.Driver"
-               :subprotocol "mysql"
+(def mysql-db {:subprotocol "mysql"
                :subname "//127.0.0.1:3306/clojure_test"
                :user "clojure_test"
                :password "clojure_test"})
 
-(def derby-db {:classname "org.apache.derby.jdbc.EmbeddedDriver"
-               :subprotocol "derby"
+(def derby-db {:subprotocol "derby"
                :subname "clojure_test_derby"
                :create true})
 
-(def hsqldb-db {:classname "org.hsqldb.jdbcDriver"
-                :subprotocol "hsqldb"
+(def hsqldb-db {:subprotocol "hsqldb"
                 :subname "clojure_test_hsqldb"})
 
 (defn- test-specs
-- 
1.7.4.1

