(* Copyright (C) 2005, HELM Team. * * This file is part of HELM, an Hypertextual, Electronic * Library of Mathematics, developed at the Computer Science * Department, University of Bologna, Italy. * * HELM is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * HELM is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HELM; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * * For details, see the HELM World-Wide-Web page, * http://helm.cs.unibo.it/ *) open Printf exception Checksum_failure of string exception Corrupt_metadata of string exception Version_mismatch of string let magic = 1 type metadata = | Dependency of string (* baseuri without trailing slash *) let eq_metadata (m1:metadata) (m2:metadata) = m1 = m2 let marshal_flags = [] (** .metadata file format * - an integer -- magic number -- denoting the version of the dumped data * structure. Different magic numbers stand for incompatible data structures * - an integer -- checksum -- denoting the hash value (computed with * Hashtbl.hash) of the string representation of the dumped data structur * - marshalled data: list of metadata *) let save_metadata ~fname metadata = let ensure_path_exists path = let dir = Filename.dirname path in HExtlib.mkdir dir in ensure_path_exists fname; let oc = open_out fname in let marshalled = Marshal.to_string metadata marshal_flags in let checksum = Hashtbl.hash marshalled in output_binary_int oc magic; output_binary_int oc checksum; output_string oc marshalled; close_out oc let load_metadata ~fname = let ic = open_in fname in HExtlib.finally (fun () -> close_in ic) (fun () -> try let file_magic = input_binary_int ic in if file_magic <> magic then raise (Version_mismatch fname); let file_checksum = input_binary_int ic in let marshalled = HExtlib.input_all ic in let checksum = Hashtbl.hash marshalled in if checksum <> file_checksum then raise (Checksum_failure fname); let (metadata:metadata list) = Marshal.from_string marshalled 0 in metadata with End_of_file -> raise (Corrupt_metadata fname)) ()