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); }
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); } }
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); } } } }