Further work on similarity.
[virt-similarity.git] / cache.ml
1 (* virt-similarity
2  * Copyright (C) 2013 Red Hat Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  *)
18
19 open Unix
20 open Filename
21
22 type filename = string
23 type hashes = string array
24 type cache = (string * hashes) list
25
26 let (//) = Filename.concat
27
28 let version = "1"
29
30 let cache_file =
31   try Some (Sys.getenv "HOME" // ".similarity-cache.v" ^ version)
32   with Not_found -> None
33
34 let read_cache_file () : cache =
35   match cache_file with
36   | None -> []
37   | Some cache_file ->
38     try
39       let chan = open_in cache_file in
40       let v = input_value chan in
41       close_in chan;
42       v
43     with
44       _ -> []
45
46 let write_cache_file (cache : cache) =
47   match cache_file with
48   | None -> ()
49   | Some cache_file ->
50     let tmp_name = cache_file ^ ".tmp" in
51     let chan = open_out tmp_name in
52     output_value chan cache;
53     close_out chan;
54     rename tmp_name cache_file
55
56 let get_hash cache filename =
57   try Some (List.assoc filename cache) with Not_found -> None
58
59 let update_hash cache filename hashes =
60   let cache = List.remove_assoc filename cache in
61   (filename, hashes) :: cache