Driver notifications are used to let drivers know database details or other relevant information has
changed ( | (ns metabase.events.driver-notifications (:require [medley.core :as m] [metabase.driver :as driver] [metabase.events :as events] [metabase.util.log :as log] [methodical.core :as methodical])) |
(derive ::event :metabase/event) (derive :event/database-update ::event) (derive :event/database-delete ::event) | |
(methodical/defmethod events/publish-event! ::event
[topic {database :object, previous-database :previous-object :as _event}]
;; try/catch here to prevent individual topic processing exceptions from bubbling up. better to handle them here.
(try
;; notify the appropriate driver about the updated database to release any related resources, such as connections.
;; avoid notifying if the changes shouldn't impact the observable behaviour of any resource, otherwise drivers might
;; close connections or other resources unnecessarily (metabase#27877).
(let [;; remove data that should not impact the observable state of any resource before comparing
remove-irrelevant-data (fn [db]
(reduce m/dissoc-in db [[:updated_at]
[:settings :database-enable-actions]]))]
(when (not= (remove-irrelevant-data database)
(remove-irrelevant-data previous-database))
(driver/notify-database-updated (:engine database) database)))
(catch Throwable e
(log/warnf e "Failed to process driver notifications event. %s" topic)))) | |