internal void ApplyChangesByKnowledge(ApplyChangesByKnowledgeParameter parameter, ref ApplyChangesByKnowledgeResult result) { if (parameter == null) { throw new NullReferenceException(nameof(parameter)); } result = new ApplyChangesByKnowledgeResult(parameter.PayloadAction, parameter.SynchronizationId, parameter.CustomInfo); if (GetAllKnowledgeInfos(parameter.SynchronizationId, parameter.CustomInfo).Where(w => w.DatabaseInstanceId == parameter.DestinationDatabaseInstanceId && w.IsLocal).Count() == 0) { throw new SyncEngineConstraintException("Unexpected Knowledge Info State on Destination. Destination is not provisioned yet."); } parameter.Log.Add("Applying Data Type Changes..."); parameter.Log.Add($"SyncTypes Count: {parameter.Changes.Count}"); List <Type> postEventTypes = new List <Type>(); Dictionary <Type, List <object> > dictDeletedIds = new Dictionary <Type, List <object> >(); for (int i = 0; i < parameter.Changes.Count; i++) { JObject typeChanges = parameter.Changes[i].Value <JObject>(); parameter.Log.Add($"Applying Type: {typeChanges["syncType"].Value<string>()}..."); (Type localSyncType, List <object> appliedIds, List <object> deletedIds) = ApplyTypeChanges(parameter.Log, result.Inserts, result.Updates, result.Deletes, result.Conflicts, typeChanges, parameter.SynchronizationId, parameter.CustomInfo, parameter.SourceDatabaseInstanceId, parameter.DestinationDatabaseInstanceId); parameter.Log.Add($"Type: {typeChanges["syncType"].Value<string>()} Applied, Count: {appliedIds.Count}"); if (deletedIds.Count > 0) { if (!postEventTypes.Contains(localSyncType)) { postEventTypes.Add(localSyncType); } dictDeletedIds[localSyncType] = deletedIds; } } ProcessPostEvents(parameter.Log, postEventTypes, dictDeletedIds, parameter.SynchronizationId, parameter.CustomInfo); }
public static ApplyChangesByKnowledgeResult FromPayload(JObject payload) { string synchronizationId = payload[nameof(SynchronizationId)].Value <string>(); Dictionary <string, object> customInfo = payload[nameof(CustomInfo)].ToObject <Dictionary <string, object> >(); PayloadAction payloadAction = (PayloadAction)Enum.Parse(typeof(PayloadAction), payload[nameof(PayloadAction)].Value <string>()); ApplyChangesByKnowledgeResult result = new ApplyChangesByKnowledgeResult(payloadAction, synchronizationId, customInfo); result.Inserts = payload[nameof(Inserts)].ToObject <List <SyncLog.SyncLogData> >(); result.Updates = payload[nameof(Updates)].ToObject <List <SyncLog.SyncLogData> >(); result.Deletes = payload[nameof(Deletes)].ToObject <List <SyncLog.SyncLogData> >(); result.Conflicts = payload[nameof(Conflicts)].ToObject <List <SyncLog.SyncLogConflict> >(); return(result); }