(* * Copyright (c) 2018-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. *) open! IStd module F = Format module L = Logging let select_all_procedures_like_statement = ResultsDatabase.register_statement "SELECT * FROM procedures WHERE proc_name_hum LIKE :proc_name_like AND source_file LIKE \ :source_file_like" let pp_all ?filter ~proc_name ~attr_kind ~source_file ~proc_attributes fmt () = let source_file_like, proc_name_like = match filter with | None -> let wildcard = Sqlite3.Data.TEXT "%" in (wildcard, wildcard) | Some filter_string -> match String.lsplit2 ~on:':' filter_string with | Some (source_file_like, proc_name_like) -> (Sqlite3.Data.TEXT source_file_like, Sqlite3.Data.TEXT proc_name_like) | None -> L.die UserError "Invalid filter for procedures. Please see the documentation for --procedures-filter \ in `infer explore --help`." in ResultsDatabase.with_registered_statement select_all_procedures_like_statement ~f:(fun db stmt -> Sqlite3.bind stmt 1 (* :proc_name_like *) proc_name_like |> SqliteUtils.check_sqlite_error db ~log:"procedures filter pname bind" ; Sqlite3.bind stmt 2 (* :source_file_like *) source_file_like |> SqliteUtils.check_sqlite_error db ~log:"procedures filter source file bind" ; let pp_if ?(new_line= false) condition title deserialize pp fmt column = if condition then ( if new_line then F.fprintf fmt "@[" else F.fprintf fmt "@[" ; F.fprintf fmt "%s:@ %a@]@;" title pp (Sqlite3.column stmt column |> deserialize) ) in let rec aux () = match Sqlite3.step stmt with | Sqlite3.Rc.ROW -> let proc_name_hum = match[@warning "-8"] Sqlite3.column stmt 1 with Sqlite3.Data.TEXT s -> s in Format.fprintf fmt "@[%s@,%a%a%a%a@]@\n" proc_name_hum (pp_if source_file "source_file" SourceFile.SQLite.deserialize SourceFile.pp) 3 (pp_if proc_name "proc_name" Typ.Procname.SQLite.deserialize Typ.Procname.pp) 0 (pp_if attr_kind "attribute_kind" Attributes.deserialize_attributes_kind Attributes.pp_attributes_kind) 2 (pp_if ~new_line:true proc_attributes "attributes" ProcAttributes.SQLite.deserialize ProcAttributes.pp) 4 ; aux () | DONE -> () | err -> L.die InternalError "procedures_iter: %s (%s)" (Sqlite3.Rc.to_string err) (Sqlite3.errmsg db) in aux () )