private long TrySyncDown(SyncState.MergeModeOptions mergeMode) { // Ids clause String idsClause = "('" + String.Join("', '", _idToNames.Keys) + "')"; // Create sync SyncDownTarget target = new SoqlSyncDownTarget("SELECT Id, Name, " + Constants.LastModifiedDate + " FROM Account WHERE Id IN " + idsClause); SyncOptions options = SyncOptions.OptionsForSyncDown(mergeMode); SyncState sync = SyncState.CreateSyncDown(_smartStore, target, AccountsSoup, options); long syncId = sync.Id; CheckStatus(sync, SyncState.SyncTypes.SyncDown, syncId, SyncState.SyncStatusTypes.New, 0, -1); // Run sync _syncCheck = 0; _syncManager.RunSync(sync, HandleSyncDownCheck); DateTime end = DateTime.Now.AddSeconds(60); while (_syncCheck < 3) { if (DateTime.Now > end) { Assert.Fail("Sync timed out"); } } return(syncId); }
private void SaveRecordsToSmartStore(string soupName, IEnumerable <JToken> records, SyncState.MergeModeOptions mergeMode) { _smartStore.Database.BeginTransaction(); HashSet <string> idsToSkip = null; if (SyncState.MergeModeOptions.LeaveIfChanged == mergeMode) { idsToSkip = GetDirtyRecordIds(soupName, Constants.Id); } foreach (JObject record in records.Select(t => t.ToObject <JObject>())) { // Skip if LeaveIfChanged and id is in dirty list if (idsToSkip != null && SyncState.MergeModeOptions.LeaveIfChanged == mergeMode) { var id = record.ExtractValue <string>(Constants.Id); if (!String.IsNullOrWhiteSpace(id) && idsToSkip.Contains(id)) { continue; // don't write over dirty record } } // Save record[Local] = false; record[LocallyCreated] = false; record[LocallyUpdated] = false; record[LocallyUpdated] = false; _smartStore.Upsert(soupName, record, Constants.Id, false); } _smartStore.Database.CommitTransaction(); }
private long TrySyncUp(int numberOfChanges, SyncState.MergeModeOptions mergeMode = SyncState.MergeModeOptions.Overwrite) { // Create sync SyncOptions options = SyncOptions.OptionsForSyncUp(new List <string>(new[] { Constants.Name }), mergeMode); var target = new SyncUpTarget(); SyncState sync = SyncState.CreateSyncUp(_smartStore, target, options, AccountsSoup); long syncId = sync.Id; CheckStatus(sync, SyncState.SyncTypes.SyncUp, syncId, SyncState.SyncStatusTypes.New, 0, -1); // run sync _syncCheck = 0; _numberOfChanges = numberOfChanges; DateTime end = DateTime.Now.AddSeconds(60); _syncManager.RunSync(sync, HandleSyncUpCheck); while (_syncCheck < 1) { if (DateTime.Now > end) { Assert.Fail("Sync timed out"); } } return(syncId); }
private async Task <bool> SyncUpOneRecord(SyncUpTarget target, string soupName, List <string> fieldList, JObject record, SyncState.MergeModeOptions mergeMode) { var action = SyncAction.None; if (record.ExtractValue <bool>(LocallyDeleted)) { action = SyncAction.Delete; } else if (record.ExtractValue <bool>(LocallyCreated)) { action = SyncAction.Create; } else if (record.ExtractValue <bool>(LocallyUpdated)) { action = SyncAction.Update; } if (SyncAction.None == action) { // nothing to do for this record return(true); } // getting type and id string objectType = SmartStore.Store.SmartStore.Project(record, Constants.SobjectType).ToString(); var objectId = record.ExtractValue <string>(target.GetId()); var lastModifiedDate = record.ExtractValue <DateTime>(target.GetModificationDate()).Ticks; /* * Check if we're attempting to update a record that has been updated on the server after the client update. * If merge mode passed in tells us to leave the record alone, we will do nothing and return here. */ if (SyncState.MergeModeOptions.LeaveIfChanged == mergeMode && (action == SyncAction.Update || action == SyncAction.Delete)) { bool isNewer = await IsNewerThanServer(target, objectType, objectId, lastModifiedDate.ToString()); if (!isNewer) { return(true); } } var fields = new Dictionary <string, object>(); if (SyncAction.Create == action || SyncAction.Update == action) { foreach ( string fieldName in fieldList.Where(fieldName => !target.GetId().Equals(fieldName, StringComparison.CurrentCulture) && !target.GetModificationDate().Equals(fieldName, StringComparison.CurrentCulture) && !Constants.SystemModstamp.Equals(fieldName, StringComparison.CurrentCulture))) { fields.Add(fieldName, record[fieldName]); } } switch (action) { case SyncAction.Create: String recordServerId = await target.CreateOnServerAsync(this, objectType, fields); if (recordServerId != null) { record[target.GetId()] = recordServerId; CleanAndSaveRecord(soupName, record); } break; case SyncAction.Delete: if (await target.DeleteOnServer(this, objectType, objectId)) { _smartStore.Delete(soupName, new[] { record.ExtractValue <long>(SmartStore.Store.SmartStore.SoupEntryId) }, false); } break; case SyncAction.Update: if (await target.UpdateOnServer(this, objectType, objectId, fields)) { CleanAndSaveRecord(soupName, record); } break; } return(false); }
public static SyncOptions OptionsForSyncDown(SyncState.MergeModeOptions mergeMode) { return(new SyncOptions(null, mergeMode)); }
public static SyncOptions OptionsForSyncUp(List <string> fieldList, SyncState.MergeModeOptions mergeMode = SyncState.MergeModeOptions.Overwrite) { return(new SyncOptions(fieldList, mergeMode)); }
private SyncOptions(List <string> fieldList, SyncState.MergeModeOptions mergeMode) : this(fieldList) { MergeMode = mergeMode; }