Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
Ledger.cs
1using System;
2using System.Threading.Tasks;
3using Waher.Events;
6
7namespace Waher.Persistence
8{
13 public static class Ledger
14 {
15 private static ILedgerProvider provider = null;
16 private static bool locked = false;
17
25 public static void Register(ILedgerProvider LedgerProvider)
26 {
27 Register(LedgerProvider, true);
28 }
29
38 public static void Register(ILedgerProvider LedgerProvider, bool Lock)
39 {
40 if (!(provider is null))
41 {
42 if (locked)
43 throw new Exception("A ledger provider is already registered.");
44
45 provider.Unregister(externalEvents);
46 }
47
48 provider = LedgerProvider;
49 locked = Lock;
50
51 provider.Register(externalEvents);
52 }
53
54 private static readonly ExternalEvents externalEvents = new ExternalEvents();
55
56 private class ExternalEvents : ILedgerExternalEvents
57 {
58 public void RaiseEntryAdded(object Object)
59 {
60 Ledger.RaiseEntryAdded(Object);
61 }
62
63 public void RaiseEntryDeleted(object Object)
64 {
65 Ledger.RaiseEntryDeleted(Object);
66 }
67
68 public void RaiseEntryUpdated(object Object)
69 {
70 Ledger.RaiseEntryUpdated(Object);
71 }
72
73 public void RaiseCollectionCleared(string Collection)
74 {
75 Ledger.RaiseCollectionCleared(Collection);
76 }
77 }
78
83 {
84 get
85 {
86 if (!(provider is null))
87 return provider;
88 else
89 throw new Exception("A ledger provider has not been registered.");
90 }
91 }
92
93 internal static ILedgerProvider Stop()
94 {
95 ILedgerProvider Result = provider;
96 provider = new NullLedgerProvider();
97 locked = false;
98 return Result;
99 }
100
104 public static bool HasProvider
105 {
106 get => !(provider is null) && (!(provider is NullLedgerProvider) || locked);
107 }
108
112 public static bool Locked => locked;
113
118 public static async Task NewEntry(object Object)
119 {
120 await Provider.NewEntry(Object);
121 RaiseEntryAdded(Object);
122 }
123
124 private static void RaiseEntryAdded(object Object)
125 {
127 if (!(h is null))
128 {
129 try
130 {
131 h(Provider, new ObjectEventArgs(Object));
132 }
133 catch (Exception)
134 {
135 // Ignore
136 }
137 }
138 }
139
143 public static event ObjectEventHandler EntryAdded = null;
144
149 public static async Task UpdatedEntry(object Object)
150 {
151 await Provider.UpdatedEntry(Object);
152 RaiseEntryUpdated(Object);
153 }
154
155 private static void RaiseEntryUpdated(object Object)
156 {
158 if (!(h is null))
159 {
160 try
161 {
162 h(Provider, new ObjectEventArgs(Object));
163 }
164 catch (Exception)
165 {
166 // Ignore
167 }
168 }
169 }
170
174 public static event ObjectEventHandler EntryUpdated = null;
175
180 public static async Task DeletedEntry(object Object)
181 {
182 await Provider.DeletedEntry(Object);
183 RaiseEntryDeleted(Object);
184 }
185
186 private static void RaiseEntryDeleted(object Object)
187 {
189 if (!(h is null))
190 {
191 try
192 {
193 h(Provider, new ObjectEventArgs(Object));
194 }
195 catch (Exception)
196 {
197 // Ignore
198 }
199 }
200 }
201
205 public static event ObjectEventHandler EntryDeleted = null;
206
211 public static async Task ClearedCollection(string Collection)
212 {
213 await Provider.ClearedCollection(Collection);
214 RaiseCollectionCleared(Collection);
215 }
216
217 private static async void RaiseCollectionCleared(string Collection)
218 {
220 if (!(h is null))
221 {
222 try
223 {
224 await h(Provider, new CollectionEventArgs(Collection));
225 }
226 catch (Exception ex)
227 {
228 Log.Exception(ex);
229 }
230 }
231 }
232
236 public static event CollectionEventHandler CollectionCleared = null;
237
243 public static Task<ILedgerEnumerator<T>> GetEnumerator<T>()
244 {
245 return Provider.GetEnumerator<T>();
246 }
247
253 public static Task<ILedgerEnumerator<object>> GetEnumerator(string CollectionName)
254 {
255 return Provider.GetEnumerator(CollectionName);
256 }
257
262 public static Task<string[]> GetCollections()
263 {
264 return Provider.GetCollections();
265 }
266
272 public static Task<bool> Export(ILedgerExport Output)
273 {
274 return Provider.Export(Output, null);
275 }
276
284 public static Task<bool> Export(ILedgerExport Output, LedgerExportRestriction Restriction)
285 {
286 return Provider.Export(Output, Restriction);
287 }
288
297 public static Task<bool> Export(ILedgerExport Output, LedgerExportRestriction Restriction, ProfilerThread Thread)
298 {
299 return Provider.Export(Output, Restriction, Thread);
300 }
301
302 private static readonly object listeningSynchObj = new object();
303 private static int listeningCounter = 0;
304
311 {
312 lock (listeningSynchObj)
313 {
314 if (listeningCounter == 0)
315 {
316 Database.ObjectInserted += Database_ObjectInserted;
317 Database.ObjectUpdated += Database_ObjectUpdated;
318 Database.ObjectDeleted += Database_ObjectDeleted;
319 Database.CollectionCleared += Database_CollectionCleared;
320
321 listeningCounter++;
322 }
323 }
324
325 }
326
332 public static void StopListeningToDatabaseEvents()
333 {
334 lock (listeningSynchObj)
335 {
336 if (listeningCounter > 0)
337 {
338 listeningCounter--;
339
340 if (listeningCounter == 0)
341 {
342 Database.ObjectInserted -= Database_ObjectInserted;
343 Database.ObjectUpdated -= Database_ObjectUpdated;
344 Database.ObjectDeleted -= Database_ObjectDeleted;
345 Database.CollectionCleared -= Database_CollectionCleared;
346 }
347 }
348 }
349 }
350
351 private static async void Database_ObjectInserted(object Sender, ObjectEventArgs e)
352 {
353 try
354 {
356 await NewEntry(Obj);
357 }
358 catch (Exception ex)
359 {
360 Log.Exception(ex);
361 }
362 }
363
364 private static async void Database_ObjectUpdated(object Sender, ObjectEventArgs e)
365 {
366 try
367 {
369 await UpdatedEntry(Obj);
370 }
371 catch (Exception ex)
372 {
373 Log.Exception(ex);
374 }
375 }
376
377 private static async void Database_ObjectDeleted(object Sender, ObjectEventArgs e)
378 {
379 try
380 {
382 await DeletedEntry(Obj);
383 }
384 catch (Exception ex)
385 {
386 Log.Exception(ex);
387 }
388 }
389
390 private static async Task Database_CollectionCleared(object Sender, CollectionEventArgs e)
391 {
392 try
393 {
395 }
396 catch (Exception ex)
397 {
398 Log.Exception(ex);
399 }
400 }
401 }
402}
Static class managing the application event log. Applications and services log events on this static ...
Definition: Log.cs:13
static void Exception(Exception Exception, string Object, string Actor, string EventId, EventLevel Level, string Facility, string Module, params KeyValuePair< string, object >[] Tags)
Logs an exception. Event type will be determined by the severity of the exception.
Definition: Log.cs:1647
Event arguments for collection events.
Static interface for database persistence. In order to work, a database provider has to be assigned t...
Definition: Database.cs:19
static Task< GenericObject > Generalize(object Object)
Creates a generalized representation of an object.
Definition: Database.cs:1678
Contains basic ledger export restrictions.
Static interface for ledger persistence. In order to work, a ledger provider has to be assigned to it...
Definition: Ledger.cs:14
static ObjectEventHandler EntryAdded
Event raised when an entry has been added to the ledger.
Definition: Ledger.cs:143
static void Register(ILedgerProvider LedgerProvider)
Registers a ledger provider for use from the static Ledger class, throughout the lifetime of the appl...
Definition: Ledger.cs:25
static bool Locked
If the datbase provider has been locked for the rest of the run-time of the application.
Definition: Ledger.cs:112
static bool HasProvider
If a ledger provider is registered.
Definition: Ledger.cs:105
static ObjectEventHandler EntryUpdated
Event raised when an entry has been updated in the ledger.
Definition: Ledger.cs:174
static Task< bool > Export(ILedgerExport Output, LedgerExportRestriction Restriction)
Performs an export of the entire ledger.
Definition: Ledger.cs:284
static ObjectEventHandler EntryDeleted
Event raised when an entry has been deleted in the ledger.
Definition: Ledger.cs:205
static async Task DeletedEntry(object Object)
Deletes an entry in the ledger.
Definition: Ledger.cs:180
static ILedgerProvider Provider
Registered ledger provider.
Definition: Ledger.cs:83
static Task< string[]> GetCollections()
Gets an array of available collections.
Definition: Ledger.cs:262
static async Task NewEntry(object Object)
Adds an entry to the ledger.
Definition: Ledger.cs:118
static async Task ClearedCollection(string Collection)
Clears a collection in the ledger.
Definition: Ledger.cs:211
static Task< bool > Export(ILedgerExport Output, LedgerExportRestriction Restriction, ProfilerThread Thread)
Performs an export of the entire ledger.
Definition: Ledger.cs:297
static Task< bool > Export(ILedgerExport Output)
Performs an export of the entire ledger.
Definition: Ledger.cs:272
static async Task UpdatedEntry(object Object)
Updates an entry in the ledger.
Definition: Ledger.cs:149
static CollectionEventHandler CollectionCleared
Event raised when a collection has been cleared.
Definition: Ledger.cs:236
static Task< ILedgerEnumerator< T > > GetEnumerator< T >()
Gets an eumerator for objects of type T .
Definition: Ledger.cs:243
static void StartListeningToDatabaseEvents()
Makes the ledger listen on database events. Each call to StartListeningToDatabaseEvents must be follo...
Definition: Ledger.cs:310
static Task< ILedgerEnumerator< object > > GetEnumerator(string CollectionName)
Gets an eumerator for objects in a collection.
Definition: Ledger.cs:253
static void Register(ILedgerProvider LedgerProvider, bool Lock)
Registers a ledger provider for use from the static Ledger class, throughout the lifetime of the appl...
Definition: Ledger.cs:38
static void StopListeningToDatabaseEvents()
Makes the ledger listen on database events. Each call to StartListeningToDatabaseEvents must be follo...
Definition: Ledger.cs:332
Event arguments for database object events.
Generic object. Contains a sequence of properties.
Class that keeps track of events and timing for one thread.
Interface for proxy for reporting changes to the ledger from external sources.
Interface for ledger providers that can be plugged into the static Ledger class.
Task ClearedCollection(string Collection)
Clears a collection in the ledger.
Task DeletedEntry(object Object)
Deletes an entry in the ledger.
Task< string[]> GetCollections()
Gets an array of available collections.
Task< bool > Export(ILedgerExport Output, LedgerExportRestriction Restriction)
Performs an export of the entire ledger.
void Unregister(ILedgerExternalEvents ExternalEvents)
Unregisters a recipient of external events.
Task NewEntry(object Object)
Adds an entry to the ledger.
void Register(ILedgerExternalEvents ExternalEvents)
Registers a recipient of external events.
Task< ILedgerEnumerator< object > > GetEnumerator(string CollectionName)
Gets an eumerator for objects in a collection.
Task UpdatedEntry(object Object)
Updates an entry in the ledger.
delegate void ObjectEventHandler(object Sender, ObjectEventArgs e)
Event handler for object events.
delegate Task CollectionEventHandler(object Sender, CollectionEventArgs e)
Event handler for collection events.