Merge pull request #209 from juvenn/customized-parameterizer

Support register customized parameterizer
This commit is contained in:
Michael Blume 2018-03-24 21:09:26 -07:00 committed by GitHub
commit 3fe5f0f51d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 4 deletions

View file

@ -52,9 +52,21 @@
:oracle #(str \" (string/replace % "\"" "\"\"") \")})
(def ^:private parameterizers
{:postgresql #(str "$" (swap! *all-param-counter* inc))
(atom
{:postgresql #(str "$" (swap! *all-param-counter* inc))
:jdbc (constantly "?")
:none #(str (last @*params*))})
:none #(str (last @*params*))}))
(defn register-parameterizer
"Register f as a customized parameterizer.
E.g.:
(register-parameterizer :single-quote #(str \"'\" % \"'\"))
(format sql-map :parameterizer :single-quote)"
[k f]
(swap!
parameterizers
(fn [m]
(assoc m k #(f (last @*params*))))))
(def ^:dynamic *quote-identifier-fn* nil)
(def ^:dynamic *parameterizer* nil)
@ -254,7 +266,7 @@
*param-names* (atom [])
*input-params* (atom params)
*quote-identifier-fn* (quote-fns (:quoting opts))
*parameterizer* (parameterizers (or (:parameterizer opts) :jdbc))
*parameterizer* (@parameterizers (or (:parameterizer opts) :jdbc))
*allow-dashed-names?* (:allow-dashed-names? opts)]
(let [sql-str (to-sql sql-map)]
(if (and (seq @*params*) (not= :none (:parameterizer opts)))

View file

@ -4,7 +4,8 @@
:cljs [cljs.test :refer-macros]) [deftest testing is are]]
[honeysql.types :as sql]
[honeysql.format :refer
[*allow-dashed-names?* quote-identifier format-clause format]]))
[*allow-dashed-names?* quote-identifier format-clause format
register-parameterizer]]))
(deftest test-quote
(are
@ -174,3 +175,16 @@
(is (= (format {:where [:and [:= :foo "foo"] [:= :bar "bar"] nil]}
:parameterizer :postgresql)
["WHERE (foo = $1 AND bar = $2)" "foo" "bar"]))))
(register-parameterizer :single-quote #(str \' % \'))
(register-parameterizer :mysql-fill (constantly "?"))
(deftest customized-parameterizer
(testing "should fill param with single quote"
(is (= (format {:where [:and [:= :foo "foo"] [:= :bar "bar"] nil]}
:parameterizer :single-quote)
["WHERE (foo = 'foo' AND bar = 'bar')" "foo" "bar"])))
(testing "should fill param with ?"
(is (= (format {:where [:and [:= :foo "foo"] [:= :bar "bar"] nil]}
:parameterizer :mysql-fill)
["WHERE (foo = ? AND bar = ?)" "foo" "bar"]))))