Database of analysis results

### Filename

`type filename`````

generic file name

`include sig ... end`
`val compare_filename : filename ‑> filename ‑> int`
`val filename_from_string : string ‑> filename`
`val filename_to_string : filename ‑> string`
`val filename_add_suffix : filename ‑> string ‑> filename`
`val file_exists : filename ‑> bool`
`val file_modified_time : ?⁠symlink:bool ‑> filename ‑> float`

Return the time when a file was last modified. The file must exist.

### Results Directory

`module Results_dir : sig ... end`
`val append_crc_cutoff : ?⁠key:string ‑> ?⁠crc_only:bool ‑> string ‑> string`

Append a crc to the string, using string_crc_hex32. Cut the string if it exceeds the cutoff limit. Use an optional key to compute the crc. Return only the crc if `crc_only` is true.

`val strip_crc : string ‑> string`

Strip any crc attached to any string generated by string_append_crc_cutoff

`val source_file_encoding : InferBase.SourceFile.t ‑> string`

string encoding of a source file (including path) as a single filename

### Source Dirs

`type source_dir`````

source directory: the directory inside the results dir corresponding to a source file

`include sig ... end`
`val compare_source_dir : source_dir ‑> source_dir ‑> int`
`val source_dir_to_string : source_dir ‑> string`

expose the source dir as a string

`val source_dir_get_internal_file : source_dir ‑> string ‑> filename`

get the path to an internal file with the given extention (.tenv, ...)

`val source_dir_from_source_file : InferBase.SourceFile.t ‑> source_dir`

get the source directory corresponding to a source file

`val read_file_with_lock : string ‑> string ‑> string option`

Read a file using a lock to allow write attempts in parallel.

`val update_file_with_lock : string ‑> string ‑> (string ‑> string) ‑> unit`

Update the file contents with the update function provided. If the directory does not exist, it is created. If the file does not exist, it is created, and update is given the empty string. A lock is used to allow write attempts in parallel.

`val is_source_file : string ‑> bool`

Check if a path is a Java, C, C++ or Objectve C source file according to the file extention

`val fold_paths_matching : dir:filename ‑> p:(filename ‑> bool) ‑> init:'a ‑> f:(filename ‑> 'a ‑> 'a) ‑> 'a`

Fold over all file paths recursively under `dir` which match `p`.

`val paths_matching : string ‑> (string ‑> bool) ‑> string list`

Return all file paths recursively under the given directory which match the given predicate