next-jdbc/src/next/jdbc/protocols.clj
vemv ae9ffd9a09 Make Transactable extensible via metadata
This is the only missing piece for a metadata-based no-op "component".
2022-08-01 03:38:21 +02:00

63 lines
2.8 KiB
Clojure

;; copyright (c) 2018-2021 Sean Corfield, all rights reserved
(ns next.jdbc.protocols
"This is the extensible core of the next generation java.jdbc library.
* `Sourceable` -- for producing `javax.sql.DataSource` objects,
* `Connectable` -- for producing new `java.sql.Connection` objects,
* `Executable` -- for executing SQL operations,
* `Preparable` -- for producing new `java.sql.PreparedStatement` objects,
* `Transactable` -- for executing SQL operations transactionally.")
(set! *warn-on-reflection* true)
(defprotocol Sourceable :extend-via-metadata true
"Protocol for producing a `javax.sql.DataSource`.
Implementations are provided for strings, hash maps (`db-spec` structures),
and also a `DataSource` (which just returns itself).
Extension via metadata is supported."
(get-datasource ^javax.sql.DataSource [this]
"Produce a `javax.sql.DataSource`."))
(defprotocol Connectable
"Protocol for producing a new JDBC connection that should be closed when you
are finished with it.
Implementations are provided for `DataSource`, `PreparedStatement`, and
`Object`, on the assumption that an `Object` can be turned into a `DataSource`."
(get-connection ^java.sql.Connection [this opts]
"Produce a new `java.sql.Connection` for use with `with-open`."))
(defprotocol Executable
"Protocol for executing SQL operations.
Implementations are provided for `Connection`, `DataSource`,
`PreparedStatement`, and `Object`, on the assumption that an `Object` can be
turned into a `DataSource` and therefore used to get a `Connection`."
(-execute ^clojure.lang.IReduceInit [this sql-params opts]
"Produce a 'reducible' that, when reduced, executes the SQL and
processes the rows of the `ResultSet` directly.")
(-execute-one [this sql-params opts]
"Executes the SQL or DDL and produces the first row of the `ResultSet`
as a fully-realized, datafiable hash map (by default).")
(-execute-all [this sql-params opts]
"Executes the SQL and produces (by default) a vector of
fully-realized, datafiable hash maps from the `ResultSet`."))
(defprotocol Preparable
"Protocol for producing a new `java.sql.PreparedStatement` that should
be closed after use. Can be used by `Executable` functions.
Implementation is provided for `Connection` only."
(prepare ^java.sql.PreparedStatement [this sql-params opts]
"Produce a new `java.sql.PreparedStatement` for use with `with-open`."))
(defprotocol Transactable :extend-via-metadata true
"Protocol for running SQL operations in a transaction.
Implementations are provided for `Connection`, `DataSource`, and `Object`
(on the assumption that an `Object` can be turned into a `DataSource`)."
(-transact [this body-fn opts]
"Run the `body-fn` inside a transaction."))