sig
  type row = {
    src_ip : string;
    remote_username : string option;
    username : string option;
    t : Calendar.t;
    http_method : Weblogs.http_method;
    full_url : string;
    url : string;
    qs : string option;
    args : (string * string) list;
    http_version : string option;
    rcode : int option;
    size : int option;
    referer : string option;
    user_agent : string option;
    clickstream : string;
    server_sitename : string option;
    server_computername : string option;
    server_ip : string option;
    server_port : int option;
    time_taken : int option;
    proxy : string option;
    original : string;
    filename : string;
    lineno : int;
  }
  and http_method = GET | POST | HEAD | OTHER of string
  val string_of_row : Weblogs.row -> string
  type t = Weblogs.row list
  val import_file : ?filter:(Weblogs.row -> bool) -> string -> Weblogs.t
  val sort : Weblogs.t -> Weblogs.t
  val exclude_local : ?filename:string -> Weblogs.t -> Weblogs.t
  type referer_class =
      KnownSearchEngine of string * string
    | KnownDirectory of string
    | KnownEmailService of string
    | Other
  val referer_class : Weblogs.row -> Weblogs.referer_class
  val is_known_bot : Weblogs.row -> (string * float) option
  val is_web_browser : Weblogs.row -> string option
  val normalise_query : string -> string
  type visitor = Weblogs.row list
  val detect_visitors : Weblogs.t -> Weblogs.visitor list
  val import_rows : string -> (Weblogs.row -> unit) -> unit
  type visitors_handle
  val start_visitors : ?directory:string -> unit -> Weblogs.visitors_handle
  val open_visitors : ?directory:string -> unit -> Weblogs.visitors_handle
  val import_visitor_row : Weblogs.visitors_handle -> Weblogs.row -> unit
  val finalise_visitors : Weblogs.visitors_handle -> unit
  val count_visitors : Weblogs.visitors_handle -> int
  val iter_visitors :
    Weblogs.visitors_handle -> (Weblogs.visitor -> unit) -> unit
end