Added Inlinable protocol for more sensible stringification of inline values, and to allow library users to further extend the inline behavior (#224)
This commit is contained in:
parent
2b238c5a47
commit
6e3631822d
3 changed files with 24 additions and 5 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
(ns honeysql.format
|
(ns honeysql.format
|
||||||
(:refer-clojure :exclude [format])
|
(:refer-clojure :exclude [format])
|
||||||
(:require [honeysql.types :refer [call raw param param-name
|
(:require [honeysql.types :as types
|
||||||
|
:refer [call raw param param-name inline-str
|
||||||
#?@(:cljs [SqlCall SqlRaw SqlParam SqlArray SqlInline])]]
|
#?@(:cljs [SqlCall SqlRaw SqlParam SqlArray SqlInline])]]
|
||||||
[clojure.string :as string])
|
[clojure.string :as string])
|
||||||
#?(:clj (:import [honeysql.types SqlCall SqlRaw SqlParam SqlArray SqlInline])))
|
#?(:clj (:import [honeysql.types SqlCall SqlRaw SqlParam SqlArray SqlInline])))
|
||||||
|
|
@ -357,6 +358,18 @@
|
||||||
(quote-identifier (second x))
|
(quote-identifier (second x))
|
||||||
(to-sql (second x))))))
|
(to-sql (second x))))))
|
||||||
|
|
||||||
|
(extend-protocol types/Inlinable
|
||||||
|
#?(:clj clojure.lang.Keyword
|
||||||
|
:cljs cljs.core/Keyword)
|
||||||
|
(inline-str [x]
|
||||||
|
(name x))
|
||||||
|
nil
|
||||||
|
(inline-str [_]
|
||||||
|
"NULL")
|
||||||
|
#?(:clj Object :cljs default)
|
||||||
|
(inline-str [x]
|
||||||
|
(str x)))
|
||||||
|
|
||||||
(extend-protocol ToSql
|
(extend-protocol ToSql
|
||||||
#?(:clj clojure.lang.Keyword
|
#?(:clj clojure.lang.Keyword
|
||||||
:cljs cljs.core/Keyword)
|
:cljs cljs.core/Keyword)
|
||||||
|
|
@ -411,10 +424,7 @@
|
||||||
(str "ARRAY[" (comma-join (map to-sql (.-values x))) "]"))
|
(str "ARRAY[" (comma-join (map to-sql (.-values x))) "]"))
|
||||||
SqlInline
|
SqlInline
|
||||||
(to-sql [x]
|
(to-sql [x]
|
||||||
(let [v (.-value x)]
|
(inline-str (.-value x)))
|
||||||
(if (some? v)
|
|
||||||
(str v)
|
|
||||||
"NULL")))
|
|
||||||
#?(:clj Object :cljs default)
|
#?(:clj Object :cljs default)
|
||||||
(to-sql [x]
|
(to-sql [x]
|
||||||
#?(:clj (add-anon-param x)
|
#?(:clj (add-anon-param x)
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,9 @@
|
||||||
|
|
||||||
(defrecord SqlInline [value])
|
(defrecord SqlInline [value])
|
||||||
|
|
||||||
|
(defprotocol Inlinable
|
||||||
|
(inline-str [x]))
|
||||||
|
|
||||||
(defn inline
|
(defn inline
|
||||||
"Prevents parameterization"
|
"Prevents parameterization"
|
||||||
[value]
|
[value]
|
||||||
|
|
|
||||||
|
|
@ -214,3 +214,9 @@
|
||||||
:join [[:table2 :t2] [:= :t1.fk :t2.id]]
|
:join [[:table2 :t2] [:= :t1.fk :t2.id]]
|
||||||
:where [:= :t1.bar 42]}
|
:where [:= :t1.bar 42]}
|
||||||
(format :quoting :mysql)))))
|
(format :quoting :mysql)))))
|
||||||
|
|
||||||
|
(deftest inlined-values-are-stringified-correctly
|
||||||
|
(is (= ["SELECT foo, bar, NULL"]
|
||||||
|
(format {:select [(honeysql.core/inline "foo")
|
||||||
|
(honeysql.core/inline :bar)
|
||||||
|
(honeysql.core/inline nil)]}))))
|
||||||
Loading…
Reference in a new issue