Skip to content
Snippets Groups Projects
Unverified Commit 0224abdf authored by Ryan Senior's avatar Ryan Senior Committed by GitHub
Browse files

Merge pull request #8645 from metabase/allow-extra-params-for-mysql

Add support for extra parsed params for MySQL app DBs
parents 76d2beca a1f5b1d1
Branches
Tags
No related merge requests found
......@@ -2,7 +2,8 @@
"Functions for creating JDBC DB specs for a given engine.
Only databases that are supported as application DBs should have functions in this namespace;
otherwise, similar functions are only needed by drivers, and belong in those namespaces."
(:require [ring.util.codec :as codec]))
(:require [clojure.string :as str]
[ring.util.codec :as codec]))
(defn h2
......@@ -16,6 +17,15 @@
:subname db}
(dissoc opts :db)))
(defn- remove-required-keys [db-spec & more-keys]
(apply dissoc db-spec (concat [:host :port :db :user :password :additional-options]
more-keys)))
(defn- make-subname [host port db extra-connection-params]
(let [query-params (codec/form-encode extra-connection-params)]
(str "//" host ":" port "/" db (when-not (str/blank? query-params)
(str "?" query-params)))))
(defn postgres
"Create a database specification for a postgres database. Opts should include
keys for :db, :user, and :password. You can also optionally set host and
......@@ -23,11 +33,13 @@
[{:keys [host port db]
:or {host "localhost", port 5432, db ""}
:as opts}]
(let [query-params (codec/form-encode (merge (dissoc opts :host :port :db :user :password :additional-options :sslfactory) {:OpenSourceSubProtocolOverride true}))]
(merge {:classname "org.postgresql.Driver"
:subprotocol "postgresql"
:subname (str "//" host ":" port "/" db "?" query-params)}
(dissoc opts :host :port :db))))
(let [extra-conn-params (-> opts
(remove-required-keys :sslfactory)
(merge {:OpenSourceSubProtocolOverride true}))]
(merge {:classname "org.postgresql.Driver"
:subprotocol "postgresql"
:subname (make-subname host port db extra-conn-params)}
(dissoc opts :host :port :db))))
(defn mysql
"Create a database specification for a mysql database. Opts should include keys
......@@ -36,11 +48,12 @@
[{:keys [host port db]
:or {host "localhost", port 3306, db ""}
:as opts}]
(merge {:classname "com.mysql.jdbc.Driver"
:subprotocol "mysql"
:subname (str "//" host ":" port "/" db)
:delimiters "`"}
(dissoc opts :host :port :db)))
(let [extra-connection-params (remove-required-keys opts)]
(merge {:classname "com.mysql.jdbc.Driver"
:subprotocol "mysql"
:subname (make-subname host port db extra-connection-params)
:delimiters "`"}
(dissoc opts :host :port :db))))
;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
......
......@@ -88,10 +88,12 @@
"Append `default-connection-args-string` to the connection string in CONNECTION-DETAILS, and an additional option to
explicitly disable SSL if appropriate. (Newer versions of MySQL will complain if you don't explicitly disable SSL.)"
{:argslist '([connection-spec details])}
[{connection-string :subname, :as connection-spec} {ssl? :ssl}]
(assoc connection-spec
:subname (str connection-string "?" default-connection-args-string (when-not ssl?
"&useSSL=false"))))
[connection-spec {ssl? :ssl}]
(update connection-spec :subname
(fn [subname]
(let [join-char (if (str/includes? subname "?") "&" "?")]
(str subname join-char default-connection-args-string (when-not ssl?
"&useSSL=false"))))))
(defn- connection-details->spec [details]
(-> details
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment