diff --git a/src/honeysql/format.cljc b/src/honeysql/format.cljc index 78eddf7..b952ce2 100644 --- a/src/honeysql/format.cljc +++ b/src/honeysql/format.cljc @@ -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))) diff --git a/test/honeysql/format_test.cljc b/test/honeysql/format_test.cljc index 84d7fc5..2976fce 100644 --- a/test/honeysql/format_test.cljc +++ b/test/honeysql/format_test.cljc @@ -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"]))))