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);
        }
Пример #2
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
 public static SyncOptions OptionsForSyncDown(SyncState.MergeModeOptions mergeMode)
 {
     return(new SyncOptions(null, mergeMode));
 }
Пример #6
0
 public static SyncOptions OptionsForSyncUp(List <string> fieldList, SyncState.MergeModeOptions mergeMode = SyncState.MergeModeOptions.Overwrite)
 {
     return(new SyncOptions(fieldList, mergeMode));
 }
Пример #7
0
 private SyncOptions(List <string> fieldList, SyncState.MergeModeOptions mergeMode) : this(fieldList)
 {
     MergeMode = mergeMode;
 }