Merge pull request #214 from xlevus/feature/parameterizer-multimethod

Refactored parameterizer to use mutimethods
This commit is contained in:
Sean Corfield 2018-06-23 22:53:53 -07:00 committed by GitHub
commit eaab8e8784
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 21 deletions

View file

@ -51,22 +51,18 @@
:sqlserver #(str \[ (string/replace % "]" "]]") \]) :sqlserver #(str \[ (string/replace % "]" "]]") \])
:oracle #(str \" (string/replace % "\"" "\"\"") \")}) :oracle #(str \" (string/replace % "\"" "\"\"") \")})
(def ^:private parameterizers
(atom
{:postgresql #(str "$" (swap! *all-param-counter* inc))
:jdbc (constantly "?")
:none #(str (last @*params*))}))
(defn register-parameterizer (defmulti parameterize (fn [parameterizer & args] parameterizer))
"Register f as a customized parameterizer.
E.g.: (defmethod parameterize :postgresql [_ value pname]
(register-parameterizer :single-quote #(str \"'\" % \"'\")) (str "$" (swap! *all-param-counter* inc)))
(format sql-map :parameterizer :single-quote)"
[k f] (defmethod parameterize :jdbc [_ value pname]
(swap! "?")
parameterizers
(fn [m] (defmethod parameterize :none [_ value pname]
(assoc m k #(f (last @*params*)))))) (str (last @*params*)))
(def ^:dynamic *quote-identifier-fn* nil) (def ^:dynamic *quote-identifier-fn* nil)
(def ^:dynamic *parameterizer* nil) (def ^:dynamic *parameterizer* nil)
@ -266,7 +262,7 @@
*param-names* (atom []) *param-names* (atom [])
*input-params* (atom params) *input-params* (atom params)
*quote-identifier-fn* (quote-fns (:quoting opts)) *quote-identifier-fn* (quote-fns (:quoting opts))
*parameterizer* (@parameterizers (or (:parameterizer opts) :jdbc)) *parameterizer* (or (:parameterizer opts) :jdbc)
*allow-dashed-names?* (:allow-dashed-names? opts)] *allow-dashed-names?* (:allow-dashed-names? opts)]
(let [sql-str (to-sql sql-map)] (let [sql-str (to-sql sql-map)]
(if (and (seq @*params*) (not= :none (:parameterizer opts))) (if (and (seq @*params*) (not= :none (:parameterizer opts)))
@ -284,7 +280,7 @@
(defn to-params-default [value pname] (defn to-params-default [value pname]
(swap! *params* conj value) (swap! *params* conj value)
(swap! *param-names* conj pname) (swap! *param-names* conj pname)
(*parameterizer*)) (parameterize *parameterizer* value pname))
(extend-protocol Parameterizable (extend-protocol Parameterizable
#?@(:clj #?@(:clj
@ -300,7 +296,7 @@
(to-params [value pname] (to-params [value pname]
(swap! *params* conj value) (swap! *params* conj value)
(swap! *param-names* conj pname) (swap! *param-names* conj pname)
(*parameterizer*)) (parameterize *parameterizer* value pname))
#?(:clj Object :cljs default) #?(:clj Object :cljs default)
(to-params [value pname] (to-params [value pname]
#?(:clj #?(:clj

View file

@ -5,7 +5,7 @@
[honeysql.types :as sql] [honeysql.types :as sql]
[honeysql.format :refer [honeysql.format :refer
[*allow-dashed-names?* quote-identifier format-clause format [*allow-dashed-names?* quote-identifier format-clause format
register-parameterizer]])) parameterize]]))
(deftest test-quote (deftest test-quote
(are (are
@ -176,8 +176,9 @@
:parameterizer :postgresql) :parameterizer :postgresql)
["WHERE (foo = $1 AND bar = $2)" "foo" "bar"])))) ["WHERE (foo = $1 AND bar = $2)" "foo" "bar"]))))
(register-parameterizer :single-quote #(str \' % \'))
(register-parameterizer :mysql-fill (constantly "?")) (defmethod parameterize :single-quote [_ value pname] (str \' value \'))
(defmethod parameterize :mysql-fill [_ value pname] "?")
(deftest customized-parameterizer (deftest customized-parameterizer
(testing "should fill param with single quote" (testing "should fill param with single quote"