Seeing everything that is persisted
No edit summary
No edit summary
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">&nbsp;</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">&nbsp;</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">&nbsp;</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>&lt;<span style="color:#2b91af">Locator</span>&gt; 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>&lt;<span style="color:#2b91af">Locator</span>&gt; FetchLinksWithObjects(<span style="color:#2b91af">ICollection</span>&lt;<span style="color:#2b91af">Locator</span>&gt; 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>&lt;<span style="color:#2b91af">Locator</span>&gt; 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>&lt;<span style="color:#2b91af">Locator</span>&gt; 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>&lt;<span style="color: #2b91af;">Locator</span>&gt; 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

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:

  1. public class UpdateHandler : ChainedPersistenceHandlerBase
  2. {
  3.   private readonly IObjectRepresentationProvider orp;
  4.   public UpdateHandler(IObjectRepresentationProvider orp, IEcoTypeSystem typeSystem)
  5.     : base(typeSystem)
  6.   {
  7.     this.orp = orp;
  8.   }
  9.   public override void UpdateDatabaseWithList(ICollection<Locator> locators)
  10.   {
  11.     DateTime timestamp = DateTime.Now;
  12.     foreach (Locator loc in locators)
  13.     {
  14.       IObject obj = orp.IObjectForLocator(loc);
  15.       if (obj.AsObject is ITrackUpdate)
  16.       {
  17.         (obj.AsObject as ITrackUpdate).PreUpdate(timestamp);
  18.       }
  19.     }
  20.     base.UpdateDatabaseWithList(locators);
  21.   }
  22. }


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…

  1. public class UpdateHandler : ChainedPersistenceHandlerBase
  2. {
  3.   private readonly IObjectRepresentationProvider orp;
  4.   public UpdateHandler(IObjectRepresentationProvider orp, IEcoTypeSystem typeSystem)
  5.     : base(typeSystem)
  6.   {
  7.     this.orp = orp;
  8.   }
  9.   public override void UpdateDatabaseWithList(ICollection<Locator> locators)
  10.   {
  11.     DateTime timestamp = DateTime.Now;
  12.     foreach (Locator loc in locators)
  13.     {
  14.       IObject obj = orp.IObjectForLocator(loc);
  15.       if (obj.AsObject is ITrackUpdate)
  16.       {
  17.         (obj.AsObject as ITrackUpdate).PreUpdate(timestamp);
  18.       }
  19.     }
  20.     base.UpdateDatabaseWithList(locators);
  21.   }
  22. }


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:

  1. // Install the update handler which intercepts all updates and updated the "Modified" attribute
  2. UpdateHandler uh = new UpdateHandler(FrontsidePolicy.ObjectRepresentationProvider, TypeSystem);
  3. PersistenceServiceImpl ps = Persistence as PersistenceServiceImpl;
  4. uh.NextPersistenceHandler = ps.PersistenceHandler;
  5. ps.PersistenceHandler = uh;
  6. FrontsidePolicy.PersistenceHandler = uh;
This page was edited 78 days ago on 02/10/2024. What links here