Skip to content

Commit

Permalink
Add support for batch inserts according to PR `Batch insert krisajenk…
Browse files Browse the repository at this point in the history
  • Loading branch information
dkmarley committed Jun 17, 2018
1 parent c8f160c commit fa42d1d
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 31 deletions.
2 changes: 1 addition & 1 deletion project.clj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(defproject yesql "0.5.3.1-SNAPSHOT"
(defproject yesql "0.5.3.2-SNAPSHOT"
:description "A Clojure library for using SQL"
:url "https://github.com/krisajenkins/yesql"
:license {:name "Eclipse Public License"
Expand Down
73 changes: 43 additions & 30 deletions src/yesql/generate.clj
Original file line number Diff line number Diff line change
Expand Up @@ -36,37 +36,48 @@
(defn rewrite-query-for-jdbc
[tokens initial-args]
(let [{:keys [expected-keys expected-positional-count]} (analyse-statement-tokens tokens)
actual-keys (set (keys (dissoc initial-args :?)))
actual-keys (set (keys (dissoc (if (or (vector? initial-args) (list? initial-args)) (apply merge initial-args) initial-args) :?)))
actual-positional-count (count (:? initial-args))
missing-keys (set/difference expected-keys actual-keys)]
(assert (empty? missing-keys)
(format "Query argument mismatch.\nExpected keys: %s\nActual keys: %s\nMissing keys: %s"
(str (seq expected-keys))
(str (seq actual-keys))
(str (seq missing-keys))))
(assert (= expected-positional-count actual-positional-count)
(format (join "\n"
["Query argument mismatch."
"Expected %d positional parameters. Got %d."
"Supply positional parameters as {:? [...]}"])
expected-positional-count actual-positional-count))
(let [[final-query final-parameters consumed-args]
(reduce (fn [[query parameters args] token]
(cond
(string? token) [(str query token)
parameters
args]
(symbol? token) (let [[arg new-args] (if (= '? token)
[(first (:? args)) (update-in args [:?] rest)]
[(get args (keyword token)) args])]
[(str query (args-to-placeholders arg))
(vec (if (in-list-parameter? arg)
(concat parameters arg)
(conj parameters arg)))
new-args])))
["" [] initial-args]
tokens)]
(concat [final-query] final-parameters))))
(if-not (empty? missing-keys)
(throw (IllegalArgumentException. (format "Query argument mismatch.\nExpected keys: %s\nActual keys: %s\nMissing keys: %s"
(str (seq expected-keys))
(str (seq actual-keys))
(str (seq missing-keys))))))
(if-not (= expected-positional-count actual-positional-count)
(throw (IllegalArgumentException. (format (join "\n"
["Query argument mismatch."
"Expected %d positional parameters. Got %d."
"Supply positional parameters as {:? [...]}"])
expected-positional-count actual-positional-count))))
(if (or (vector? initial-args) (list? initial-args))
(let [[final-query final-parameters consumed-args]
(reduce (fn [[query parameters args] token]
(cond
(string? token) [(str query token)
parameters
args]
(symbol? token) [(str query (args-to-placeholders ""))
(conj parameters (keyword token))
args])) ["" [] initial-args] tokens)] (concat [final-query] (mapv (apply juxt final-parameters) initial-args)))
(let [[final-query final-parameters consumed-args]
(reduce (fn [[query parameters args] token]
(cond
(string? token) [(str query token)
parameters
args]
(symbol? token) (let [[arg new-args] (if (= '? token)
[(first (:? args)) (update-in args [:?] rest)]
[(get args (keyword token)) args])]
[(str query (args-to-placeholders arg))
(vec (if (in-list-parameter? arg)
(concat parameters arg)
(conj parameters arg)))
new-args])))
["" [] initial-args]
tokens)]
(concat [final-query] final-parameters)))))


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

(defn insert-handler
[db statement-and-params call-options]
(jdbc/db-do-prepared-return-keys db statement-and-params))
(if (vector? (second statement-and-params))
(apply jdbc/db-do-prepared db statement-and-params)
(jdbc/db-do-prepared-return-keys db statement-and-params)))

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

0 comments on commit fa42d1d

Please sign in to comment.