Skip to content
Snippets Groups Projects
Commit db2fd5d2 authored by Allen Gilliland's avatar Allen Gilliland
Browse files

small tweak to driver initialization code.

parent fe1e3d63
Branches
Tags
No related merge requests found
......@@ -15,6 +15,7 @@
[medley.core :as m]
(metabase [config :as config]
[db :as db]
[driver :as driver]
[events :as events]
[middleware :as mb-middleware]
[routes :as routes]
......@@ -122,6 +123,9 @@
(.addShutdownHook (Runtime/getRuntime) (Thread. ^Runnable destroy))
(reset! metabase-initialization-progress 0.3)
;; Load up all of our Database drivers, which are used for app db work
(driver/find-and-load-drivers!)
;; startup database. validates connection & runs any necessary migrations
(db/setup-db :auto-migrate (config/config-bool :mb-db-automigrate))
(reset! metabase-initialization-progress 0.5)
......
......@@ -231,23 +231,30 @@
(swap! registered-drivers assoc engine driver-instance)
(log/debug (format "Registered driver %s." engine)))
(def ^:private load-driver-namespaces!
"Search the classpath for metabase driver namespaces and `require` them, so they are \"registered\" and can be used :heart_eyes_cat:"
(delay (doseq [namespce (filter (fn [ns-symb]
(re-matches #"^metabase\.driver\.[a-z0-9_]+$" (name ns-symb)))
(ns-find/find-namespaces (classpath/classpath)))]
(require namespce))))
(defn available-drivers
"Info about available drivers."
[]
@load-driver-namespaces!
(m/map-vals (fn [driver]
{:details-fields (details-fields driver)
:driver-name (name driver)
:features (features driver)})
@registered-drivers))
(defn find-and-load-drivers!
"Search Classpath for namespaces that start with `metabase.driver.`, then `require` them and look for the `driver-init`
function which provides a uniform way for Driver initialization to be done."
[]
;; TODO: at some point if we want to allow true 3rd party drivers we should provide a way for this loading to
;; include drivers defined in other namespace patterns, probabaly via some kind of config which is passed to us
(doseq [namespce (filter (fn [ns-symb]
(re-matches #"^metabase\.driver\.[a-z0-9_]+$" (name ns-symb)))
(ns-find/find-namespaces (classpath/classpath)))]
(log/info "\tloading driver namespace: " namespce)
(require namespce)
;; look for `driver-init` function in the namespace and call it if it exists
(when-let [init-fn (ns-resolve namespce 'driver-init)]
(init-fn))))
(defn is-engine?
"Is ENGINE a valid driver name?"
[engine]
......
......@@ -217,4 +217,6 @@
:string-length-fn (constantly :LENGTH)
:unix-timestamp->timestamp unix-timestamp->timestamp}))
(driver/register-driver! :h2 (H2Driver.))
(defn driver-init
[]
(driver/register-driver! :h2 (H2Driver.)))
......@@ -161,4 +161,6 @@
:sync-in-context sync-in-context
:table-pks (constantly #{"_id"})}))
(driver/register-driver! :mongo (MongoDriver.))
(defn driver-init
[]
(driver/register-driver! :mongo (MongoDriver.)))
......@@ -175,4 +175,6 @@
:set-timezone-sql (constantly "SET @@session.time_zone = ?;")
:unix-timestamp->timestamp unix-timestamp->timestamp}))
(driver/register-driver! :mysql (MySQLDriver.))
(defn driver-init
[]
(driver/register-driver! :mysql (MySQLDriver.)))
......@@ -201,4 +201,6 @@
:string-length-fn (constantly :CHAR_LENGTH)
:unix-timestamp->timestamp unix-timestamp->timestamp}))
(driver/register-driver! :postgres (PostgresDriver.))
(defn driver-init
[]
(driver/register-driver! :postgres (PostgresDriver.)))
......@@ -137,4 +137,6 @@
:string-length-fn (constantly :LENGTH)
:unix-timestamp->timestamp unix-timestamp->timestamp}))
(driver/register-driver! :sqlite (SQLiteDriver.))
(defn driver-init
[]
(driver/register-driver! :sqlite (SQLiteDriver.)))
......@@ -158,4 +158,6 @@
:string-length-fn (constantly :LEN)
:unix-timestamp->timestamp unix-timestamp->timestamp}))
(driver/register-driver! :sqlserver (SQLServerDriver.))
(defn driver-init
[]
(driver/register-driver! :sqlserver (SQLServerDriver.)))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment