Merge remote-tracking branch 'upstream/master' into params-merge

This commit is contained in:
Mike Blume 2015-03-15 10:53:52 -07:00
commit 7115456d9e
3 changed files with 59 additions and 48 deletions

3
.travis.yml Normal file
View file

@ -0,0 +1,3 @@
language: clojure
lein: lein2
script: lein do check, test

View file

@ -2,5 +2,7 @@
:description "SQL as Clojure data structures" :description "SQL as Clojure data structures"
:license {:name "Eclipse Public License" :license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"} :url "http://www.eclipse.org/legal/epl-v10.html"}
:url https://github.com/jkk/honeysql :url "https://github.com/jkk/honeysql"
:scm {:name "git"
:url "https://github.com/jkk/honeysql"}
:dependencies [[org.clojure/clojure "1.6.0"]]) :dependencies [[org.clojure/clojure "1.6.0"]])

View file

@ -254,66 +254,72 @@
(extend-protocol ToSql (extend-protocol ToSql
clojure.lang.Keyword clojure.lang.Keyword
(-to-sql [x] (let [s ^String (name x)] (-to-sql [x]
(condp = (.charAt s 0) (let [s (name x)]
\% (let [call-args (string/split (subs s 1) #"\." 2)] (condp = (.charAt s 0)
(to-sql (apply call (map keyword call-args)))) \% (let [call-args (string/split (subs s 1) #"\." 2)]
\? (to-sql (param (keyword (subs s 1)))) (to-sql (apply call (map keyword call-args))))
(quote-identifier x)))) \? (to-sql (param (keyword (subs s 1))))
(quote-identifier x))))
clojure.lang.Symbol clojure.lang.Symbol
(-to-sql [x] (quote-identifier x)) (-to-sql [x] (quote-identifier x))
java.lang.Number java.lang.Number
(-to-sql [x] (str x)) (-to-sql [x] (str x))
java.lang.Boolean java.lang.Boolean
(-to-sql [x] (if x "TRUE" "FALSE")) (-to-sql [x]
(if x "TRUE" "FALSE"))
clojure.lang.Sequential clojure.lang.Sequential
(-to-sql [x] (if *fn-context?* (-to-sql [x]
;; list argument in fn call (if *fn-context?*
(paren-wrap (comma-join (map to-sql x))) ;; list argument in fn call
;; alias (paren-wrap (comma-join (map to-sql x)))
(str (to-sql (first x)) ;; alias
; Omit AS in FROM, JOIN, etc. - Oracle doesn't allow it (str (to-sql (first x))
(if (= :select *clause*) ; Omit AS in FROM, JOIN, etc. - Oracle doesn't allow it
" AS " (if (= :select *clause*)
" ") " AS "
(if (string? (second x)) " ")
(quote-identifier (second x)) (if (string? (second x))
(to-sql (second x)))))) (quote-identifier (second x))
(to-sql (second x))))))
SqlCall SqlCall
(-to-sql [x] (binding [*fn-context?* true] (-to-sql [x]
(let [fn-name (name (.name x)) (binding [*fn-context?* true]
fn-name (fn-aliases fn-name fn-name)] (let [fn-name (name (.name x))
(apply fn-handler fn-name (.args x))))) fn-name (fn-aliases fn-name fn-name)]
(apply fn-handler fn-name (.args x)))))
SqlRaw SqlRaw
(-to-sql [x] (.s x)) (-to-sql [x] (.s x))
clojure.lang.IPersistentMap clojure.lang.IPersistentMap
(-to-sql [x] (let [clause-ops (sort-clauses (keys x)) (-to-sql [x]
sql-str (binding [*subquery?* true (let [clause-ops (sort-clauses (keys x))
*fn-context?* false] sql-str (binding [*subquery?* true
(space-join *fn-context?* false]
(map (comp #(-format-clause % x) #(find x %)) (space-join
clause-ops)))] (map (comp #(-format-clause % x) #(find x %))
(if *subquery?* clause-ops)))]
(paren-wrap sql-str) (if *subquery?*
sql-str))) (paren-wrap sql-str)
sql-str)))
nil nil
(-to-sql [x] "NULL") (-to-sql [x] "NULL")
Object Object
(-to-sql [x] (let [[x pname] (if (instance? SqlParam x) (-to-sql [x]
(let [pname (param-name x)] (let [[x pname] (if (instance? SqlParam x)
(if (map? @*input-params*) (let [pname (param-name x)]
[(get @*input-params* pname) pname] (if (map? @*input-params*)
(let [x (first @*input-params*)] [(get @*input-params* pname) pname]
(swap! *input-params* rest) (let [x (first @*input-params*)]
[x pname]))) (swap! *input-params* rest)
;; Anonymous param name -- :_1, :_2, etc. [x pname])))
[x (keyword (str "_" (swap! *param-counter* inc)))])] ;; Anonymous param name -- :_1, :_2, etc.
(swap! *param-names* conj pname) [x (keyword (str "_" (swap! *param-counter* inc)))])]
(swap! *params* conj x) (swap! *param-names* conj pname)
(swap! *all-param-counter* inc) (swap! *params* conj x)
(if (fn? *parameterizer*) (swap! *all-param-counter* inc)
(*parameterizer*) (if (fn? *parameterizer*)
*parameterizer*)))) (*parameterizer*)
*parameterizer*))))
(defn sqlable? [x] (defn sqlable? [x]
(satisfies? ToSql x)) (satisfies? ToSql x))