You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.8 KiB

(*
* Copyright (c) 2018 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*)
open! IStd
module F = Format
module L = Logging
let select_all_procedures_like_statement =
ResultsDatabase.register_statement
"SELECT * FROM procedures WHERE proc_name LIKE :pname_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, pname_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, pname_like) ->
(Sqlite3.Data.TEXT source_file_like, Sqlite3.Data.TEXT pname_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 (* :pname_like *) pname_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 ?(newline= false) condition deserialize pp fmt column =
if condition then (
if newline then F.fprintf fmt "@\n " ;
F.fprintf fmt "%a@ " pp (Sqlite3.column stmt column |> deserialize) )
in
let rec aux () =
match Sqlite3.step stmt with
| Sqlite3.Rc.ROW ->
let proc_name_hum =
(* same as proc_name for now, will change later *)
match[@warning "-8"] Sqlite3.column stmt 0 with Sqlite3.Data.TEXT s -> s
in
Format.fprintf fmt "@[<h2>%s:@ %a%a%a%a@]@\n" proc_name_hum
(pp_if source_file SourceFile.SQLite.deserialize SourceFile.pp)
2
(pp_if proc_name Typ.Procname.SQLite.deserialize Typ.Procname.pp)
0
(pp_if attr_kind Attributes.deserialize_attributes_kind Attributes.pp_attributes_kind)
1
(pp_if ~newline:true proc_attributes ProcAttributes.SQLite.deserialize
ProcAttributes.pp)
3 ;
aux ()
| DONE ->
()
| err ->
L.die InternalError "procedures_iter: %s (%s)" (Sqlite3.Rc.to_string err)
(Sqlite3.errmsg db)
in
aux () )