Legend:
Library
Module
Module type
Parameter
Class
Class type
Request specification.
A Caqti request is a function to generate a query string from information about the driver, along with type descriptors to encode parameters and decode rows returned from the same query. Requests are passed to Caqti_connection_sig.S.call or one of its shortcut methods provided by a database connection handle.
The request often represent a prepared query, in which case it is static and can be be defined directly in a module scope. However, an optional oneshot parameter may be passed to indicate a dynamically generated query.
Primitives
type template =
| Lof string
(*
Literal code. May contain incomplete fragments.
*)
| Pof int
(*
P i refers to parameter number i, counting from 0.
A representation of a query string to send to a database, abstracting over parameter references and providing nested concatenation to simplify generation. For databases which only support linear parameters (typically denoted "?"), the driver will reshuffle, elide, and duplicate parameters as needed.
create arg_type row_type row_mult f is a request which takes parameters of type arg_type, returns rows of type row_type with multiplicity row_mult, and which sends query strings generated from the template f
di, where di is the Caqti_driver_info.t of the target driver. The driver is responsible for turning parameter references into a form accepted by the database, while other differences must be handled by f.
query_template req is the function which generates the query template for a driver for this request.
Convenience
In the following functions, queries are written out as plain strings with the following syntax, which is parsed by Caqti into a template before being passed to the drivers.
Parameters are specified as either
"?" for linear substitutions (like Sqlite and MariaDB), or
"$1", "$2", ... for non-linear substitutions (like PostgreSQL).
Mixing the two styles in the same query is not permitted. Note than numbering of non-linear parameters is offset by one compared to the query templates defined in the previous section, in order to be consistent with PostgreSQL.
Static references of the form
"$(<var>)" is substituted by env driver_info "<var>".
"$." is a shortcut for "$(.)".
are replaced by query fragments returned by the ?env argument of the functions below, and aids in substituting configurable fragments, like database schemas or table names. The latter form is suggested for qualifying tables, sequences, etc. with the main database schema. It should expand to a schema name followed by a dot, or empty if the database does not support schemas or the schema is unset.
create_p arg_type row_type row_mult f is a request which takes parameters of type arg_type, returns rows of type row_type with multiplicity row_mult, and which sends a query string based on a preliminary form given by f di, where di is the Caqti_driver_info.t of the target driver. The preliminary query string may contain occurrences of "?", which are replaced by successive parameter references. This is implemented as create
arg_type row_type (parse % f) where parse parses a string into a template.
parameteroneshot
For queries generated on-demand or which are otherwise executed only once, pass true do make the query non-prepared. By default queries are prepared, which is suitable for requests defined at the module level.
parameterenv
env driver_info key shall provide the value to substitute for a reference to key in the query string, or raise Not_found to indicate the reference to key is invalid. Not_found will be re-raised as Invalid_argument with additional information to help locate the bug.