sig
  type 'a result = 'Lwt.t
  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) 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 -> db
  val close_db : db -> unit
  val borrow_worker : db -> (db -> 'a result) -> 'a result
  val steal_worker : db -> (db -> 'a result) -> 'a result
  val execute : db -> ('a, unit result) statement -> 'a
  val insert : db -> ('a, int64 result) statement -> 'a
  val select : db -> ('a, 'b, 'b list result) expression -> 'a
  val select_f :
    db -> ('-> 'b result) -> ('c, 'a, 'b list result) expression -> 'c
  val select_one : db -> ('a, 'b, 'b result) expression -> 'a
  val select_one_maybe : db -> ('a, 'b, 'b option result) expression -> 'a
  val select_one_f :
    db -> ('-> 'b result) -> ('c, 'a, 'b result) expression -> 'c
  val select_one_f_maybe :
    db -> ('-> 'b result) -> ('c, 'a, 'b option result) expression -> 'c
  val transaction : db -> (db -> 'a result) -> 'a result
  val fold :
    db ->
    ('-> '-> 'a result) -> '-> ('c, 'b, 'a result) expression -> 'c
  val iter :
    db -> ('-> unit result) -> ('b, 'a, unit result) expression -> 'b
  module Directives :
    sig
      type ('a, 'b) directive =
          (Sqlexpr_sqlite.st -> 'b) -> Sqlexpr_sqlite.st -> 'a
      val literal : string -> ('a, 'a) directive
      val int : (int -> 'a, 'a) directive
      val text : (string -> 'a, 'a) directive
      val blob : (string -> 'a, 'a) directive
      val float : (float -> 'a, 'a) directive
      val int32 : (int32 -> 'a, 'a) directive
      val int64 : (int64 -> 'a, 'a) directive
      val bool : (bool -> 'a, 'a) directive
      val any : (('-> string) -> '-> 'b, 'b) directive
      val maybe_int : (int option -> 'a, 'a) directive
      val maybe_text : (string option -> 'a, 'a) directive
      val maybe_blob : (string option -> 'a, 'a) directive
      val maybe_float : (float option -> 'a, 'a) directive
      val maybe_int32 : (int32 option -> 'a, 'a) directive
      val maybe_int64 : (int64 option -> 'a, 'a) directive
      val maybe_bool : (bool option -> 'a, 'a) directive
      val maybe_any : (('-> string) -> 'a option -> 'b, 'b) 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
  val set_max_threads : int -> int
end