(ns metabase.driver.sql-jdbc.common (:require [clojure.string :as str] [metabase.util :as u])) | |
(def ^:private valid-separator-styles #{:url :comma :semicolon}) | |
(def ^:private ^:const default-name-value-separator "=") | |
(def ^:private separator-style->entry-separator {:comma ",", :semicolon ";", :url "&"}) | |
Adds | (defn conn-str-with-additional-opts {:added "0.41.0", :arglists '([connection-string separator-style additional-opts])} [connection-string separator-style additional-opts] {:pre [(string? connection-string) (or (nil? additional-opts) (string? additional-opts)) (contains? valid-separator-styles separator-style)]} (str connection-string (when-not (str/blank? additional-opts) (str (case separator-style :comma "," :semicolon ";" :url (if (str/includes? connection-string "?") "&" "?")) additional-opts)))) |
Turns a map of | (defn additional-opts->string {:added "0.41.0"} [separator-style additional-opts & [name-value-separator]] {:pre [(or (nil? additional-opts) (map? additional-opts)) (contains? valid-separator-styles separator-style)]} (when (some? additional-opts) (reduce-kv (fn [m k v] (str m (when (seq m) (separator-style->entry-separator separator-style)) (if (keyword? k) (name k) (str k)) (or name-value-separator default-name-value-separator) v)) "" additional-opts))) |
If Optionally specify | (defn handle-additional-options {:arglists '([connection-spec] [connection-spec details & {:keys [seperator-style]}])} ;; single arity provided for cases when `connection-spec` is built by applying simple transformations to `details` ([connection-spec] (handle-additional-options connection-spec connection-spec)) ;; two-arity+options version provided for when `connection-spec` is being built up separately from `details` source ([{connection-string :subname, :as connection-spec} {additional-options :additional-options, :as _details} & {:keys [seperator-style] :or {seperator-style :url}}] (-> (dissoc connection-spec :additional-options) (assoc :subname (conn-str-with-additional-opts connection-string seperator-style additional-options))))) |
Attempts to parse the entires within the
| (defn additional-options->map [additional-options separator-style & [name-value-separator? lowercase-keys?]] {:pre [(or (nil? additional-options) (string? additional-options)) (contains? valid-separator-styles separator-style) (or (nil? name-value-separator?) (and (string? name-value-separator?) (= 1 (count name-value-separator?)))) (or (nil? lowercase-keys?) (boolean? lowercase-keys?))]} (if (str/blank? additional-options) {} (let [entry-sep (separator-style->entry-separator separator-style) nv-sep (or name-value-separator? default-name-value-separator) pairs (str/split additional-options (re-pattern entry-sep)) k-fn (if (or (nil? lowercase-keys?) (true? lowercase-keys?)) u/lower-case-en identity) kv-fn (fn [part] (let [[k v] (str/split part (re-pattern (str "\\" nv-sep)))] [(k-fn k) v])) kvs (map kv-fn pairs)] (into {} kvs)))) |