sig
  module type THREAD =
    sig
      type 'a t
      val return : '-> 'PGOCaml_generic.THREAD.t
      val ( >>= ) :
        'PGOCaml_generic.THREAD.t ->
        ('-> 'PGOCaml_generic.THREAD.t) -> 'PGOCaml_generic.THREAD.t
      val fail : exn -> 'PGOCaml_generic.THREAD.t
      val catch :
        (unit -> 'PGOCaml_generic.THREAD.t) ->
        (exn -> 'PGOCaml_generic.THREAD.t) -> 'PGOCaml_generic.THREAD.t
      type in_channel
      type out_channel
      val open_connection :
        Unix.sockaddr ->
        (PGOCaml_generic.THREAD.in_channel *
         PGOCaml_generic.THREAD.out_channel)
        PGOCaml_generic.THREAD.t
      val output_char :
        PGOCaml_generic.THREAD.out_channel ->
        char -> unit PGOCaml_generic.THREAD.t
      val output_binary_int :
        PGOCaml_generic.THREAD.out_channel ->
        int -> unit PGOCaml_generic.THREAD.t
      val output_string :
        PGOCaml_generic.THREAD.out_channel ->
        string -> unit PGOCaml_generic.THREAD.t
      val flush :
        PGOCaml_generic.THREAD.out_channel -> unit PGOCaml_generic.THREAD.t
      val input_char :
        PGOCaml_generic.THREAD.in_channel -> char PGOCaml_generic.THREAD.t
      val input_binary_int :
        PGOCaml_generic.THREAD.in_channel -> int PGOCaml_generic.THREAD.t
      val really_input :
        PGOCaml_generic.THREAD.in_channel ->
        string -> int -> int -> unit PGOCaml_generic.THREAD.t
      val close_in :
        PGOCaml_generic.THREAD.in_channel -> unit PGOCaml_generic.THREAD.t
    end
  module type PGOCAML_GENERIC =
    sig
      type 'a t
      type 'a monad
      type isolation =
          [ `Read_committed
          | `Read_uncommitted
          | `Repeatable_read
          | `Serializable ]
      type access = [ `Read_only | `Read_write ]
      exception Error of string
      exception PostgreSQL_Error of string * (char * string) list
      val connect :
        ?host:string ->
        ?port:int ->
        ?user:string ->
        ?password:string ->
        ?database:string ->
        ?unix_domain_socket_dir:string ->
        unit ->
        'PGOCaml_generic.PGOCAML_GENERIC.t
        PGOCaml_generic.PGOCAML_GENERIC.monad
      val close :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        unit PGOCaml_generic.PGOCAML_GENERIC.monad
      val ping :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        unit PGOCaml_generic.PGOCAML_GENERIC.monad
      val alive :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        bool PGOCaml_generic.PGOCAML_GENERIC.monad
      val begin_work :
        ?isolation:PGOCaml_generic.PGOCAML_GENERIC.isolation ->
        ?access:PGOCaml_generic.PGOCAML_GENERIC.access ->
        ?deferrable:bool ->
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        unit PGOCaml_generic.PGOCAML_GENERIC.monad
      val commit :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        unit PGOCaml_generic.PGOCAML_GENERIC.monad
      val rollback :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        unit PGOCaml_generic.PGOCAML_GENERIC.monad
      val transact :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        ?isolation:PGOCaml_generic.PGOCAML_GENERIC.isolation ->
        ?access:PGOCaml_generic.PGOCAML_GENERIC.access ->
        ?deferrable:bool ->
        ('PGOCaml_generic.PGOCAML_GENERIC.t ->
         'PGOCaml_generic.PGOCAML_GENERIC.monad) ->
        'PGOCaml_generic.PGOCAML_GENERIC.monad
      val serial :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        string -> int64 PGOCaml_generic.PGOCAML_GENERIC.monad
      val serial4 :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        string -> int32 PGOCaml_generic.PGOCAML_GENERIC.monad
      val serial8 :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        string -> int64 PGOCaml_generic.PGOCAML_GENERIC.monad
      val max_message_length : int Pervasives.ref
      val verbose : int Pervasives.ref
      val set_private_data :
        'PGOCaml_generic.PGOCAML_GENERIC.t -> '-> unit
      val private_data : 'PGOCaml_generic.PGOCAML_GENERIC.t -> 'a
      val uuid : 'PGOCaml_generic.PGOCAML_GENERIC.t -> string
      type pa_pg_data = (string, bool) Hashtbl.t
      type oid = int32
      type param = string option
      type result = string option
      type row = PGOCaml_generic.PGOCAML_GENERIC.result list
      val prepare :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        query:string ->
        ?name:string ->
        ?types:PGOCaml_generic.PGOCAML_GENERIC.oid list ->
        unit -> unit PGOCaml_generic.PGOCAML_GENERIC.monad
      val execute_rev :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        ?name:string ->
        ?portal:string ->
        params:PGOCaml_generic.PGOCAML_GENERIC.param list ->
        unit ->
        PGOCaml_generic.PGOCAML_GENERIC.row list
        PGOCaml_generic.PGOCAML_GENERIC.monad
      val execute :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        ?name:string ->
        ?portal:string ->
        params:PGOCaml_generic.PGOCAML_GENERIC.param list ->
        unit ->
        PGOCaml_generic.PGOCAML_GENERIC.row list
        PGOCaml_generic.PGOCAML_GENERIC.monad
      val cursor :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        ?name:string ->
        ?portal:string ->
        params:PGOCaml_generic.PGOCAML_GENERIC.param list ->
        (PGOCaml_generic.PGOCAML_GENERIC.row ->
         unit PGOCaml_generic.PGOCAML_GENERIC.monad) ->
        unit PGOCaml_generic.PGOCAML_GENERIC.monad
      val close_statement :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        ?name:string -> unit -> unit PGOCaml_generic.PGOCAML_GENERIC.monad
      val close_portal :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        ?portal:string -> unit -> unit PGOCaml_generic.PGOCAML_GENERIC.monad
      val inject :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        ?name:string ->
        string ->
        PGOCaml_generic.PGOCAML_GENERIC.row list
        PGOCaml_generic.PGOCAML_GENERIC.monad
      val alter :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        ?name:string -> string -> unit PGOCaml_generic.PGOCAML_GENERIC.monad
      type row_description =
          PGOCaml_generic.PGOCAML_GENERIC.result_description list
      and result_description = {
        name : string;
        table : PGOCaml_generic.PGOCAML_GENERIC.oid option;
        column : int option;
        field_type : PGOCaml_generic.PGOCAML_GENERIC.oid;
        length : int;
        modifier : int32;
      }
      type params_description =
          PGOCaml_generic.PGOCAML_GENERIC.param_description list
      and param_description = {
        param_type : PGOCaml_generic.PGOCAML_GENERIC.oid;
      }
      val describe_statement :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        ?name:string ->
        unit ->
        (PGOCaml_generic.PGOCAML_GENERIC.params_description *
         PGOCaml_generic.PGOCAML_GENERIC.row_description option)
        PGOCaml_generic.PGOCAML_GENERIC.monad
      val describe_portal :
        'PGOCaml_generic.PGOCAML_GENERIC.t ->
        ?portal:string ->
        unit ->
        PGOCaml_generic.PGOCAML_GENERIC.row_description option
        PGOCaml_generic.PGOCAML_GENERIC.monad
      val name_of_type :
        ?modifier:int32 -> PGOCaml_generic.PGOCAML_GENERIC.oid -> string
      type inet = Unix.inet_addr * int
      type timestamptz = CalendarLib.Calendar.t * CalendarLib.Time_Zone.t
      type int16 = int
      type bytea = string
      type point = float * float
      type hstore = (string * string option) list
      type numeric = string
      type bool_array = bool option list
      type int32_array = int32 option list
      type int64_array = int64 option list
      type string_array = string option list
      type float_array = float option list
      val string_of_oid : PGOCaml_generic.PGOCAML_GENERIC.oid -> string
      val string_of_bool : bool -> string
      val string_of_int : int -> string
      val string_of_int16 : PGOCaml_generic.PGOCAML_GENERIC.int16 -> string
      val string_of_int32 : int32 -> string
      val string_of_int64 : int64 -> string
      val string_of_float : float -> string
      val string_of_point : PGOCaml_generic.PGOCAML_GENERIC.point -> string
      val string_of_hstore : PGOCaml_generic.PGOCAML_GENERIC.hstore -> string
      val string_of_numeric :
        PGOCaml_generic.PGOCAML_GENERIC.numeric -> string
      val string_of_inet : PGOCaml_generic.PGOCAML_GENERIC.inet -> string
      val string_of_timestamp : CalendarLib.Calendar.t -> string
      val string_of_timestamptz :
        PGOCaml_generic.PGOCAML_GENERIC.timestamptz -> string
      val string_of_date : CalendarLib.Date.t -> string
      val string_of_time : CalendarLib.Time.t -> string
      val string_of_interval : CalendarLib.Calendar.Period.t -> string
      val string_of_bytea : PGOCaml_generic.PGOCAML_GENERIC.bytea -> string
      val string_of_string : string -> string
      val string_of_unit : unit -> string
      val string_of_bool_array :
        PGOCaml_generic.PGOCAML_GENERIC.bool_array -> string
      val string_of_int32_array :
        PGOCaml_generic.PGOCAML_GENERIC.int32_array -> string
      val string_of_int64_array :
        PGOCaml_generic.PGOCAML_GENERIC.int64_array -> string
      val string_of_string_array :
        PGOCaml_generic.PGOCAML_GENERIC.string_array -> string
      val string_of_float_array :
        PGOCaml_generic.PGOCAML_GENERIC.float_array -> string
      val oid_of_string : string -> PGOCaml_generic.PGOCAML_GENERIC.oid
      val bool_of_string : string -> bool
      val int_of_string : string -> int
      val int16_of_string : string -> PGOCaml_generic.PGOCAML_GENERIC.int16
      val int32_of_string : string -> int32
      val int64_of_string : string -> int64
      val float_of_string : string -> float
      val point_of_string : string -> PGOCaml_generic.PGOCAML_GENERIC.point
      val hstore_of_string : string -> PGOCaml_generic.PGOCAML_GENERIC.hstore
      val numeric_of_string :
        string -> PGOCaml_generic.PGOCAML_GENERIC.numeric
      val inet_of_string : string -> PGOCaml_generic.PGOCAML_GENERIC.inet
      val timestamp_of_string : string -> CalendarLib.Calendar.t
      val timestamptz_of_string :
        string -> PGOCaml_generic.PGOCAML_GENERIC.timestamptz
      val date_of_string : string -> CalendarLib.Date.t
      val time_of_string : string -> CalendarLib.Time.t
      val interval_of_string : string -> CalendarLib.Calendar.Period.t
      val bytea_of_string : string -> PGOCaml_generic.PGOCAML_GENERIC.bytea
      val unit_of_string : string -> unit
      val bool_array_of_string :
        string -> PGOCaml_generic.PGOCAML_GENERIC.bool_array
      val int32_array_of_string :
        string -> PGOCaml_generic.PGOCAML_GENERIC.int32_array
      val int64_array_of_string :
        string -> PGOCaml_generic.PGOCAML_GENERIC.int64_array
      val string_array_of_string :
        string -> PGOCaml_generic.PGOCAML_GENERIC.string_array
      val float_array_of_string :
        string -> PGOCaml_generic.PGOCAML_GENERIC.float_array
      val bind :
        'PGOCaml_generic.PGOCAML_GENERIC.monad ->
        ('-> 'PGOCaml_generic.PGOCAML_GENERIC.monad) ->
        'PGOCaml_generic.PGOCAML_GENERIC.monad
      val return : '-> 'PGOCaml_generic.PGOCAML_GENERIC.monad
    end
  module Make :
    functor (Thread : THREAD->
      sig
        type 'a t
        type 'a monad = 'Thread.t
        type isolation =
            [ `Read_committed
            | `Read_uncommitted
            | `Repeatable_read
            | `Serializable ]
        type access = [ `Read_only | `Read_write ]
        exception Error of string
        exception PostgreSQL_Error of string * (char * string) list
        val connect :
          ?host:string ->
          ?port:int ->
          ?user:string ->
          ?password:string ->
          ?database:string ->
          ?unix_domain_socket_dir:string -> unit -> 'a t monad
        val close : 'a t -> unit monad
        val ping : 'a t -> unit monad
        val alive : 'a t -> bool monad
        val begin_work :
          ?isolation:isolation ->
          ?access:access -> ?deferrable:bool -> 'a t -> unit monad
        val commit : 'a t -> unit monad
        val rollback : 'a t -> unit monad
        val transact :
          'a t ->
          ?isolation:isolation ->
          ?access:access ->
          ?deferrable:bool -> ('a t -> 'b monad) -> 'b monad
        val serial : 'a t -> string -> int64 monad
        val serial4 : 'a t -> string -> int32 monad
        val serial8 : 'a t -> string -> int64 monad
        val max_message_length : int ref
        val verbose : int ref
        val set_private_data : 'a t -> '-> unit
        val private_data : 'a t -> 'a
        val uuid : 'a t -> string
        type pa_pg_data = (string, bool) Hashtbl.t
        type oid = int32
        type param = string option
        type result = string option
        type row = result list
        val prepare :
          'a t ->
          query:string ->
          ?name:string -> ?types:oid list -> unit -> unit monad
        val execute_rev :
          'a t ->
          ?name:string ->
          ?portal:string -> params:param list -> unit -> row list monad
        val execute :
          'a t ->
          ?name:string ->
          ?portal:string -> params:param list -> unit -> row list monad
        val cursor :
          'a t ->
          ?name:string ->
          ?portal:string ->
          params:param list -> (row -> unit monad) -> unit monad
        val close_statement : 'a t -> ?name:string -> unit -> unit monad
        val close_portal : 'a t -> ?portal:string -> unit -> unit monad
        val inject : 'a t -> ?name:string -> string -> row list monad
        val alter : 'a t -> ?name:string -> string -> unit monad
        type row_description = result_description list
        and result_description = {
          name : string;
          table : oid option;
          column : int option;
          field_type : oid;
          length : int;
          modifier : int32;
        }
        type params_description = param_description list
        and param_description = { param_type : oid; }
        val describe_statement :
          'a t ->
          ?name:string ->
          unit -> (params_description * row_description option) monad
        val describe_portal :
          'a t -> ?portal:string -> unit -> row_description option monad
        val name_of_type : ?modifier:int32 -> oid -> string
        type inet = Unix.inet_addr * int
        type timestamptz = CalendarLib.Calendar.t * CalendarLib.Time_Zone.t
        type int16 = int
        type bytea = string
        type point = float * float
        type hstore = (string * string option) list
        type numeric = string
        type bool_array = bool option list
        type int32_array = int32 option list
        type int64_array = int64 option list
        type string_array = string option list
        type float_array = float option list
        val string_of_oid : oid -> string
        val string_of_bool : bool -> string
        val string_of_int : int -> string
        val string_of_int16 : int16 -> string
        val string_of_int32 : int32 -> string
        val string_of_int64 : int64 -> string
        val string_of_float : float -> string
        val string_of_point : point -> string
        val string_of_hstore : hstore -> string
        val string_of_numeric : numeric -> string
        val string_of_inet : inet -> string
        val string_of_timestamp : CalendarLib.Calendar.t -> string
        val string_of_timestamptz : timestamptz -> string
        val string_of_date : CalendarLib.Date.t -> string
        val string_of_time : CalendarLib.Time.t -> string
        val string_of_interval : CalendarLib.Calendar.Period.t -> string
        val string_of_bytea : bytea -> string
        val string_of_string : string -> string
        val string_of_unit : unit -> string
        val string_of_bool_array : bool_array -> string
        val string_of_int32_array : int32_array -> string
        val string_of_int64_array : int64_array -> string
        val string_of_string_array : string_array -> string
        val string_of_float_array : float_array -> string
        val oid_of_string : string -> oid
        val bool_of_string : string -> bool
        val int_of_string : string -> int
        val int16_of_string : string -> int16
        val int32_of_string : string -> int32
        val int64_of_string : string -> int64
        val float_of_string : string -> float
        val point_of_string : string -> point
        val hstore_of_string : string -> hstore
        val numeric_of_string : string -> numeric
        val inet_of_string : string -> inet
        val timestamp_of_string : string -> CalendarLib.Calendar.t
        val timestamptz_of_string : string -> timestamptz
        val date_of_string : string -> CalendarLib.Date.t
        val time_of_string : string -> CalendarLib.Time.t
        val interval_of_string : string -> CalendarLib.Calendar.Period.t
        val bytea_of_string : string -> bytea
        val unit_of_string : string -> unit
        val bool_array_of_string : string -> bool_array
        val int32_array_of_string : string -> int32_array
        val int64_array_of_string : string -> int64_array
        val string_array_of_string : string -> string_array
        val float_array_of_string : string -> float_array
        val bind : 'a monad -> ('-> 'b monad) -> 'b monad
        val return : '-> 'a monad
      end
end