Documentation / Seeing everything that is persisted Seeing everything that is persisted
Line 3:
Line 3:
You can use override as you see fit:
You can use override as you see fit:
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4869107b-10cc-491f-ac1b-58d4e717a2b4" class="wlWriterEditableSmartContent"> <div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"> <div style="background: #fff; overflow: auto"> <ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"> <li><span style="color:#0000ff">namespace</span> Eco.Persistence</li> <li style="background: #f3f3f3">{</li> <li> <span style="color:#008000">// Summary:</span></li> <li style="background: #f3f3f3"> <span style="color:#008000">// Base class for persistence handler.</span></li> <li> <span style="color:#008000">//</span></li> <li style="background: #f3f3f3"> <span style="color:#008000">// Remarks:</span></li> <li> <span style="color:#008000">// Use this class to implement your own IPersistenceHandler override any of</span></li> <li style="background: #f3f3f3"> <span style="color:#008000">// the virtual methods to inject your own behaviour and copy the Install-procedure</span></li> <li> <span style="color:#008000">// (from the source of this class) for a convenient way to install the new class</span></li> <li style="background: #f3f3f3"> <span style="color:#008000">// in the EcoSpace.</span></li> <li> <span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">ChainedPersistenceHandlerBase</span> : <span style="color:#2b91af">IPersistenceHandler</span></li> <li style="background: #f3f3f3"> {</li> <li> <span style="color:#0000ff">public</span> ChainedPersistenceHandlerBase(<span style="color:#2b91af">IEcoTypeSystem</span> typeSystem);</li> <li style="background: #f3f3f3"> </li> <li> <span style="color:#0000ff">public</span> <span style="color:#0000ff">bool</span> IsPersistent { <span style="color:#0000ff">get</span>; }</li> <li style="background: #f3f3f3"> <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#0000ff">int</span> MaxSavedVersion { <span style="color:#0000ff">get</span>; }</li> <li> <span style="color:#0000ff">public</span> <span style="color:#2b91af">IPersistenceHandler</span> NextPersistenceHandler { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }</li> <li style="background: #f3f3f3"> <span style="color:#0000ff">public</span> <span style="color:#0000ff">bool</span> SupportsSync { <span style="color:#0000ff">get</span>; }</li> <li> <span style="color:#0000ff">protected</span> <span style="color:#2b91af">IEcoTypeSystem</span> TypeSystem { <span style="color:#0000ff">get</span>; }</li> <li style="background: #f3f3f3"> </li> <li> <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#0000ff">event</span> <span style="color:#2b91af">LocatorArrayEventHandler</span> ObjectsUpdated;</li> <li style="background: #f3f3f3"> </li> <li> <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#0000ff">void</span> Fetch(<span style="color:#2b91af">ICollection</span><<span style="color:#2b91af">Locator</span>> locators, <span style="color:#0000ff">int</span>[] members, <span style="color:#2b91af">FetchStrategy</span> FetchStrategy);</li> <li style="background: #f3f3f3"> <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#2b91af">ICollection</span><<span style="color:#2b91af">Locator</span>> FetchLinksWithObjects(<span style="color:#2b91af">ICollection</span><<span style="color:#2b91af">Locator</span>> objects, <span style="color:#2b91af">IAssociationEnd</span> assocEnd);</li> <li> <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#2b91af">ICollection</span><<span style="color:#2b91af">Locator</span>> GetAllWithCondition(<span style="color:#2b91af">AbstractCondition</span> condition, <span style="color:#0000ff">int</span> maxAnswers, <span style="color:#0000ff">int</span> offset);</li> <li style="background: #f3f3f3"> <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#2b91af">Datablock</span> GetValueWithCondition(<span style="color:#2b91af">AbstractCondition</span> condition, <span style="color:#0000ff">int</span> maxAnswers, <span style="color:#0000ff">int</span> offset);</li> <li> <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#0000ff">void</span> RetrieveChanges(<span style="color:#0000ff">out</span> <span style="color:#2b91af">DBChangeCollection</span> ignoredChanges);</li> <li style="background: #f3f3f3"> <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#2b91af">DateTime</span> TimeForVersion(<span style="color:#0000ff">int</span> version);</li> <li> <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#0000ff">void</span> UpdateDatabaseWithList(<span style="color:#2b91af">ICollection</span><<span style="color:#2b91af">Locator</span>> locators);</li> <li style="background: #f3f3f3"> <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#0000ff">int</span> VersionAtTime(<span style="color:#2b91af">DateTime</span> time);</li> <li> }</li> <li style="background: #f3f3f3">}</li> </ol> </div> </div> </div>
<div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4ec7f1f8 -600a -44ef -972a -92308fe10bc8 " class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px; ">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt; ">
<div style="background: #fff; overflow: auto; ">
<ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;">
<li><span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">class</span> <span style="color: #2b91af; ">UpdateHandler </span> : <span style="color: #2b91af; ">ChainedPersistenceHandlerBase </span></li>
<li style="background: #f3f3f3; ">{</li>
<li> <span style="color: #0000ff;">private </span> <span style="color: #0000ff; ">readonly </span> <span style="color: #2b91af; ">IObjectRepresentationProvider </span> orp ;</li>
<li style="background: #f3f3f3; "> <span style="color: #0000ff; ">public</span> UpdateHandler( <span style="color: #2b91af ;">IObjectRepresentationProvider </span> orp, <span style="color: #2b91af;">IEcoTypeSystem </span> typeSystem) </li>
<li> : <span style="color: #0000ff;">base </span>(typeSystem) </li>
<li style="background: #f3f3f3; "> { </li>
<li> <span style="color: #0000ff; ">this </span>.orp = orp ;</li>
<li style="background: #f3f3f3; "> } </li>
<li> <span style="color: #0000ff; ">public</span> <span style="color: #0000ff; ">override </span> <span style="color: #0000ff; ">void</span> UpdateDatabaseWithList (<span style="color: #2b91af; ">ICollection</span><<span style="color: #2b91af; ">Locator</span>> locators)</li>
<li style="background: #f3f3f3; "> { </li >
<li > <span style="color: #2b91af;">DateTime </span> timestamp = <span style="color: #2b91af;">DateTime </span>.Now ;</li>
<li style="background : #f3f3f3; "> <span style="color: #0000ff; ">foreach </span> ( <span style="color: #2b91af;">Locator</span> loc <span style="color: #0000ff; ">in </span> locators )</li>
<li> { </li >
<li style="background : #f3f3f3; "> <span style="color: #2b91af; ">IObject </span> obj = orp.IObjectForLocator (loc );</li>
<li> <span style="color: #0000ff; ">if </span> (obj.AsObject <span style="color: #0000ff; ">is </span> <span style="color: #2b91af; ">ITrackUpdate </span>)</li>
<li style="background: #f3f3f3; "> { </li >
<li > (obj.AsObject <span style="color: #0000ff; ">as </span> <span style="color: #2b91af; ">ITrackUpdate </span>).PreUpdate (timestamp );</li>
<li style="background : #f3f3f3; "> } </li >
<li > } </li>
<li style="background: #f3f3f3; "> <span style="color: #0000ff; ">base </span>.UpdateDatabaseWithList (locators );</li>
<li> }</li>
<li style="background: #f3f3f3; ">}</li>
</ol>
</div>
</div>
</div>
Revision as of 16:30, 28 November 2018
This page was created by Alexandra on 2018-11-28. Last edited by Edgar on 2025-01-20.
There is something called a ChainedPersistenceHandlerBase that you can inherit from and intercept everything that goes to and from the database.
You can use override as you see fit:
public class UpdateHandler : ChainedPersistenceHandlerBase
{
private readonly IObjectRepresentationProvider orp;
public UpdateHandler(IObjectRepresentationProvider orp, IEcoTypeSystem typeSystem)
: base (typeSystem)
{
this .orp = orp;
}
public override void UpdateDatabaseWithList(ICollection <Locator > locators)
{
DateTime timestamp = DateTime .Now;
foreach (Locator loc in locators)
{
IObject obj = orp.IObjectForLocator(loc);
if (obj.AsObject is ITrackUpdate )
{
(obj.AsObject as ITrackUpdate ).PreUpdate(timestamp);
}
}
base .UpdateDatabaseWithList(locators);
}
}
Maybe you have a common base class for all classes in your model, and maybe this class implements an Interface ITrackUpdate, then it would be a good thing to catch all updates and set the datetime…
public class UpdateHandler : ChainedPersistenceHandlerBase
{
private readonly IObjectRepresentationProvider orp;
public UpdateHandler(IObjectRepresentationProvider orp, IEcoTypeSystem typeSystem)
: base (typeSystem)
{
this .orp = orp;
}
public override void UpdateDatabaseWithList(ICollection <Locator > locators)
{
DateTime timestamp = DateTime .Now;
foreach (Locator loc in locators)
{
IObject obj = orp.IObjectForLocator(loc);
if (obj.AsObject is ITrackUpdate )
{
(obj.AsObject as ITrackUpdate ).PreUpdate(timestamp);
}
}
base .UpdateDatabaseWithList(locators);
}
}
We need to install our ChainedPersistenceHandlerBase baseclass. We do this by mixing it in before the current persistencehandler , we do this in the ecospace – before we go active:
// Install the update handler which intercepts all updates and updated the "Modified" attribute
UpdateHandler uh = new UpdateHandler (FrontsidePolicy.ObjectRepresentationProvider, TypeSystem);
PersistenceServiceImpl ps = Persistence as PersistenceServiceImpl ;
uh.NextPersistenceHandler = ps.PersistenceHandler;
ps.PersistenceHandler = uh;
FrontsidePolicy.PersistenceHandler = uh;