@@ -154,50 +154,59 @@ SELECT * FROM urls WHERE path like '%http://localhost%'"
154
154
155
155
(defn eval-sql-core
156
156
" The core SQL evaluation function."
157
- [& {:keys [db sql fetch-size max-rows]
157
+ [& {:keys [db sql-list fetch-size max-rows]
158
158
:or {db @ejc-sql.connect/db}}]
159
159
(set-db db)
160
160
(java.util.Locale/setDefault (java.util.Locale. " UK" ))
161
161
(try
162
- (if (select? sql)
163
- (list
164
- :result-set
165
- (with-open [conn (j/get-connection db)]
166
- (let [stmt (j/prepare-statement
167
- conn sql
168
- {:fetch-size (or fetch-size @o/fetch-size 0 )
169
- :max-rows (or max-rows
170
- (if (and (> @o/max-rows 0 )
171
- @o/show-too-many-rows-message)
172
- ; ; Get one more row to recognize that
173
- ; ; the actual number of records from this
174
- ; ; query is bigger than `max-rows`.
175
- (+ @o/max-rows 1 )
176
- @o/max-rows)
177
- 0 )})]
178
- (swap! current-query assoc
179
- :stmt stmt
180
- :conn conn)
181
- (j/query db stmt
182
- {:as-arrays? true
183
- :result-set-fn
184
- (fn [rs]
185
- (let [single-record?
186
- (not (next (next rs)))]
187
- (mapv
188
- #(clob-to-string-row
189
- % single-record?)
190
- rs)))}))))
191
- (let [result (first (j/execute! db (list sql)))
192
- msg (if (> result 0 )
193
- (str " Records affected: " result)
194
- " Executed" )]
195
- (when (ddl? sql)
196
- (invalidate-cache db))
197
- (list :message msg)))
162
+ (with-open [conn (j/get-connection db)]
163
+ (let [statement (.createStatement conn)]
164
+ (mapv (fn [sql]
165
+ (if (select? sql)
166
+ ; ; SELECT
167
+ (list
168
+ :result-set
169
+ (let [stmt (j/prepare-statement
170
+ conn sql
171
+ {:fetch-size (or fetch-size @o/fetch-size 0 )
172
+ :max-rows (or max-rows
173
+ (if (and (> @o/max-rows 0 )
174
+ @o/show-too-many-rows-message)
175
+ ; ; Get one more row to recognize that
176
+ ; ; the actual number of records from this
177
+ ; ; query is bigger than `max-rows`.
178
+ (+ @o/max-rows 1 )
179
+ @o/max-rows)
180
+ 0 )})]
181
+ (swap! current-query assoc
182
+ :stmt stmt
183
+ :conn conn)
184
+ (j/query db stmt
185
+ {:as-arrays? true
186
+ :result-set-fn
187
+ (fn [rs]
188
+ (let [single-record?
189
+ (not (next (next rs)))]
190
+ (mapv
191
+ #(clob-to-string-row
192
+ % single-record?)
193
+ rs)))})))
194
+ ; ; DML or DDL
195
+ (let [result-set? (.execute statement sql)
196
+ message (if-let [result (when
197
+ (and
198
+ (not result-set?)
199
+ (> (.getUpdateCount statement) 0 ))
200
+ (.getUpdateCount statement))]
201
+ (str " Records affected: " result)
202
+ " Executed" )]
203
+ (when (ddl? sql)
204
+ (invalidate-cache db))
205
+ (list :message message))))
206
+ sql-list)))
198
207
(catch SQLException e
199
- (list :message
200
- (o/unify-str " Error: " (.getMessage e))))))
208
+ [ (list :message
209
+ (o/unify-str " Error: " (.getMessage e)))] )))
201
210
202
211
(defn- eval-user-sql
203
212
" Receive raw SQL from the user, log it, divide by statements and eval them."
@@ -219,23 +228,24 @@ SELECT * FROM urls WHERE path like '%http://localhost%'"
219
228
[sql nil ])
220
229
sql (handle-special-cases db sql)
221
230
statement-separator-re (get-separator-re (or manual-separator " ;" ))
222
- results (doall
223
- (for [sql-part (filter
231
+ results (let [sql-parts (filter
224
232
; ; Remove parts contains comments only.
225
233
(fn [part]
226
234
(seq (s/trim
227
235
(s/replace part comments-re " " ))))
228
236
(if (or (not (:separator db)) manual-separator)
229
237
(s/split sql statement-separator-re)
230
- [sql]))]
231
- (let [[result-type result] (eval-sql-core :db db
232
- :sql sql-part
233
- :max-rows rows-limit
234
- :fetch-size fetch-size)]
235
- (if (= result-type :result-set )
236
- (o/print-table result fetch-size)
237
- (println result))
238
- [result-type result])))]
238
+ [sql]))
239
+ result-list (eval-sql-core :db db
240
+ :sql-list sql-parts
241
+ :max-rows rows-limit
242
+ :fetch-size fetch-size)
243
+ _ (doall
244
+ (for [[result-type result] result-list]
245
+ (if (= result-type :result-set )
246
+ (o/print-table result fetch-size)
247
+ (println result))))]
248
+ result-list)]
239
249
(complete
240
250
nil
241
251
:start-time (:start-time @current-query)
0 commit comments