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.

57 lines
2.2 KiB

(*
* Copyright (c) 2017 - 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 L = Logging
let merge_attributes_table ~into ~db_name ~db_file =
(* no need to wrap this in a single transaction (to batch writes) because we open the table with
synchronous=OFF *)
(* do not go through Attributes so as not to deserialize and reserialize objects pointlessly, and
so as not to fill the cache with all the attributes (especially since this function will be
called before forking all the analysis processes. *)
let copy_stmt =
Sqlite3.prepare into
(Printf.sprintf "REPLACE INTO %s SELECT * FROM %s.%s" ResultsDir.attributes_table db_name
ResultsDir.attributes_table)
in
SqliteUtils.sqlite_unit_step ~log:(Printf.sprintf "copying contents of database '%s'" db_file)
copy_stmt
let merge ~into db_file =
let db_name = "db" in
SqliteUtils.check_sqlite_error ~fatal:true
~log:(Printf.sprintf "attaching database '%s'" db_file)
(Sqlite3.exec into (Printf.sprintf "ATTACH '%s' AS %s" db_file db_name)) ;
let do_merge () = merge_attributes_table ~into ~db_name ~db_file in
Utils.without_gc ~f:do_merge ;
SqliteUtils.check_sqlite_error ~fatal:true
~log:(Printf.sprintf "detaching database '%s'" db_file)
(Sqlite3.exec into (Printf.sprintf "DETACH %s" db_name)) ;
()
let merge_buck_flavors_results infer_deps_file =
let into = ResultsDir.get_database () in
let one_line line =
match String.split ~on:'\t' line with
| [_; _; target_results_dir]
-> let infer_out_src =
if Filename.is_relative target_results_dir then
Filename.dirname (Config.project_root ^/ "buck-out") ^/ target_results_dir
else target_results_dir
in
merge ~into (infer_out_src ^/ ResultsDir.database_filename)
| _
-> assert false
in
match Utils.read_file infer_deps_file with
| Ok lines
-> List.iter ~f:one_line lines
| Error error
-> L.internal_error "Couldn't read deps file '%s': %s" infer_deps_file error