-(*
- * Copyright (C) 2003-2004:
- * Stefano Zacchiroli <zack@cs.unibo.it>
- * for the HELM Team http://helm.cs.unibo.it/
- *
- * 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 Http_getter_types
-
-class map dbname =
- let perm = 420 in (* permission 644 in decimal notation *)
- let open_dbm () =
- Http_getter_misc.mkdir ~parents:true (Filename.dirname dbname);
- Dbm.opendbm dbname [ Dbm.Dbm_rdwr; Dbm.Dbm_create ] perm
- in
-
- object (self)
-
- inherit ThreadSafe.threadSafe
-
- val mutable db = open_dbm ()
- val index_RE = Pcre.regexp "^theory:/.*/index.theory$"
-
- (*initializer Gc.finalise Dbm.close db (* close db on GC *)*)
-
- (* Backward compatibility code to map
- theory:/path/t.theory into theory:/path/t/index.theory
- when cic:/path/t/ exists *)
- method private normalize_key key =
- if Pcre.pmatch ~rex:index_RE key &&
- (try ignore (Dbm.find db key); false with Not_found -> true)
- then
- (* we substitute /index.theory with .theory *)
- String.sub key 0 (String.length key - 13) ^ ".theory"
- else key
-
- method add key value =
- self#doWriter (lazy (
- try
- Dbm.add db key value
- with Dbm.Dbm_error "Entry already exists" -> raise (Key_already_in key)
- ))
-
- method replace key value =
- self#doWriter (lazy (
- Dbm.replace db key value
- ))
-
- method remove key =
- self#doWriter (lazy (
- try
- Dbm.remove db key
- with Dbm.Dbm_error "dbm_delete" -> raise (Key_not_found key)
- ))
-
- method resolve key =
- self#doReader (lazy (
- try
- Dbm.find db (self#normalize_key key)
- with Not_found -> raise (Key_not_found key)
- ))
-
- method iter (f: string -> string -> unit) =
- self#doReader (lazy (
- Dbm.iter f db
- ))
-
- method sync =
- self#doWriter (lazy (
- Dbm.close db;
- db <- open_dbm ()
- ))
-
- method clear =
- self#doWriter (lazy (
- Dbm.close db;
- List.iter
- (fun ext ->
- let file = dbname ^ ext in
- if Sys.file_exists file then Sys.remove file)
- [".dir"; ".pag"; ".db"];
- db <- open_dbm ()
- ))
-
- method close =
- self#doWriter (lazy (
- Dbm.close db
- ))
-
- end
-