Skip to content

Commit fa42d1d

Browse files
author
dkmarley
committed
Add support for batch inserts according to PR Batch insert krisajenkins#145
1 parent c8f160c commit fa42d1d

2 files changed

Lines changed: 44 additions & 31 deletions

File tree

project.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
(defproject yesql "0.5.3.1-SNAPSHOT"
1+
(defproject yesql "0.5.3.2-SNAPSHOT"
22
:description "A Clojure library for using SQL"
33
:url "https://github.com/krisajenkins/yesql"
44
:license {:name "Eclipse Public License"

src/yesql/generate.clj

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -36,37 +36,48 @@
3636
(defn rewrite-query-for-jdbc
3737
[tokens initial-args]
3838
(let [{:keys [expected-keys expected-positional-count]} (analyse-statement-tokens tokens)
39-
actual-keys (set (keys (dissoc initial-args :?)))
39+
actual-keys (set (keys (dissoc (if (or (vector? initial-args) (list? initial-args)) (apply merge initial-args) initial-args) :?)))
4040
actual-positional-count (count (:? initial-args))
4141
missing-keys (set/difference expected-keys actual-keys)]
42-
(assert (empty? missing-keys)
43-
(format "Query argument mismatch.\nExpected keys: %s\nActual keys: %s\nMissing keys: %s"
44-
(str (seq expected-keys))
45-
(str (seq actual-keys))
46-
(str (seq missing-keys))))
47-
(assert (= expected-positional-count actual-positional-count)
48-
(format (join "\n"
49-
["Query argument mismatch."
50-
"Expected %d positional parameters. Got %d."
51-
"Supply positional parameters as {:? [...]}"])
52-
expected-positional-count actual-positional-count))
53-
(let [[final-query final-parameters consumed-args]
54-
(reduce (fn [[query parameters args] token]
55-
(cond
56-
(string? token) [(str query token)
57-
parameters
58-
args]
59-
(symbol? token) (let [[arg new-args] (if (= '? token)
60-
[(first (:? args)) (update-in args [:?] rest)]
61-
[(get args (keyword token)) args])]
62-
[(str query (args-to-placeholders arg))
63-
(vec (if (in-list-parameter? arg)
64-
(concat parameters arg)
65-
(conj parameters arg)))
66-
new-args])))
67-
["" [] initial-args]
68-
tokens)]
69-
(concat [final-query] final-parameters))))
42+
(if-not (empty? missing-keys)
43+
(throw (IllegalArgumentException. (format "Query argument mismatch.\nExpected keys: %s\nActual keys: %s\nMissing keys: %s"
44+
(str (seq expected-keys))
45+
(str (seq actual-keys))
46+
(str (seq missing-keys))))))
47+
(if-not (= expected-positional-count actual-positional-count)
48+
(throw (IllegalArgumentException. (format (join "\n"
49+
["Query argument mismatch."
50+
"Expected %d positional parameters. Got %d."
51+
"Supply positional parameters as {:? [...]}"])
52+
expected-positional-count actual-positional-count))))
53+
(if (or (vector? initial-args) (list? initial-args))
54+
(let [[final-query final-parameters consumed-args]
55+
(reduce (fn [[query parameters args] token]
56+
(cond
57+
(string? token) [(str query token)
58+
parameters
59+
args]
60+
(symbol? token) [(str query (args-to-placeholders ""))
61+
(conj parameters (keyword token))
62+
args])) ["" [] initial-args] tokens)] (concat [final-query] (mapv (apply juxt final-parameters) initial-args)))
63+
(let [[final-query final-parameters consumed-args]
64+
(reduce (fn [[query parameters args] token]
65+
(cond
66+
(string? token) [(str query token)
67+
parameters
68+
args]
69+
(symbol? token) (let [[arg new-args] (if (= '? token)
70+
[(first (:? args)) (update-in args [:?] rest)]
71+
[(get args (keyword token)) args])]
72+
[(str query (args-to-placeholders arg))
73+
(vec (if (in-list-parameter? arg)
74+
(concat parameters arg)
75+
(conj parameters arg)))
76+
new-args])))
77+
["" [] initial-args]
78+
tokens)]
79+
(concat [final-query] final-parameters)))))
80+
7081

7182
;; Maintainer's note: clojure.java.jdbc.execute! returns a list of
7283
;; rowcounts, because it takes a list of parameter groups. In our
@@ -78,7 +89,9 @@
7889

7990
(defn insert-handler
8091
[db statement-and-params call-options]
81-
(jdbc/db-do-prepared-return-keys db statement-and-params))
92+
(if (vector? (second statement-and-params))
93+
(apply jdbc/db-do-prepared db statement-and-params)
94+
(jdbc/db-do-prepared-return-keys db statement-and-params)))
8295

8396
(defn query-handler
8497
[db sql-and-params {:keys [row-fn result-set-fn identifiers as-arrays?]

0 commit comments

Comments
 (0)