public void KeyGenerationTest1()
        {
            var status = new ObjectSyncStatusRealm
            {
                MobilePrimaryKey = "123",
                Type             = "qwe"
            };

            status.MobilePrimaryKey.Should().BeEquivalentTo("123");
            status.Type.Should().BeEquivalentTo("qwe");
        }
        public void KeyGenerationTest2()
        {
            var status = new ObjectSyncStatusRealm
            {
                MobilePrimaryKey = "123",
                Type             = "qwe"
            };

            var key     = status.Key;
            var status2 = new ObjectSyncStatusRealm {
                Key = key
            };

            status2.MobilePrimaryKey.Should().Be("123");
            status2.Type.Should().Be("qwe");

            status2.Type = "zxc";

            status2.MobilePrimaryKey.Should().Be("123");
            status2.Type.Should().Be("zxc");
        }
 public static void SetSyncState(this ObjectSyncStatusRealm obj, SyncState syncState)
 {
     obj.SyncState = (int)syncState;
 }
 public static SyncState GetSyncState(this ObjectSyncStatusRealm obj)
 {
     return((SyncState)obj.SyncState);
 }
Beispiel #5
0
        private void StoreChangedObjects(List <DownloadResponseItem> changedObjects, Realm realmiusData, Realm realmLocal)
        {
            var problematicChangedObjects = new List <DownloadResponseItem>();

            realmLocal.Write(() =>
            {
                foreach (var changeObject in changedObjects)
                {
                    _downloadIndex++;
                    string changedObjectInfo = !changeObject.IsDeleted
                        ? changeObject.SerializedObject
                        : "{" + $"\n  \"{nameof(changeObject.Type)}\": \"{changeObject.Type}\",\n  \"{nameof(changeObject.MobilePrimaryKey)}\": \"{changeObject.MobilePrimaryKey}\"\n  \"{nameof(changeObject.IsDeleted)}\": \"{changeObject.IsDeleted}\"\n" + "}";
                    Logger.Debug(
                        $"Down:{_downloadIndex}, {changeObject.Type}.{changeObject.MobilePrimaryKey}: {changedObjectInfo}");
                    try
                    {
                        var syncStateObject = FindSyncStatus(realmiusData, changeObject.Type, changeObject.MobilePrimaryKey);
                        if (syncStateObject == null)
                        {
                            syncStateObject = new ObjectSyncStatusRealm
                            {
                                Type             = changeObject.Type,
                                MobilePrimaryKey = changeObject.MobilePrimaryKey,
                                SyncState        = (int)SyncState.Synced,
                            };
                            realmiusData.Write(() =>
                            {
                                realmiusData.Add(syncStateObject);
                            });
                            //Logger.Log.Debug($"  Created SyncStatus {changeObject.MobilePrimaryKey}");
                        }

                        var objInDb = (IRealmiusObjectClient)realmLocal.Find(changeObject.Type, changeObject.MobilePrimaryKey);
                        if (objInDb == null)
                        {
                            //object not found in database - let's create new one
                            if (!changeObject.IsDeleted)
                            {
                                IRealmiusObjectClient obj =
                                    (IRealmiusObjectClient)Activator.CreateInstance(_typesToSync[changeObject.Type].Type);

                                try
                                {
                                    _skipObjectChanges = true;
                                    //realmLocal.Write(
                                    //    () =>
                                    //    {
                                    AssignKey(obj, changeObject.MobilePrimaryKey, realmLocal);
                                    var success = Populate(changeObject.SerializedObject, obj, realmLocal);
                                    realmLocal.AddSkipUpload(obj, false);

                                    if (!success)
                                    {
                                        problematicChangedObjects.Add(changeObject);
                                    }
                                    //});
                                }
                                finally
                                {
                                    _skipObjectChanges = false;
                                }
                            }
                        }
                        else
                        {
                            //object exists in database, let's update it
                            var uploadItems =
                                realmiusData.All <UploadRequestItemRealm>()
                                .Where(
                                    x =>
                                    x.Type == changeObject.Type &&
                                    x.PrimaryKey == changeObject.MobilePrimaryKey);

                            if (changeObject.IsDeleted)
                            {
                                //realmLocal.Write(
                                //    () =>
                                //    {
                                realmiusData.Write(
                                    () =>
                                {
                                    syncStateObject.SerializedObject = SerializeObject(objInDb);
                                    syncStateObject.IsDeleted        = changeObject.IsDeleted;
                                });

                                realmLocal.Remove((RealmObject)objInDb);
                                //});
                            }
                            else
                            {
                                try
                                {
                                    _skipObjectChanges = true;
                                    //realmLocal.Write(
                                    //    () =>
                                    //    {


                                    var success = Populate(changeObject.SerializedObject, objInDb, realmLocal);
                                    if (!success)
                                    {
                                        problematicChangedObjects.Add(changeObject);
                                    }

                                    //we need to apply all "uploads" to our object to keep it consistent
                                    foreach (UploadRequestItemRealm uploadRequestItemRealm in uploadItems)
                                    {
                                        Populate(uploadRequestItemRealm.SerializedObject, objInDb, realmLocal);
                                    }

                                    realmiusData.Write(
                                        () =>
                                    {
                                        syncStateObject.SerializedObject = SerializeObject(objInDb);
                                        syncStateObject.IsDeleted        = changeObject.IsDeleted;
                                    });

                                    //});
                                }
                                finally
                                {
                                    _skipObjectChanges = false;
                                }
                            }
                            //Logger.Log.Info("     syncState.Change.Finished");
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Debug($"error applying changed objects {ex}");
                    }
                }
            });

            if (problematicChangedObjects.Count < changedObjects.Count)
            {
                StoreChangedObjects(problematicChangedObjects, realmiusData, realmLocal);
            }
        }
Beispiel #6
0
        private void HandleObjectChanged(IRealmiusObjectClient obj, Realm realmiusData, Realm realm, bool skipUpload = false, bool isDeleted = false)
        {
            var className = obj.GetType().Name;

            if (!_typesToSync.ContainsKey(className))
            {
                return;
            }

            var serializedCurrent = SerializeObject(obj);

            realmiusData.Refresh();
            var syncStatusObject = FindSyncStatus(realmiusData, className, obj.MobilePrimaryKey);

            if (syncStatusObject != null && syncStatusObject.SerializedObject == serializedCurrent && syncStatusObject.IsDeleted == isDeleted)
            {
                return; //could happen when new objects were downloaded from Server
            }
            if (!skipUpload && _skipObjectChanges)
            {
                return;
            }

            if (syncStatusObject == null)
            {
                realmiusData.Write(() =>
                {
                    syncStatusObject = new ObjectSyncStatusRealm()
                    {
                        Type             = className,
                        MobilePrimaryKey = obj.MobilePrimaryKey,
                        SerializedObject = null,
                        SyncState        = (int)SyncState.UnSynced,
                    };
                    realmiusData.Add(syncStatusObject);
                });
                Logger.Debug($"  Created SyncStatus {obj.MobilePrimaryKey}");
            }

            if (skipUpload)
            {
                realmiusData.Write(
                    () =>
                {
                    syncStatusObject.SerializedObject = serializedCurrent;
                    syncStatusObject.IsDeleted        = isDeleted;
                    syncStatusObject.SyncState        = (int)SyncState.Synced;
                });
            }
            else
            {
                var serializedDiff = JsonHelper.GetJsonDiff(
                    syncStatusObject.SerializedObject ?? "{}",
                    serializedCurrent);
                if (serializedDiff != "{}" || isDeleted)
                {
                    realmiusData.Write(
                        () =>
                    {
                        //Logger.Log.Debug("UploadRequestItemRealm added");
                        realmiusData.Add(
                            new UploadRequestItemRealm()
                        {
                            Type             = className,
                            IsDeleted        = isDeleted,
                            PrimaryKey       = obj.MobilePrimaryKey,
                            SerializedObject = serializedDiff,
                            DateTime         = DateTimeOffset.Now,
                        });
                        syncStatusObject.SerializedObject = serializedCurrent;
                        syncStatusObject.IsDeleted        = isDeleted;
                        syncStatusObject.SyncState        = (int)SyncState.UnSynced;
                    });


                    if (_typesToSync[className].ImplementsSyncState)
                    {
                        SetSyncState(realm, obj, SyncState.UnSynced);
                    }
                }
            }
        }