Sean Corfield <[email protected]> writes:
>> The required steps to setup streaming are different from database to
>> database and I guess they may change with the driver version being used.
>
> This is really the crux of the problem here – I’m not sure what java.jdbc can
> do generically to make this much easier.
Please take a look at the attachment or
https://gist.github.com/schmir/6e03b3d649950d0108a06bf6fd653dec
This is using the robert.hooke library to hook into prepare-statement.
That hook calls into a protocol function if streaming is required. This
protocol function can be defined by users for the database they are
using.
I think it would be really nice for clojure.java.jdbc to provide this
functionality.
--
Cheers
Ralf
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.
(ns soka-trb.jdbc-streaming
"streaming results in clojure.java.jdbc, when {:use-streaming? true} is passed
as option
hooks into jdbc/prepare-statements and calls turn-on-streaming
Users need to extend the TurnOnStreaming protocol for their databases
"
(:require [clojure.java.jdbc :as jdbc]
[robert.hooke]))
(defprotocol TurnOnStreaming
(turn-on-streaming [con opts]))
(extend-protocol TurnOnStreaming
org.sqlite.SQLiteConnection
(turn-on-streaming [con opts] opts)
org.postgresql.jdbc.PgConnection
(turn-on-streaming [con opts]
(.setAutoCommit con false)
(if (pos? (get opts :fetch-size 0))
opts
(assoc opts :fetch-size 1000)))
com.mysql.jdbc.JDBC4Connection
(turn-on-streaming [con opts]
(assoc opts :fetch-size Integer/MIN_VALUE)))
(defn prepare-statement
([f con sql] (prepare-statement f con sql {}))
([f
^java.sql.Connection con
^String sql
{:keys [return-keys result-type concurrency cursors
fetch-size max-rows timeout use-streaming?] :as opts}]
(if use-streaming?
(f con sql (turn-on-streaming con opts))
(f con sql opts))))
(defn add-hook
[]
(robert.hooke/add-hook #'jdbc/prepare-statement #'prepare-statement))