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}