From: Enrico Tassi Date: Fri, 22 Jul 2005 11:46:25 +0000 (+0000) Subject: add_obj is ATOMIC X-Git-Tag: V_0_7_2~108 X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=commitdiff_plain;h=a985685735f5700866e3a97234787c0a8ce2af95;p=helm.git add_obj is ATOMIC --- diff --git a/helm/matita/matitaSync.ml b/helm/matita/matitaSync.ml index 51007df29..e12c1cd14 100644 --- a/helm/matita/matitaSync.ml +++ b/helm/matita/matitaSync.ml @@ -155,13 +155,25 @@ let add_obj uri obj status = if CicEnvironment.in_library uri then command_error (sprintf "%s already defined" suri) else begin - CicTypeChecker.typecheck_obj uri obj; - MetadataDb.index_obj ~dbd ~uri; (* must be in the env *) - let new_stuff = save_object_to_disk status uri obj in - MatitaLog.message (sprintf "%s defined" suri); - let status = add_aliases_for_object status suri obj in - { status with objects = new_stuff @ status.objects; - proof_status = No_proof } + CicTypeChecker.typecheck_obj uri obj; (* 1 *) + try + MetadataDb.index_obj ~dbd ~uri; (* 2 must be in the env *) + try + let new_stuff = save_object_to_disk status uri obj in (* 3 *) + try + MatitaLog.message (sprintf "%s defined" suri); + let status = add_aliases_for_object status suri obj in + { status with objects = new_stuff @ status.objects; + proof_status = No_proof } + with exc -> + List.iter MatitaMisc.safe_remove (List.map snd new_stuff); (* -3 *) + raise exc + with exc -> + ignore(MatitaDb.remove_uri uri); (* -2 *) + raise exc + with exc -> + CicEnvironment.remove_obj uri; (* -1 *) + raise exc end module OrderedUri =