(* * 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_statement = ResultsDatabase.register_statement "SELECT * FROM procedures" let pp_all ?filter ~proc_name:proc_name_cond ~attr_kind ~source_file:source_file_cond ~proc_attributes fmt () = let filter = Filtering.mk_procedure_name_filter ~filter |> Staged.unstage in ResultsDatabase.with_registered_statement select_all_procedures_statement ~f:(fun db stmt -> let pp_if ?(new_line= false) condition title pp fmt x = if condition then ( if new_line then F.fprintf fmt "@[" else F.fprintf fmt "@[" ; F.fprintf fmt "%s:@ %a@]@;" title pp x ) in let pp_column_if ?new_line condition title deserialize pp fmt column = if condition then (* repeat the [condition] check so that we do not deserialize if there's nothing to do *) pp_if ?new_line condition title pp fmt (Sqlite3.column stmt column |> deserialize) in let pp_row fmt source_file proc_name = let[@warning "-8"] Sqlite3.Data.TEXT proc_name_hum = Sqlite3.column stmt 1 in Format.fprintf fmt "@[%s@,%a%a%a%a@]@\n" proc_name_hum (pp_if source_file_cond "source_file" SourceFile.pp) source_file (pp_if proc_name_cond "proc_name" Typ.Procname.pp) proc_name (pp_column_if attr_kind "attribute_kind" Attributes.deserialize_attributes_kind Attributes.pp_attributes_kind) 2 (pp_column_if ~new_line:true proc_attributes "attributes" ProcAttributes.SQLite.deserialize ProcAttributes.pp) 4 in let rec aux () = match Sqlite3.step stmt with | Sqlite3.Rc.ROW -> let proc_name = Sqlite3.column stmt 0 |> Typ.Procname.SQLite.deserialize in let source_file = Sqlite3.column stmt 3 |> SourceFile.SQLite.deserialize in if filter source_file proc_name then pp_row fmt source_file proc_name ; aux () | DONE -> () | err -> L.die InternalError "procedures_iter: %s (%s)" (Sqlite3.Rc.to_string err) (Sqlite3.errmsg db) in aux () )