60 lines
1.8 KiB
Clojure
60 lines
1.8 KiB
Clojure
(ns kit.edge.db.sql.conman
|
|
(:require
|
|
[clojure.tools.logging :as log]
|
|
[conman.core :as conman]
|
|
[integrant.core :as ig]
|
|
[kit.ig-utils :as ig-utils]))
|
|
|
|
(defmethod ig/init-key :db.sql/connection
|
|
[_ pool-spec]
|
|
(conman/connect! pool-spec))
|
|
|
|
(defmethod ig/suspend-key! :db.sql/connection [_ _])
|
|
|
|
(defmethod ig/halt-key! :db.sql/connection
|
|
[_ conn]
|
|
(conman/disconnect! conn))
|
|
|
|
(defmethod ig/resume-key :db.sql/connection
|
|
[key opts old-opts old-impl]
|
|
(ig-utils/resume-handler key opts old-opts old-impl))
|
|
|
|
(defn queries-dev [load-queries]
|
|
(fn
|
|
([query params]
|
|
(conman/query (load-queries) query params))
|
|
([conn query params & opts]
|
|
(conman/query conn (load-queries) query params opts))))
|
|
|
|
(defn queries-prod [load-queries]
|
|
(let [queries (load-queries)]
|
|
(fn
|
|
([query params]
|
|
(conman/query queries query params))
|
|
([conn query params & opts]
|
|
(conman/query conn queries query params opts)))))
|
|
|
|
(defmethod ig/init-key :db.sql/query-fn
|
|
[_ {:keys [conn options filename filenames env]
|
|
:or {options {}}}]
|
|
(let [filenames (or filenames [filename])
|
|
load-queries #(apply conman/bind-connection-map conn options filenames)]
|
|
(with-meta
|
|
(if (= env :dev)
|
|
(queries-dev load-queries)
|
|
(queries-prod load-queries))
|
|
{:mtimes (mapv ig-utils/last-modified filenames)})))
|
|
|
|
(defmethod ig/suspend-key! :db.sql/query-fn [_ _])
|
|
|
|
(defmethod ig/resume-key :db.sql/query-fn
|
|
[k {:keys [filename filenames] :as opts} old-opts old-impl]
|
|
(let [check-res (and (= opts old-opts)
|
|
(= (mapv ig-utils/last-modified (or filenames [filename]))
|
|
(:mtimes (meta old-impl))))]
|
|
(log/info k "resume check. Same?" check-res)
|
|
(if check-res
|
|
old-impl
|
|
(do (ig/halt-key! k old-impl)
|
|
(ig/init-key k opts)))))
|