From 25ba952a3e0f90bcdba5bb75f8a0b58e6226cc9a Mon Sep 17 00:00:00 2001 From: Isaac Cambron Date: Tue, 6 Jan 2015 19:58:56 -0500 Subject: [PATCH 1/2] support postgres-native parameters --- src/honeysql/format.clj | 15 +++++++++++++-- test/honeysql/core_test.clj | 6 +++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/honeysql/format.clj b/src/honeysql/format.clj index 004a640..fb53210 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -30,6 +30,8 @@ (def ^:dynamic *param-counter* nil) +(def ^:dynamic *all-param-counter* nil) + (def ^:dynamic *input-params* nil) (def ^:dynamic *fn-context?* false) @@ -42,7 +44,12 @@ :sqlserver #(str \[ % \]) :oracle #(str \" % \")}) +(def ^:private parameterizers + {:postgresql #(str "$" @*all-param-counter*) + :jdbc "?"}) + (def ^:dynamic *quote-identifier-fn* nil) +(def ^:dynamic *parameterizer* nil) (defn- undasherize [s] (string/replace s "-" "_")) @@ -173,6 +180,7 @@ :params - input parameters :quoting - quote style to use for identifiers; one of :ansi (PostgreSQL), :mysql, :sqlserver, or :oracle. Defaults to no quoting. + :parameterizer - style of parameter naming, one of :postgresql or :jdbc, defaults to :jdbc :return-param-names - when true, returns a vector of [sql-str param-values param-names]" [sql-map & params-or-opts] @@ -183,9 +191,11 @@ (:params opts))] (binding [*params* (atom []) *param-counter* (atom 0) + *all-param-counter* (atom 0) *param-names* (atom []) *input-params* (atom params) - *quote-identifier-fn* (quote-fns (:quoting opts))] + *quote-identifier-fn* (quote-fns (:quoting opts)) + *parameterizer* (parameterizers (or (:parameterizer opts) :jdbc))] (let [sql-str (to-sql sql-map)] (if (seq @*params*) (if (:return-param-names opts) @@ -277,7 +287,8 @@ [x (keyword (str "_" (swap! *param-counter* inc)))])] (swap! *param-names* conj pname) (swap! *params* conj x) - "?"))) + (swap! *all-param-counter* inc) + (if (fn? *parameterizer*) (*parameterizer*) *parameterizer*)))) ;;;; diff --git a/test/honeysql/core_test.clj b/test/honeysql/core_test.clj index 161b52f..80ff1c2 100644 --- a/test/honeysql/core_test.clj +++ b/test/honeysql/core_test.clj @@ -54,4 +54,8 @@ ["SELECT DISTINCT f.*, b.baz, c.quux, b.bla AS bla_bla, now(), @x := 10 FROM foo f, baz b INNER JOIN draq ON f.b = draq.x LEFT JOIN clod c ON f.a = c.d RIGHT JOIN bock ON bock.z = c.e WHERE ((f.a = ? AND b.baz <> ?) OR (1 < 2 AND 2 < 3) OR (f.e in (1, ?, 3)) OR f.e BETWEEN 10 AND 20) GROUP BY f.a HAVING 0 < f.e ORDER BY b.baz DESC, c.quux LIMIT 50 OFFSET 10 " "bort" "gabba" 2]))) (testing "SQL data prints and reads correctly" - (is (= m1 (read-string (pr-str m1))))))) + (is (= m1 (read-string (pr-str m1))))) + (testing "SQL data formats correctly with alternate param naming" + (is (= (sql/format m1 :params {:param1 "gabba" :param2 2} :parameterizer :postgresql) + ["SELECT DISTINCT f.*, b.baz, c.quux, b.bla AS bla_bla, now(), @x := 10 FROM foo f, baz b INNER JOIN draq ON f.b = draq.x LEFT JOIN clod c ON f.a = c.d RIGHT JOIN bock ON bock.z = c.e WHERE ((f.a = $1 AND b.baz <> $2) OR (1 < 2 AND 2 < 3) OR (f.e in (1, $3, 3)) OR f.e BETWEEN 10 AND 20) GROUP BY f.a HAVING 0 < f.e ORDER BY b.baz DESC, c.quux LIMIT 50 OFFSET 10 " + "bort" "gabba" 2]))))) From 27b906859dba7aa0c37f515106f09981de8f5e82 Mon Sep 17 00:00:00 2001 From: Mike Blume Date: Sun, 15 Mar 2015 11:00:01 -0700 Subject: [PATCH 2/2] simplify call to parameterizer --- src/honeysql/format.clj | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/honeysql/format.clj b/src/honeysql/format.clj index c792670..6d48ccb 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -45,8 +45,8 @@ :oracle #(str \" % \")}) (def ^:private parameterizers - {:postgresql #(str "$" @*all-param-counter*) - :jdbc "?"}) + {:postgresql #(str "$" (swap! *all-param-counter* inc)) + :jdbc (constantly "?")}) (def ^:dynamic *quote-identifier-fn* nil) (def ^:dynamic *parameterizer* nil) @@ -316,10 +316,7 @@ [x (keyword (str "_" (swap! *param-counter* inc)))])] (swap! *param-names* conj pname) (swap! *params* conj x) - (swap! *all-param-counter* inc) - (if (fn? *parameterizer*) - (*parameterizer*) - *parameterizer*)))) + (*parameterizer*)))) (defn sqlable? [x] (satisfies? ToSql x))