<> <> <> <<>> DIRECTORY BasicTime USING [ GMT], DB USING [ Entity, DeclareEntity, DestroyEntity, EraseSegment, RelationSubset, NextRelship, ReleaseRelshipSet, AttributeValue, Relship, RelshipSet, TransactionOf, Aborted, Transaction, MarkTransaction, SetF, B2V, CloseTransaction, GetF, V2E, T2V, NameOf], Hickory USING [ Event, Error], HickoryCache USING [ InvalidateCaches, InvalidateOneCache, DeleteFromEnteredEvents, InvalidateEventCache, ForgetCachedEvent], HickoryDestroy, HickoryGroup USING [ InvalidateCache], HickoryNotify USING [ NotifyClients], HickoryProp USING [ InvalidateCache], HickorySupport USING [ RestartTransaction, StartTransaction], HickoryStorage USING [ protData], Rope USING [ ROPE] ; <<>> HickoryDestroyImpl: CEDAR MONITOR LOCKS HickoryStorage.protData IMPORTS DB, HickorySupport, HickoryStorage, HickoryCache, Hickory, HickoryGroup, HickoryProp, HickoryNotify EXPORTS Hickory, HickoryDestroy SHARES HickorySupport, HickoryCache, HickoryGroup, HickoryProp, HickoryNotify = BEGIN OPEN DB, Hickory, HickoryStorage.protData; <> <<>> DestroyEvent: PUBLIC ENTRY PROCEDURE [ ev: Event] = BEGIN <> OPEN eventRel; ENABLE UNWIND => NULL; evEnt: Entity; success: BOOLEAN _ FALSE; IF NOT owner THEN ERROR Error[ NotOwner, NIL]; IF ev = NIL THEN RETURN; WHILE NOT success DO ENABLE Aborted => { HickorySupport.RestartTransaction; success _ FALSE; LOOP }; HickorySupport.StartTransaction[]; evEnt _ DeclareEntity[ eventDomain, ev, OldOnly]; IF evEnt = NIL THEN ERROR Hickory.Error[ NoSuchEvent, ev]; <<--according to DB info, this should destroy ALL relships where entity appears>> <<--ie. in eventRelation, cacheRel, groupRel, repeatRel, propertyRel>> HickoryCache.InvalidateOneCache[ ev]; HickoryCache.DeleteFromEnteredEvents[ ev]; DestroyEntity[ evEnt]; success _ TRUE; ENDLOOP; -- Transaction HickoryNotify.NotifyClients[ Destroy, ev, [ NIL, NIL]]; END; --DestroyEvent <<>> DestroyDataBase: PUBLIC ENTRY PROCEDURE [] = BEGIN <> ENABLE UNWIND => NULL; trans: Transaction _ TransactionOf[ $Hickory]; IF NOT owner THEN ERROR Error[ NotOwner, NIL]; IF trans # NIL THEN CloseTransaction[ trans]; HickoryGroup.InvalidateCache[]; HickoryProp.InvalidateCache[]; HickoryCache.InvalidateCaches[]; HickoryCache.InvalidateEventCache[]; EraseSegment[ $Hickory]; HickoryNotify.NotifyClients[ DestroyDB, NIL, [ NIL, NIL]]; END; -- DestroyDataBase <> ForgetEvent: PUBLIC ENTRY PROCEDURE [ ev: Event, on: BOOLEAN] = BEGIN <> <> OPEN eventRel; ENABLE UNWIND => NULL; av: AttributeValue; relSet: RelshipSet; tuple: Relship; evEnt: Entity; success: BOOLEAN _ FALSE; IF NOT owner THEN ERROR Error[ NotOwner, NIL]; IF ev = NIL THEN RETURN; WHILE NOT success DO ENABLE Aborted => { HickorySupport.RestartTransaction; success _ FALSE; LOOP }; HickorySupport.StartTransaction[]; evEnt _ DeclareEntity[ eventDomain, ev, OldOnly]; IF evEnt = NIL THEN ERROR Hickory.Error[ NoSuchEvent, ev]; av _ [ attribute: Key, lo: evEnt, hi: evEnt]; relSet _ RelationSubset[ Rel, LIST[ av]]; IF ( tuple _ NextRelship[ relSet]) # NIL THEN SetF[ tuple, Forgotten, B2V[ on]]; ReleaseRelshipSet[ relSet]; MarkTransaction[ TransactionOf[ $Hickory]]; HickoryCache.ForgetCachedEvent[ ev, on]; success _ TRUE; ENDLOOP; -- Transaction IF on THEN HickoryNotify.NotifyClients[ Forget, ev, [ NIL, NIL]] ELSE HickoryNotify.NotifyClients[ UnForget, ev, [ NIL, NIL]]; END; --ForgetEvent <> PurgeEvents: PUBLIC INTERNAL PROCEDURE [ from, to: BasicTime.GMT] = BEGIN <> <> OPEN eventRel; ENABLE UNWIND => NULL; av: AttributeValue; relSet: RelshipSet; tuple: Relship; evEnt: Entity; key: Rope.ROPE _ NIL; success: BOOLEAN _ FALSE; IF NOT owner THEN ERROR Error[ NotOwner, NIL]; WHILE NOT success DO ENABLE DB.Aborted => { HickorySupport.RestartTransaction; success _ FALSE; LOOP }; HickorySupport.StartTransaction[]; av _ [ attribute: KeepTime, lo: T2V[ LOOPHOLE[ from]], hi: T2V[ LOOPHOLE[ to]]]; relSet _ RelationSubset[ Rel, LIST[ av]]; WHILE ( tuple _ NextRelship[ relSet]) # NIL DO evEnt _ V2E[ GetF[ tuple, Key]]; key _ NameOf[ evEnt]; HickoryCache.InvalidateOneCache[ key]; DestroyEntity[ evEnt]; HickoryNotify.NotifyClients[ Destroy, key, [ NIL, NIL]]; ENDLOOP; ReleaseRelshipSet[ relSet]; MarkTransaction[ TransactionOf[ $Hickory]]; HickoryCache.InvalidateEventCache[]; success _ TRUE; ENDLOOP; -- Transaction END; -- PurgeEvents END.