LCOV - code coverage report
Current view: top level - src/libs/tools/src/merging - mergingkdb.cpp (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 23 32 71.9 %
Date: 2019-09-12 12:28:41 Functions: 4 8 50.0 %

          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

Generated by: LCOV version 1.13