(ns metabase-enterprise.serialization.v2.storage (:require [clojure.java.io :as io] [clojure.string :as str] [metabase-enterprise.serialization.dump :refer [spit-yaml!]] [metabase.models.serialization :as serdes] [metabase.util.log :as log])) | |
(set! *warn-on-reflection* true) | |
Given a path segment, which is supposed to be the name of a single file or directory, escape any slashes inside it.
This occurs in practice, for example with a | (defn- escape-segment
[segment]
(-> segment
(str/replace "/" "__SLASH__")
(str/replace "\\" "__BACKSLASH__"))) |
(defn- file
[ctx entity]
(let [;; Get the desired [[serdes/storage-path]].
base-path (serdes/storage-path entity ctx)
dirnames (drop-last base-path)
;; Attach the file extension to the last part.
basename (str (last base-path) ".yaml")]
(apply io/file (:root-dir ctx) (map escape-segment (concat dirnames [basename]))))) | |
(defn- store-entity! [opts entity] (log/infof "Storing %s" (serdes/log-path-str (:serdes/meta entity))) (spit-yaml! (file opts entity) entity) (:serdes/meta entity)) | |
(defn- store-settings! [{:keys [root-dir]} settings]
(when (seq settings)
(let [as-map (into (sorted-map)
(for [{:keys [key value]} settings]
[key value]))]
(spit-yaml! (io/file root-dir "settings.yaml") as-map)))) | |
Helper for storing a serialized database to a tree of YAML files. | (defn store!
[stream root-dir]
(let [settings (atom [])
report (atom {:seen [] :errors []})
opts (merge {:root-dir root-dir} (serdes/storage-base-context))]
(doseq [entity stream]
(cond
(instance? Exception entity)
(swap! report update :errors conj entity)
(-> entity :serdes/meta last :model (= "Setting"))
(swap! settings conj entity)
:else
(swap! report update :seen conj (store-entity! opts entity))))
(when (seq @settings)
(store-settings! opts @settings)
(swap! report update :seen conj [{:model "Setting"}]))
@report)) |