Skip to content
Snippets Groups Projects
Commit aefbcdec authored by Cam Saül's avatar Cam Saül
Browse files

Merge pull request #345 from metabase/can_connect_qmark

THOU SHALT BE ABLE TO CHECK WHETHER THOU MAY CONNECT TO THY DATABASES
parents 85b6b546 647586e5
No related branches found
No related tags found
No related merge requests found
......@@ -50,11 +50,15 @@
(defmulti connection-details
"Return a map of connection details (in format usable by korma) for DATABASE."
"Return a map of connection details (in format usable by korma or equivalent) for DATABASE."
(db-dispatch-fn "connection"))
(defmulti connection
"Return a korma connection to DATABASE."
"Return a [korma or equivalent] connection to DATABASE."
(db-dispatch-fn "connection"))
(defmulti can-connect?
"Check whether we can connect to DATABASE and perform a simple query."
(db-dispatch-fn "connection"))
(defmulti sync-database
......
(ns metabase.driver.generic-sql.connection
(:require [clojure.tools.logging :as log]
[korma.core :as k]
[metabase.driver :as driver]))
(defn can-connect?
"Check whether we can connect to a DATABASE and perform a very simple SQL query.
(can-connect? (sel :one Database ....)) -> true"
[database]
(try (= 1 (-> (k/exec-raw (driver/connection database) "SELECT 1" :results)
first
vals
first))
(catch Throwable e
(log/error "Failed to connect to database:" (.getMessage e))
false)))
(ns metabase.driver.h2.connection
(:require [korma.db]
[metabase.driver :refer [connection connection-details]]))
(:require korma.db
[metabase.driver :refer [can-connect? connection connection-details]]
[metabase.driver.generic-sql.connection :as generic]))
(defmethod connection-details :h2 [{:keys [details]}]
(clojure.set/rename-keys details {:conn_str :db}))
(defmethod connection :h2 [database]
(korma.db/h2 (connection-details database)))
(defmethod can-connect? :h2 [database]
(generic/can-connect? database))
(ns metabase.driver.postgres.connection
(:require [clojure.set :refer [rename-keys]]
[clojure.string :as s]
[korma.db]
korma.db
[swiss.arrows :refer :all]
[metabase.config :as config]
[metabase.driver :refer [connection connection-details]]))
[metabase.driver :refer [can-connect? connection connection-details]]
[metabase.driver.generic-sql.connection :as generic]))
(defmethod connection-details :postgres [database]
(let [details (-<>> database :details :conn_str ; get conn str like "password=corvus user=corvus ..."
......@@ -26,3 +27,6 @@
(-> (connection-details database)
(dissoc :db-type)
korma.db/postgres))
(defmethod can-connect? :postgres [database]
(generic/can-connect? database))
(ns metabase.driver.generic-sql.connection-test
(:require [expectations :refer :all]
[metabase.db :refer [sel]]
[metabase.driver.generic-sql.connection :refer :all]
[metabase.models.database :refer [Database]]
[metabase.test-data :refer :all]))
;; ## TESTS FOR CAN-CONNECT?
;; Check that we can connect to the Test DB
(expect true
(can-connect? @test-db))
;; Lie and say Test DB is Postgres. CAN-CONNECT? should fail
(expect false
(can-connect? (assoc @test-db :engine :postgres)))
;; Random made-up DBs should fail
(expect false
(can-connect? {:engine :postgres
:details {:conn_str "host=localhost port=5432 dbname=ABCDEFGHIJKLMNOP user=rasta"}}))
;; Things that you can connect to, but are not DBs, should fail
(expect false
(can-connect? {:engine :postgres
:details {:conn_str "host=google.com port=80"}}))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment