|
36 | 36 | (defn rewrite-query-for-jdbc |
37 | 37 | [tokens initial-args] |
38 | 38 | (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) :?))) |
40 | 40 | actual-positional-count (count (:? initial-args)) |
41 | 41 | missing-keys (set/difference expected-keys actual-keys)] |
42 | 42 | (if-not (empty? missing-keys) |
|
50 | 50 | "Expected %d positional parameters. Got %d." |
51 | 51 | "Supply positional parameters as {:? [...]}"]) |
52 | 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)))) |
| 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))))) |
70 | 80 |
|
71 | 81 | ;; Maintainer's note: clojure.java.jdbc.execute! returns a list of |
72 | 82 | ;; rowcounts, because it takes a list of parameter groups. In our |
|
78 | 88 |
|
79 | 89 | (defn insert-handler |
80 | 90 | [db statement-and-params call-options] |
81 | | - (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))) |
82 | 94 |
|
83 | 95 | (defn query-handler |
84 | 96 | [db sql-and-params |
|
0 commit comments