|
5 | 5 | [yesql.util :refer [create-root-var]] |
6 | 6 | [yesql.types :refer [map->Query]] |
7 | 7 | [yesql.statement-parser :refer [tokenize]]) |
8 | | - (:import [yesql.types Query])) |
| 8 | + (:import [yesql.types Query]) |
| 9 | + (import java.lang.IllegalArgumentException)) |
9 | 10 |
|
10 | 11 | (def in-list-parameter? |
11 | 12 | "Check if a type triggers IN-list expansion." |
|
35 | 36 | (defn rewrite-query-for-jdbc |
36 | 37 | [tokens initial-args] |
37 | 38 | (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) :?))) |
39 | 40 | actual-positional-count (count (:? initial-args)) |
40 | 41 | 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" |
43 | 44 | (str (seq expected-keys)) |
44 | 45 | (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" |
48 | 49 | ["Query argument mismatch." |
49 | 50 | "Expected %d positional parameters. Got %d." |
50 | 51 | "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))))) |
69 | 80 |
|
70 | 81 | ;; Maintainer's note: clojure.java.jdbc.execute! returns a list of |
71 | 82 | ;; rowcounts, because it takes a list of parameter groups. In our |
|
77 | 88 |
|
78 | 89 | (defn insert-handler |
79 | 90 | [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))) |
81 | 94 |
|
82 | 95 | (defn query-handler |
83 | 96 | [db sql-and-params |
|
0 commit comments