public WITEditEditConflictTypeDetails GetConflictDetails(MigrationConflict conflict) { if (!conflict.ConflictType.ReferenceName.Equals(this.ReferenceName)) { throw new InvalidOperationException(); } if (string.IsNullOrEmpty(conflict.ConflictDetails)) { throw new ArgumentNullException("conflict.ConflictDetails"); } WITEditEditConflictTypeDetails details; string[] splits = conflict.ConflictDetails.Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries); switch (splits.Length) { case 3: // backward compatible: we used to have 'source_item_id::source_item_version::target_item_id' details = new WITEditEditConflictTypeDetails(splits[0], splits[1], splits[2]); break; case 4: details = new WITEditEditConflictTypeDetails(splits[0], splits[1], splits[2], splits[3]); break; case 6: details = new WITEditEditConflictTypeDetails(splits[0], splits[1], splits[2], splits[3], splits[4], splits[5]); break; default: throw new ArgumentException(string.Format( MigrationToolkitResources.InvalidWitEditEditConflictDetailsString, conflict.ConflictDetails)); } return(details); }
private bool updateConversionHistory(MigrationConflict conflict, ConflictResolutionRule rule) { if (!rule.DataFieldDictionary.ContainsKey(VCContentConflictUserMergeChangeAction.MigrationInstructionChangeId) || !rule.DataFieldDictionary.ContainsKey(VCContentConflictUserMergeChangeAction.DeltaTableChangeId)) { return(false); } string migrationInstructionName = rule.DataFieldDictionary[VCContentConflictUserMergeChangeAction.MigrationInstructionChangeId]; string deltaTableName = rule.DataFieldDictionary[VCContentConflictUserMergeChangeAction.DeltaTableChangeId]; using (RuntimeEntityModel context = RuntimeEntityModel.CreateInstance()) { ChangeGroup conflictChangeGroup = conflict.ConflictedChangeAction.ChangeGroup; Guid deltaSideSourceId; // Mark all delta table entry as DeltaComplete var deltaTableEntries = from d in context.RTChangeGroupSet where d.SessionUniqueId == conflictChangeGroup.SessionId && d.Status == (int)ChangeStatus.DeltaPending select d; foreach (RTChangeGroup deltaTableEntry in deltaTableEntries) { deltaTableEntry.Status = (int)ChangeStatus.DeltaComplete; deltaTableEntry.ContainsBackloggedAction = false; } // Mark all migration instruction entry as Complete var migrationInstructionEntries = from d in context.RTChangeGroupSet where d.SessionUniqueId == conflictChangeGroup.SessionId && (d.Status == (int)ChangeStatus.Pending || d.Status == (int)ChangeStatus.InProgress || d.Status == (int)ChangeStatus.PendingConflictDetection) select d; foreach (RTChangeGroup migrationInstructionEntry in migrationInstructionEntries) { migrationInstructionEntry.Status = (int)ChangeStatus.Complete; migrationInstructionEntry.ContainsBackloggedAction = false; } // Mark the source side highwatermark var sourceSideHighWaterMark = (from hwm in context.RTHighWaterMarkSet where hwm.SessionUniqueId == conflictChangeGroup.SessionId && hwm.SourceUniqueId != conflictChangeGroup.SourceId && hwm.Name == Constants.HwmDelta select hwm).First(); Debug.Assert(sourceSideHighWaterMark != null, "Can't find the source side HWM"); sourceSideHighWaterMark.Value = deltaTableName; deltaSideSourceId = sourceSideHighWaterMark.SourceUniqueId; // Mark the target side highwatermark var targetHighWaterMark = (from hwm in context.RTHighWaterMarkSet where hwm.SessionUniqueId == conflictChangeGroup.SessionId && hwm.SourceUniqueId == conflictChangeGroup.SourceId && hwm.Name == Constants.HwmDelta select hwm).First(); Debug.Assert(targetHighWaterMark != null, "Can't find the target side HWM"); targetHighWaterMark.Value = migrationInstructionName; // Create the conversion history entry RTConversionHistory conversionHistory = RTConversionHistory.CreateRTConversionHistory( DateTime.UtcNow, -1, true); conversionHistory.Comment = rule.RuleDescription; var session = (from s in context.RTSessionConfigSet where s.SessionUniqueId == conflictChangeGroup.SessionId select s).First(); Debug.Assert(session != null, "Cannot find session in DB"); RTSessionRun sessionRun = (from sr in context.RTSessionRunSet where sr.Id == session.Id select sr).First(); Debug.Assert(sessionRun != null, "Cannot find session run in DB"); conversionHistory.SessionRun = sessionRun; RTMigrationSource migrationSource = (from ms in context.RTMigrationSourceSet where ms.UniqueId.Equals(conflictChangeGroup.SourceId) select ms).First(); Debug.Assert(migrationSource != null, "Cannot find the migration source to persist conversion history"); RTMigrationSource deltaSideMigrationSource = (from ms in context.RTMigrationSourceSet where ms.UniqueId.Equals(deltaSideSourceId) select ms).First(); Debug.Assert(deltaSideMigrationSource != null, "Cannot find the migration source to persist conversion history"); conversionHistory.SourceMigrationSource = migrationSource; context.AddToRTConversionHistorySet(conversionHistory); RTMigrationItem sourceItem = RTMigrationItem.CreateRTMigrationItem(0, deltaTableName, Constants.ChangeGroupGenericVersionNumber); sourceItem.MigrationSource = migrationSource; RTMigrationItem targetItem = RTMigrationItem.CreateRTMigrationItem(0, migrationInstructionName, Constants.ChangeGroupGenericVersionNumber); targetItem.MigrationSource = deltaSideMigrationSource; RTItemRevisionPair pair = RTItemRevisionPair.CreateRTItemRevisionPair( sourceItem.Id, targetItem.Id); pair.LeftMigrationItem = sourceItem; pair.RightMigrationItem = targetItem; pair.ConversionHistory = conversionHistory; // Create a new HistoryNotFoundConflict Resolution Rule context.TrySaveChanges(); } return(true); }
public MigrationUnresolvedConflictException(MigrationConflict conflict) : base(conflict.Description) { m_conflict = conflict; }
public bool CanResolve(MigrationConflict conflict, ConflictResolutionRule rule) { return(ConflictTypeHandled.ScopeInterpreter.IsInScope(conflict.ScopeHint, rule.ApplicabilityScope)); }
public static ConflictResolutionResult TryResolve(ConflictResolutionRule rule, MigrationConflict conflict) { throw new NotImplementedException(); }
public ConflictResolutionResult Resolve(IServiceContainer serviceContainer, MigrationConflict conflict, ConflictResolutionRule rule, out List <MigrationAction> actions) { actions = null; return(new ConflictResolutionResult(true, ConflictResolutionType.Other)); }
public bool CanResolve(MigrationConflict conflict, ConflictResolutionRule rule) { return(true); }