Seeing everything that is persisted
(Created page with "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 s...")
 
(Updated Edited template to July 12, 2025.)
 
(11 intermediate revisions by 3 users not shown)
Line 1: Line 1:
There is something called a ChainedPersistenceHandlerBase that you can inherit from and intercept everything that goes to and from the database.
<message>Write the content here to display this box</message>
There is something called a ChainedPersistenceHandlerBase you can inherit from and intercept everything that goes to and from the database.


You can use override as you see fit:
You can use override as you see fit:


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…
<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>


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:
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…
 
<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>
 
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:
 
<div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9259e046-ad23-4f69-b77e-ec15cd0d3597" 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: #008000;">// Install the update handler which intercepts all updates and updated the "Modified" attribute</span></li>
<li style="background: #f3f3f3;"><span style="color: #2b91af;">UpdateHandler</span> uh = <span style="color: #0000ff;">new</span> <span style="color: #2b91af;">UpdateHandler</span>(FrontsidePolicy.ObjectRepresentationProvider, TypeSystem);</li>
<li><span style="color: #2b91af;">PersistenceServiceImpl</span> ps = Persistence <span style="color: #0000ff;">as</span> <span style="color: #2b91af;">PersistenceServiceImpl</span>;</li>
<li style="background: #f3f3f3;">uh.NextPersistenceHandler = ps.PersistenceHandler;</li>
<li>ps.PersistenceHandler = uh;</li>
<li style="background: #f3f3f3;">FrontsidePolicy.PersistenceHandler = uh;</li>
</ol>
</div>
</div>
</div>
[[Category:Database]]
{{Edited|July|12|2025}}

Latest revision as of 06:01, 20 January 2025

This page was created by Alexandra on 2018-11-28. Last edited by Edgar on 2025-01-20.

There is something called a ChainedPersistenceHandlerBase 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;