sig
  type 'a result
  type ('a, 'b) statement = {
    sql_statement : string;
    stmt_id : string option;
    directive : (Sqlexpr_sqlite.st -> 'b) -> Sqlexpr_sqlite.st -> 'a;
  }
  type ('a, 'b, 'c) expression = {
    statement : ('a, 'c) Sqlexpr_sqlite.S.statement;
    get_data : int * (Sqlite3.Data.t array -> 'b);
  }
  type db
  exception Error of string * exn
  exception Sqlite_error of string * Sqlite3.Rc.t
  val open_db : ?init:(Sqlite3.db -> unit) -> string -> Sqlexpr_sqlite.S.db
  val close_db : Sqlexpr_sqlite.S.db -> unit
  val borrow_worker :
    Sqlexpr_sqlite.S.db ->
    (Sqlexpr_sqlite.S.db -> 'Sqlexpr_sqlite.S.result) ->
    'Sqlexpr_sqlite.S.result
  val steal_worker :
    Sqlexpr_sqlite.S.db ->
    (Sqlexpr_sqlite.S.db -> 'Sqlexpr_sqlite.S.result) ->
    'Sqlexpr_sqlite.S.result
  val execute :
    Sqlexpr_sqlite.S.db ->
    ('a, unit Sqlexpr_sqlite.S.result) Sqlexpr_sqlite.S.statement -> 'a
  val insert :
    Sqlexpr_sqlite.S.db ->
    ('a, int64 Sqlexpr_sqlite.S.result) Sqlexpr_sqlite.S.statement -> 'a
  val select :
    Sqlexpr_sqlite.S.db ->
    ('a, 'b, 'b list Sqlexpr_sqlite.S.result) Sqlexpr_sqlite.S.expression ->
    'a
  val select_f :
    Sqlexpr_sqlite.S.db ->
    ('-> 'Sqlexpr_sqlite.S.result) ->
    ('c, 'a, 'b list Sqlexpr_sqlite.S.result) Sqlexpr_sqlite.S.expression ->
    'c
  val select_one :
    Sqlexpr_sqlite.S.db ->
    ('a, 'b, 'Sqlexpr_sqlite.S.result) Sqlexpr_sqlite.S.expression -> 'a
  val select_one_maybe :
    Sqlexpr_sqlite.S.db ->
    ('a, 'b, 'b option Sqlexpr_sqlite.S.result) Sqlexpr_sqlite.S.expression ->
    'a
  val select_one_f :
    Sqlexpr_sqlite.S.db ->
    ('-> 'Sqlexpr_sqlite.S.result) ->
    ('c, 'a, 'Sqlexpr_sqlite.S.result) Sqlexpr_sqlite.S.expression -> 'c
  val select_one_f_maybe :
    Sqlexpr_sqlite.S.db ->
    ('-> 'Sqlexpr_sqlite.S.result) ->
    ('c, 'a, 'b option Sqlexpr_sqlite.S.result) Sqlexpr_sqlite.S.expression ->
    'c
  val transaction :
    Sqlexpr_sqlite.S.db ->
    (Sqlexpr_sqlite.S.db -> 'Sqlexpr_sqlite.S.result) ->
    'Sqlexpr_sqlite.S.result
  val fold :
    Sqlexpr_sqlite.S.db ->
    ('-> '-> 'Sqlexpr_sqlite.S.result) ->
    '->
    ('c, 'b, 'Sqlexpr_sqlite.S.result) Sqlexpr_sqlite.S.expression -> 'c
  val iter :
    Sqlexpr_sqlite.S.db ->
    ('-> unit Sqlexpr_sqlite.S.result) ->
    ('b, 'a, unit Sqlexpr_sqlite.S.result) Sqlexpr_sqlite.S.expression -> 'b
  module Directives :
    sig
      type ('a, 'b) directive =
          (Sqlexpr_sqlite.st -> 'b) -> Sqlexpr_sqlite.st -> 'a
      val literal : string -> ('a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val int : (int -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val text : (string -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val blob : (string -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val float : (float -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val int32 : (int32 -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val int64 : (int64 -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val bool : (bool -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val any :
        (('-> string) -> '-> 'b, 'b)
        Sqlexpr_sqlite.S.Directives.directive
      val maybe_int :
        (int option -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val maybe_text :
        (string option -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val maybe_blob :
        (string option -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val maybe_float :
        (float option -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val maybe_int32 :
        (int32 option -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val maybe_int64 :
        (int64 option -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val maybe_bool :
        (bool option -> 'a, 'a) Sqlexpr_sqlite.S.Directives.directive
      val maybe_any :
        (('-> string) -> 'a option -> 'b, 'b)
        Sqlexpr_sqlite.S.Directives.directive
    end
  module Conversion :
    sig
      val text : Sqlite3.Data.t -> string
      val blob : Sqlite3.Data.t -> string
      val int : Sqlite3.Data.t -> int
      val int32 : Sqlite3.Data.t -> int32
      val int64 : Sqlite3.Data.t -> int64
      val float : Sqlite3.Data.t -> float
      val bool : Sqlite3.Data.t -> bool
      val maybe : (Sqlite3.Data.t -> 'a) -> Sqlite3.Data.t -> 'a option
      val maybe_text : Sqlite3.Data.t -> string option
      val maybe_blob : Sqlite3.Data.t -> string option
      val maybe_int : Sqlite3.Data.t -> int option
      val maybe_int32 : Sqlite3.Data.t -> int32 option
      val maybe_int64 : Sqlite3.Data.t -> int64 option
      val maybe_float : Sqlite3.Data.t -> float option
      val maybe_bool : Sqlite3.Data.t -> bool option
    end
end