sig
  type db
  type stmt
  type argument
  type sql_type = [ `BLOB | `FLOAT | `INTEGER | `NULL | `TEXT ]
  type sql_value =
      [ `BLOB of string
      | `FLOAT of float
      | `INT of int
      | `INT64 of int64
      | `NULL
      | `TEXT of string
      | `VALUE of Sqlite3.argument ]
  type ('a, 'b) fmt = ('b, unit, string, 'a) format4 -> 'b
  type error_code =
      ERROR
    | INTERNAL
    | PERM
    | ABORT
    | BUSY
    | LOCKED
    | NOMEM
    | READONLY
    | INTERRUPT
    | IOERR
    | CORRUPT
    | NOTFOUND
    | FULL
    | CANTOPEN
    | PROTOCOL
    | EMPTY
    | SCHEMA
    | TOOBIG
    | CONSTRAINT
    | MISMATCH
    | MISUSE
    | NOLFS
    | AUTH
    | FORMAT
    | RANGE
    | NOTADB
  exception Error of Sqlite3.error_code * string
  val version : string
  val init : unit
  external open_db : string -> Sqlite3.db = "ml_sqlite3_open"
  val close_db : Sqlite3.db -> unit
  external interrupt : Sqlite3.db -> unit = "ml_sqlite3_interrupt"
  external is_complete : string -> bool = "ml_sqlite3_complete"
  external last_insert_rowid : Sqlite3.db -> int64
    = "ml_sqlite3_last_insert_rowid"
  external changes : Sqlite3.db -> int = "ml_sqlite3_changes"
  external total_changes : Sqlite3.db -> int = "ml_sqlite3_total_changes"
  external get_autocommit : Sqlite3.db -> bool = "ml_sqlite3_get_autocommit"
  external sleep : int -> unit = "ml_sqlite3_sleep"
  external busy_set : Sqlite3.db -> (int -> [ `FAIL | `RETRY ]) -> unit
    = "ml_sqlite3_busy_handler"
  external busy_unset : Sqlite3.db -> unit = "ml_sqlite3_busy_handler_unset"
  external busy_timeout : Sqlite3.db -> int -> unit
    = "ml_sqlite3_busy_timeout"
  external trace_set : Sqlite3.db -> (string -> unit) -> unit
    = "ml_sqlite3_trace"
  external trace_unset : Sqlite3.db -> unit = "ml_sqlite3_trace_unset"
  external progress_handler_set : Sqlite3.db -> int -> (unit -> unit) -> unit
    = "ml_sqlite3_progress_handler"
  external progress_handler_unset : Sqlite3.db -> unit
    = "ml_sqlite3_progress_handler_unset"
  external finalize_stmt : Sqlite3.stmt -> unit = "ml_sqlite3_finalize_noerr"
  val prepare_one : Sqlite3.db -> string -> Sqlite3.stmt
  val prepare_one_f : Sqlite3.db -> (Sqlite3.stmt, 'a) Sqlite3.fmt
  external reset : Sqlite3.stmt -> unit = "ml_sqlite3_reset"
  external expired : Sqlite3.stmt -> bool = "ml_sqlite3_expired"
  external step : Sqlite3.stmt -> [ `DONE | `ROW ] = "ml_sqlite3_step"
  external bind : Sqlite3.stmt -> int -> Sqlite3.sql_value -> unit
    = "ml_sqlite3_bind"
  external bind_parameter_count : Sqlite3.stmt -> int
    = "ml_sqlite3_bind_parameter_count"
  external bind_parameter_index : Sqlite3.stmt -> string -> int
    = "ml_sqlite3_bind_parameter_index"
  external bind_parameter_name : Sqlite3.stmt -> int -> string
    = "ml_sqlite3_bind_parameter_name"
  external clear_bindings : Sqlite3.stmt -> unit
    = "ml_sqlite3_clear_bindings"
  external transfer_bindings : Sqlite3.stmt -> Sqlite3.stmt -> unit
    = "ml_sqlite3_transfer_bindings"
  external column_blob : Sqlite3.stmt -> int -> string
    = "ml_sqlite3_column_blob"
  external column_double : Sqlite3.stmt -> int -> float
    = "ml_sqlite3_column_double"
  external column_int : Sqlite3.stmt -> int -> int = "ml_sqlite3_column_int"
  external column_int64 : Sqlite3.stmt -> int -> int64
    = "ml_sqlite3_column_int64"
  external column_text : Sqlite3.stmt -> int -> string
    = "ml_sqlite3_column_text"
  external column_type : Sqlite3.stmt -> int -> Sqlite3.sql_type
    = "ml_sqlite3_column_type"
  external data_count : Sqlite3.stmt -> int = "ml_sqlite3_data_count"
  external column_count : Sqlite3.stmt -> int = "ml_sqlite3_column_count"
  external column_name : Sqlite3.stmt -> int -> string
    = "ml_sqlite3_column_name"
  external column_decltype : Sqlite3.stmt -> int -> string
    = "ml_sqlite3_column_decltype"
  external value_blob : Sqlite3.argument -> string = "ml_sqlite3_value_blob"
  external value_double : Sqlite3.argument -> float
    = "ml_sqlite3_value_double"
  external value_int : Sqlite3.argument -> int = "ml_sqlite3_value_int"
  external value_int64 : Sqlite3.argument -> int64 = "ml_sqlite3_value_int64"
  external value_text : Sqlite3.argument -> string = "ml_sqlite3_value_text"
  external value_type : Sqlite3.argument -> Sqlite3.sql_type
    = "ml_sqlite3_value_type"
  val create_fun_N :
    Sqlite3.db ->
    string -> (Sqlite3.argument array -> Sqlite3.sql_value) -> unit
  val create_fun_0 :
    Sqlite3.db -> string -> (unit -> Sqlite3.sql_value) -> unit
  val create_fun_1 :
    Sqlite3.db -> string -> (Sqlite3.argument -> Sqlite3.sql_value) -> unit
  val create_fun_2 :
    Sqlite3.db ->
    string ->
    (Sqlite3.argument -> Sqlite3.argument -> Sqlite3.sql_value) -> unit
  val create_fun_3 :
    Sqlite3.db ->
    string ->
    (Sqlite3.argument ->
     Sqlite3.argument -> Sqlite3.argument -> Sqlite3.sql_value) ->
    unit
  external delete_function : Sqlite3.db -> string -> unit
    = "ml_sqlite3_delete_function"
  val do_step : Sqlite3.stmt -> unit
  val fold_step : ('-> Sqlite3.stmt -> 'a) -> '-> Sqlite3.stmt -> 'a
  val bind_and_exec : Sqlite3.stmt -> Sqlite3.sql_value list -> unit
  val bind_fetch :
    Sqlite3.stmt ->
    Sqlite3.sql_value list -> ('-> Sqlite3.stmt -> 'a) -> '-> 'a
  val fold_prepare :
    Sqlite3.db -> string -> ('-> Sqlite3.stmt -> 'a) -> '-> 'a
  val fold_prepare_bind :
    Sqlite3.db ->
    string ->
    Sqlite3.sql_value list -> ('-> Sqlite3.stmt -> 'a) -> '-> 'a
  val exec : Sqlite3.db -> string -> unit
  val fetch : Sqlite3.db -> string -> ('-> Sqlite3.stmt -> 'a) -> '-> 'a
  val exec_v : Sqlite3.db -> string -> Sqlite3.sql_value list -> unit
  val fetch_v :
    Sqlite3.db ->
    string ->
    Sqlite3.sql_value list -> ('-> Sqlite3.stmt -> 'a) -> '-> 'a
  val fold_prepare_f :
    Sqlite3.db -> (('-> Sqlite3.stmt -> 'a) -> '-> 'a, 'b) Sqlite3.fmt
  val fold_prepare_bind_f :
    Sqlite3.db ->
    (Sqlite3.sql_value list -> ('-> Sqlite3.stmt -> 'a) -> '-> 'a, 'b)
    Sqlite3.fmt
  val exec_f : Sqlite3.db -> (unit, 'a) Sqlite3.fmt
  val fetch_f :
    Sqlite3.db -> (('-> Sqlite3.stmt -> 'a) -> '-> 'a, 'b) Sqlite3.fmt
  val exec_fv :
    Sqlite3.db -> (Sqlite3.sql_value list -> unit, 'a) Sqlite3.fmt
  val fetch_fv :
    Sqlite3.db ->
    (Sqlite3.sql_value list -> ('-> Sqlite3.stmt -> 'a) -> '-> 'a, 'b)
    Sqlite3.fmt
  val sql_escape : string -> string
  val blob_escape : string -> string
  val transaction :
    ?kind:[ `DEFERRED | `EXCLUSIVE | `IMMEDIATE ] ->
    Sqlite3.db -> (Sqlite3.db -> 'a) -> 'a
end