main
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using gorilla.commons.utility;
5
6namespace momoney.database.transactions
7{
8 public class ChangeTracker<T> : IChangeTracker<T> where T : Identifiable<Guid>
9 {
10 readonly ITrackerEntryMapper<T> mapper;
11 readonly DatabaseCommandRegistry registry;
12 readonly IList<ITrackerEntry<T>> items;
13 readonly IList<T> to_be_deleted;
14
15 public ChangeTracker(ITrackerEntryMapper<T> mapper, DatabaseCommandRegistry registry)
16 {
17 this.mapper = mapper;
18 this.registry = registry;
19 items = new List<ITrackerEntry<T>>();
20 to_be_deleted = new List<T>();
21 }
22
23 public void register(T entity)
24 {
25 items.Add(mapper.map_from(entity));
26 }
27
28 public void delete(T entity)
29 {
30 to_be_deleted.Add(entity);
31 }
32
33 public void commit_to(IDatabase database)
34 {
35 items.each(x => commit(x, database));
36 to_be_deleted.each(x => database.apply(registry.prepare_for_deletion(x)));
37 }
38
39 public bool is_dirty()
40 {
41 return items.Count(x => x.has_changes()) > 0 || to_be_deleted.Count > 0;
42 }
43
44 public void Dispose()
45 {
46 items.Clear();
47 }
48
49 void commit(ITrackerEntry<T> entry, IDatabase database)
50 {
51 if (entry.has_changes()) database.apply(registry.prepare_for_flushing(entry.current));
52 }
53 }
54}