Skip to content

Commit ea664ab

Browse files
committed
Merge remote-tracking branch 'ibarrick/batch-insert'
See krisajenkins#145
2 parents f49720c + d634f7d commit ea664ab

3 files changed

Lines changed: 45 additions & 31 deletions

File tree

project.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
:url "https://github.com/krisajenkins/yesql"}
1212
:profiles {:dev {:dependencies [[expectations "2.1.3" :exclusions [org.clojure/clojure]]
1313
[org.apache.derby/derby "10.12.1.1"]]
14-
:plugins [[lein-autoexpect "1.4.0"]
14+
:plugins [[lein-autoexpect "1.4.0" :exclusions [org.clojure/tools.namespace]]
1515
[lein-expectations "0.0.8" :exclusions [org.clojure/clojure]]]}
1616
:1.5 {:dependencies [[org.clojure/clojure "1.5.1"]]}
1717
:1.6 {:dependencies [[org.clojure/clojure "1.6.0"]]}

src/yesql/generate.clj

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
[yesql.util :refer [create-root-var]]
66
[yesql.types :refer [map->Query]]
77
[yesql.statement-parser :refer [tokenize]])
8-
(:import [yesql.types Query]))
8+
(:import [yesql.types Query])
9+
(import java.lang.IllegalArgumentException))
910

1011
(def in-list-parameter?
1112
"Check if a type triggers IN-list expansion."
@@ -35,37 +36,47 @@
3536
(defn rewrite-query-for-jdbc
3637
[tokens initial-args]
3738
(let [{:keys [expected-keys expected-positional-count]} (analyse-statement-tokens tokens)
38-
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) :?)))
3940
actual-positional-count (count (:? initial-args))
4041
missing-keys (set/difference expected-keys actual-keys)]
41-
(assert (empty? missing-keys)
42-
(format "Query argument mismatch.\nExpected keys: %s\nActual keys: %s\nMissing keys: %s"
42+
(if-not (empty? missing-keys)
43+
(throw (IllegalArgumentException. (format "Query argument mismatch.\nExpected keys: %s\nActual keys: %s\nMissing keys: %s"
4344
(str (seq expected-keys))
4445
(str (seq actual-keys))
45-
(str (seq missing-keys))))
46-
(assert (= expected-positional-count actual-positional-count)
47-
(format (join "\n"
46+
(str (seq missing-keys))))))
47+
(if-not (= expected-positional-count actual-positional-count)
48+
(throw (IllegalArgumentException. (format (join "\n"
4849
["Query argument mismatch."
4950
"Expected %d positional parameters. Got %d."
5051
"Supply positional parameters as {:? [...]}"])
51-
expected-positional-count actual-positional-count))
52-
(let [[final-query final-parameters consumed-args]
53-
(reduce (fn [[query parameters args] token]
54-
(cond
55-
(string? token) [(str query token)
56-
parameters
57-
args]
58-
(symbol? token) (let [[arg new-args] (if (= '? token)
59-
[(first (:? args)) (update-in args [:?] rest)]
60-
[(get args (keyword token)) args])]
61-
[(str query (args-to-placeholders arg))
62-
(vec (if (in-list-parameter? arg)
63-
(concat parameters arg)
64-
(conj parameters arg)))
65-
new-args])))
66-
["" [] initial-args]
67-
tokens)]
68-
(concat [final-query] final-parameters))))
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)))))
6980

7081
;; Maintainer's note: clojure.java.jdbc.execute! returns a list of
7182
;; rowcounts, because it takes a list of parameter groups. In our
@@ -77,7 +88,9 @@
7788

7889
(defn insert-handler
7990
[db statement-and-params call-options]
80-
(jdbc/db-do-prepared-return-keys db statement-and-params))
91+
(if (vector? (second statement-and-params))
92+
(apply jdbc/db-do-prepared db statement-and-params)
93+
(jdbc/db-do-prepared-return-keys db statement-and-params)))
8194

8295
(defn query-handler
8396
[db sql-and-params

test/yesql/generate_test.clj

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
(:require [expectations :refer :all]
33
[clojure.template :refer [do-template]]
44
[yesql.statement-parser :refer [tokenize]]
5-
[yesql.generate :refer :all]))
5+
[yesql.generate :refer :all])
6+
(:import [java.lang IllegalArgumentException]))
67

78
(do-template [statement _ expected-parameters]
89
(expect expected-parameters
@@ -82,13 +83,13 @@
8283
"SELECT * FROM users WHERE group_ids IN(:group_ids) AND parent_id = :parent_id"
8384
{:group_ids [1 2]
8485
:parent_id 3}
85-
=> ["SELECT * FROM users WHERE group_ids IN(?,?) AND parent_id = ?" 1 2 3])
86+
=> ["SELECT * FROM users WHERE group_ids IN(?,?) AND parent_id = ?" 1 2 3])
8687

8788
;;; Incorrect parameters.
88-
(expect AssertionError
89+
(expect IllegalArgumentException
8990
(rewrite-query-for-jdbc (tokenize "SELECT age FROM users WHERE country = :country AND name = :name")
9091
{:country "gb"}))
9192

92-
(expect AssertionError
93+
(expect IllegalArgumentException
9394
(rewrite-query-for-jdbc (tokenize "SELECT age FROM users WHERE country = ? AND name = ?")
9495
{}))

0 commit comments

Comments
 (0)