From f16a054ea3e13fd5d0724330390eec6e852153f3 Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Tue, 21 Jan 2014 10:20:11 -0800 Subject: [PATCH 1/2] Support arbitrary db-spec k/vs from query params in URIs. This makes it a lot easier to support SSL connections from URI-style DB connection parameters. --- src/main/clojure/clojure/java/jdbc.clj | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/clojure/clojure/java/jdbc.clj b/src/main/clojure/clojure/java/jdbc.clj index 7f100f80..46959587 100644 --- a/src/main/clojure/clojure/java/jdbc.clj +++ b/src/main/clojure/clojure/java/jdbc.clj @@ -50,7 +50,8 @@ compatibility but it will be removed before a 1.0.0 release." } PreparedStatement ResultSet SQLException Statement Types] [java.util Hashtable Map Properties] [javax.sql DataSource]) - (:require [clojure.string :as str])) + (:require [clojure.string :as str] + [clojure.walk :as walk])) (defn as-sql-name "Given a naming strategy function and a keyword or string, return @@ -141,7 +142,10 @@ compatibility but it will be removed before a 1.0.0 release." } (let [host (.getHost uri) port (if (pos? (.getPort uri)) (.getPort uri)) path (.getPath uri) - scheme (.getScheme uri)] + scheme (.getScheme uri) + query (.getQuery uri) + query-parts (and query (for [kvs (.split query "&")] + (vec (.split kvs "="))))] (merge {:subname (if port (str "//" host ":" port path) @@ -149,7 +153,8 @@ compatibility but it will be removed before a 1.0.0 release." } :subprotocol (subprotocols scheme scheme)} (if-let [user-info (.getUserInfo uri)] {:user (first (str/split user-info #":")) - :password (second (str/split user-info #":"))})))) + :password (second (str/split user-info #":"))}) + (walk/keywordize-keys (into {} query-parts))))) (defn- strip-jdbc [^String spec] (if (.startsWith spec "jdbc:") From fba097f0aca0f643b128a89930e612bf326ad6d8 Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Tue, 21 Jan 2014 13:59:41 -0800 Subject: [PATCH 2/2] Add explict tests for URI-style DB specs. Note that there is some redundancy here since URI specs may be tested by `postgres-str-db` and friends, but it wasn't clear how those are invoked in the test suite as it is, so I've left them alone even though they appear unnecessary. --- src/test/clojure/clojure/java/test_jdbc.clj | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/clojure/clojure/java/test_jdbc.clj b/src/test/clojure/clojure/java/test_jdbc.clj index 843c1083..5ca36fbb 100644 --- a/src/test/clojure/clojure/java/test_jdbc.clj +++ b/src/test/clojure/clojure/java/test_jdbc.clj @@ -177,6 +177,20 @@ [:grade :real] :table-spec ""))) +(deftest test-uri-spec-parsing + (is (= {:advanced "false" :ssl "required" :password "clojure_test" + :user "clojure_test" :subname "//localhost/clojure_test" + :subprotocol "postgresql"} + (@#'sql/parse-properties-uri + (java.net.URI. + (str "postgres://clojure_test:clojure_test@localhost/clojure_test?" + "ssl=required&advanced=false"))))) + (is (= {:password "clojure_test" :user "clojure_test" + :subname "//localhost:3306/clojure_test", :subprotocol "mysql"} + (@#'sql/parse-properties-uri + (java.net.URI. + "mysql://clojure_test:clojure_test@localhost:3306/clojure_test"))))) + (deftest test-create-table (doseq [db (test-specs)] (create-test-table :fruit db)