Merge pull request #65 from MichaelBlume/value

Provide a wrapper to prevent maps/vectors from being read as subqueries
This commit is contained in:
Michael Blume 2015-03-31 10:33:51 -07:00
commit a7f331fd4a
2 changed files with 35 additions and 12 deletions

View file

@ -247,9 +247,27 @@
(into [sql-str] @*params*)
[sql-str]))))
(defn add-param [pname pval]
(swap! *param-names* conj pname)
(swap! *params* conj pval)
(*parameterizer*))
;; Anonymous param name -- :_1, :_2, etc.
(defn add-anon-param [pval]
(add-param
(keyword (str "_" (swap! *param-counter* inc)))
pval))
(defprotocol ToSql
(-to-sql [x]))
(defrecord Value [v]
ToSql
(-to-sql [_]
(add-anon-param v)))
(defn value [x] (Value. x))
(declare -format-clause)
(extend-protocol ToSql
@ -303,20 +321,17 @@
sql-str)))
nil
(-to-sql [x] "NULL")
SqlParam
(-to-sql [x]
(let [pname (param-name x)]
(if (map? @*input-params*)
(add-param pname (get @*input-params* pname))
(let [x (first @*input-params*)]
(swap! *input-params* rest)
(add-param pname x)))))
Object
(-to-sql [x]
(let [[x pname] (if (instance? SqlParam x)
(let [pname (param-name x)]
(if (map? @*input-params*)
[(get @*input-params* pname) pname]
(let [x (first @*input-params*)]
(swap! *input-params* rest)
[x pname])))
;; Anonymous param name -- :_1, :_2, etc.
[x (keyword (str "_" (swap! *param-counter* inc)))])]
(swap! *param-names* conj pname)
(swap! *params* conj x)
(*parameterizer*))))
(add-anon-param x)))
(defn sqlable? [x]
(satisfies? ToSql x))

View file

@ -67,3 +67,11 @@
(sql/format {:select [:foo (sql/call :cast :bar :integer)]})))
(is (= ["SELECT foo, CAST(bar AS integer)"]
(sql/format {:select [:foo (sql/call :cast :bar 'integer)]}))))
(deftest test-value
(is (= ["INSERT INTO foo (bar) VALUES (?)" {:baz "my-val"}]
(->
(insert-into :foo)
(columns :bar)
(values [[(honeysql.format/value {:baz "my-val"})]])
sql/format))))