Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief Implementation of MergeResult
5 : *
6 : * @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
7 : *
8 : */
9 :
10 : #include <merging/mergingkdb.hpp>
11 :
12 : namespace kdb
13 : {
14 :
15 : namespace tools
16 : {
17 :
18 : namespace merging
19 : {
20 :
21 12 : MergingKDB::MergingKDB ()
22 : {
23 6 : }
24 :
25 0 : MergingKDB::MergingKDB (KDB & kdb) : KDB (kdb)
26 : {
27 0 : }
28 :
29 18 : MergingKDB::~MergingKDB () throw ()
30 : {
31 6 : }
32 :
33 0 : int MergingKDB::get (KeySet & returned, std::string const & keyname)
34 : {
35 0 : int ret = KDB::get (returned, keyname);
36 0 : base = returned.dup ();
37 0 : return ret;
38 : }
39 :
40 6 : int MergingKDB::get (KeySet & returned, Key & parentKey)
41 : {
42 6 : int ret = KDB::get (returned, parentKey);
43 18 : base = returned.dup ();
44 6 : return ret;
45 : }
46 :
47 0 : int MergingKDB::synchronize (KeySet & returned, std::string const & keyname, ThreeWayMerge & merger)
48 : {
49 0 : Key parentKey (keyname.c_str (), KEY_CASCADING_NAME, KEY_END);
50 0 : return synchronize (returned, parentKey, merger);
51 : }
52 :
53 6 : int MergingKDB::synchronize (KeySet & returned, Key & parentKey, ThreeWayMerge & merger)
54 : {
55 : try
56 : {
57 : // write our config
58 6 : int ret = KDB::set (returned, parentKey);
59 :
60 : // update our config (if no conflict)
61 2 : KDB::get (returned, parentKey);
62 :
63 : return ret;
64 : }
65 8 : catch (KDBException const &)
66 : {
67 : // a conflict occurred, see if we can solve it with the merger
68 :
69 : // refresh the key database
70 12 : KeySet theirs = returned.dup ();
71 4 : KDB::get (theirs, parentKey);
72 :
73 : // try to merge
74 20 : MergeResult result = merger.mergeKeySet (MergeTask (BaseMergeKeys (base, parentKey), OurMergeKeys (returned, parentKey),
75 16 : TheirMergeKeys (theirs, parentKey), parentKey));
76 :
77 4 : if (!result.hasConflicts ())
78 : {
79 : // hurray, we solved the issue
80 4 : KeySet resultKeys = result.getMergedKeys ();
81 2 : int ret = KDB::set (resultKeys, parentKey);
82 2 : base = resultKeys;
83 2 : return ret;
84 : }
85 : else
86 : {
87 : // nothing we can do anymore
88 4 : KeySet conflictSet = result.getConflictSet ();
89 10 : throw MergingKDBException (parentKey, conflictSet);
90 : }
91 : }
92 : }
93 : } // namespace merging
94 : } // namespace tools
95 : } // namespace kdb
|