Introduce synchronize merge method

* Create history-based merging that keeps older data in history instead of discarding or deleting it
* Extract merge logic into the Merger class
* Allows special merge behavior
* Improve handling of deletion and changes on groups
* Enable basic change tracking while merging
* Prevent unintended timestamp changes while merging
* Handle differences in timestamp precision
* Introduce comparison operators to allow for more sophisticated comparisons (ignore special properties, ...)
* Introduce Clock class to handle datetime across the app

Merge Strategies:
* Default (use inherited/fallback method)
* Duplicate (duplicate conflicting nodes, apply all deletions)
* KeepLocal (use local values, but apply all deletions)
* KeepRemote (use remote values, but apply all deletions)
* KeepNewer (merge history only)
* Synchronize (merge history, newest value stays on top, apply all deletions)
This commit is contained in:
Jonathan White 2018-09-30 08:45:06 -04:00 committed by Jonathan White
parent b40e5686dc
commit c1e9f45df9
43 changed files with 2777 additions and 585 deletions

View file

@ -17,6 +17,7 @@
#include "KdbxXmlReader.h"
#include "KeePass2RandomStream.h"
#include "core/Clock.h"
#include "core/DatabaseIcons.h"
#include "core/Endian.h"
#include "core/Entry.h"
@ -1032,7 +1033,7 @@ QDateTime KdbxXmlReader::readDateTime()
return QDateTime(QDate(1, 1, 1), QTime(0, 0, 0, 0), Qt::UTC).addSecs(secs);
}
QDateTime dt = QDateTime::fromString(str, Qt::ISODate);
QDateTime dt = Clock::parse(str, Qt::ISODate);
if (dt.isValid()) {
return dt;
}
@ -1041,7 +1042,7 @@ QDateTime KdbxXmlReader::readDateTime()
raiseError(tr("Invalid date time value"));
}
return QDateTime::currentDateTimeUtc();
return Clock::currentDateTimeUtc();
}
QColor KdbxXmlReader::readColor()