public static TrackablePocoTracker <IPerson> Convert(TrackablePersonTrackerSurrogate surrogate) { if (surrogate == null) { return(null); } var tracker = new TrackablePocoTracker <IPerson>(); if (surrogate.Name != null) { tracker.ChangeMap.Add(TrackablePerson.PropertyTable.Name, new TrackablePocoTracker <IPerson> .Change { NewValue = surrogate.Name.Value }); } if (surrogate.Age != null) { tracker.ChangeMap.Add(TrackablePerson.PropertyTable.Age, new TrackablePocoTracker <IPerson> .Change { NewValue = surrogate.Age.Value }); } if (surrogate.LeftHand != null) { tracker.ChangeMap.Add(TrackablePerson.PropertyTable.LeftHand, new TrackablePocoTracker <IPerson> .Change { NewValue = surrogate.LeftHand.Value }); } if (surrogate.RightHand != null) { tracker.ChangeMap.Add(TrackablePerson.PropertyTable.RightHand, new TrackablePocoTracker <IPerson> .Change { NewValue = surrogate.RightHand.Value }); } return(tracker); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType != JsonToken.StartObject) { return(null); } var tracker = new TrackablePocoTracker <T>(); reader.Read(); while (true) { if (reader.TokenType != JsonToken.PropertyName) { break; } var pi = (typeof(T)).GetProperty((string)reader.Value); reader.Read(); var obj = serializer.Deserialize(reader, pi.PropertyType); reader.Read(); tracker.TrackSet(pi, null, obj); } return(tracker); }
public static IPocoTracker <T> Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) { var tracker = new TrackablePocoTracker <T>(); var length = reader.ReadArrayHeader(); List <string> list = new List <string>(); for (var i = 0; i < length; i++) { list.Add(reader.ReadString()); } var objectType = typeof(T); for (var i = 0; i < length; i++) { var pi = objectType.GetProperty(list[i]); if (reader.TryReadNil()) { tracker.TrackSet(pi, null, null); } else { var data = reader.ReadBytes(); var method = SerializeMethodCache.GetDeserializeMethod(pi.PropertyType); var value = method.Invoke(null, new object[] { data.Value, options, null }); tracker.TrackSet(pi, null, value); } } return(tracker); }
public static TrackableSpaceShipDataTrackerSurrogate Convert(TrackablePocoTracker <ISpaceShipData> tracker) { if (tracker == null) { return(null); } var surrogate = new TrackableSpaceShipDataTrackerSurrogate(); foreach (var changeItem in tracker.ChangeMap) { switch (changeItem.Key.Name) { case "Hp": surrogate.Hp = new EnvelopedObject <int> { Value = (int)changeItem.Value.NewValue }; break; case "Score": surrogate.Score = new EnvelopedObject <int> { Value = (int)changeItem.Value.NewValue }; break; } } return(surrogate); }
public static TrackableHandTrackerSurrogate Convert(TrackablePocoTracker <IHand> tracker) { if (tracker == null) { return(null); } var surrogate = new TrackableHandTrackerSurrogate(); foreach (var changeItem in tracker.ChangeMap) { switch (changeItem.Key.Name) { case "MainRing": surrogate.MainRing = new EnvelopedObject <TrackableRing> { Value = (TrackableRing)changeItem.Value.NewValue }; break; case "SubRing": surrogate.SubRing = new EnvelopedObject <TrackableRing> { Value = (TrackableRing)changeItem.Value.NewValue }; break; } } return(surrogate); }
public static TrackableUserDataTrackerSurrogate Convert(TrackablePocoTracker <IUserData> tracker) { if (tracker == null) { return(null); } var surrogate = new TrackableUserDataTrackerSurrogate(); foreach (var changeItem in tracker.ChangeMap) { switch (changeItem.Key.Name) { case "Name": surrogate.Name = new EnvelopedObject <string> { Value = (string)changeItem.Value.NewValue }; break; case "Gold": surrogate.Gold = new EnvelopedObject <int> { Value = (int)changeItem.Value.NewValue }; break; case "Level": surrogate.Level = new EnvelopedObject <int> { Value = (int)changeItem.Value.NewValue }; break; } } return(surrogate); }
public void Test_PocoTracker_Serialize() { var tracker = new TrackablePocoTracker <IPerson>(); tracker.TrackSet(typeof(IPerson).GetProperty("Age"), 10, 11); AssertTrackerSerialize(tracker); }
public static TrackablePocoTracker <IUserData> Convert(TrackableUserDataTrackerSurrogate surrogate) { if (surrogate == null) { return(null); } var tracker = new TrackablePocoTracker <IUserData>(); if (surrogate.Name != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.Name, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.Name.Value }); } if (surrogate.Gold != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.Gold, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.Gold.Value }); } if (surrogate.Level != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.Level, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.Level.Value }); } return(tracker); }
public static TrackableUserDataTrackerSurrogate Convert(TrackablePocoTracker <IUserData> tracker) { if (tracker == null) { return(null); } var surrogate = new TrackableUserDataTrackerSurrogate(); foreach (var changeItem in tracker.ChangeMap) { switch (changeItem.Key.Name) { case "Nickname": surrogate.Nickname = new EnvelopedObject <string> { Value = (string)changeItem.Value.NewValue }; break; case "RegisterTime": surrogate.RegisterTime = new EnvelopedObject <DateTime> { Value = (DateTime)changeItem.Value.NewValue }; break; } } return(surrogate); }
public static TrackablePocoTracker <IUserData> Convert(TrackableUserDataTrackerSurrogate surrogate) { if (surrogate == null) { return(null); } var tracker = new TrackablePocoTracker <IUserData>(); if (surrogate.Name != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.Name, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.Name.Value }); } if (surrogate.RegisterTime != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.RegisterTime, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.RegisterTime.Value }); } if (surrogate.LastLoginTime != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.LastLoginTime, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.LastLoginTime.Value }); } if (surrogate.LoginCount != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.LoginCount, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.LoginCount.Value }); } if (surrogate.PlayCount != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.PlayCount, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.PlayCount.Value }); } if (surrogate.WinCount != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.WinCount, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.WinCount.Value }); } if (surrogate.LoseCount != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.LoseCount, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.LoseCount.Value }); } if (surrogate.DrawCount != null) { tracker.ChangeMap.Add(TrackableUserData.PropertyTable.DrawCount, new TrackablePocoTracker <IUserData> .Change { NewValue = surrogate.DrawCount.Value }); } return(tracker); }
public void Gather(IServerEntity entity) { var e = (SpaceShipServerBase)entity; if (e.Data.Changed) { DataTracker = (TrackablePocoTracker <ISpaceShipData>)e.Data.Tracker; } }
public async Task <int> SaveAsync(DbConnection connection, TrackablePocoTracker <T> tracker, params object[] keyValues) { if (tracker.HasChange == false) { return(0); } var sql = BuildSqlForSave(tracker, keyValues); using (var command = _sqlProvider.CreateDbCommand(sql, connection)) { return(await command.ExecuteNonQueryAsync()); } }
public UpdateDefinition <BsonDocument> BuildUpdatesForSave( UpdateDefinition <BsonDocument> update, TrackablePocoTracker <T> tracker, params object[] keyValues) { var keyNamespace = DocumentHelper.ToDotPathWithTrailer(keyValues); // mimic BsonClassMapSerializer.Serialize to serialize changed value correctly. // build bson elements containing set field values var setDocument = new BsonDocument(); var setBsonWriter = new BsonDocumentWriter(setDocument); var setContext = BsonSerializationContext.CreateRoot(setBsonWriter); setBsonWriter.WriteStartDocument(); foreach (var change in tracker.ChangeMap) { if (change.Value.NewValue != null) { BsonMemberMap memberMap; if (_propertyToMemberMap.TryGetValue(change.Key, out memberMap) == false) { continue; } setBsonWriter.WriteName(memberMap.ElementName); memberMap.GetSerializer().Serialize(setContext, change.Value.NewValue); } else { update = (update == null) ? Builders <BsonDocument> .Update.Unset(keyNamespace + change.Key.Name) : update.Unset(keyNamespace + change.Key.Name); } } setBsonWriter.WriteEndDocument(); setBsonWriter.Dispose(); foreach (var element in setDocument.Elements) { update = (update == null) ? Builders <BsonDocument> .Update.Set(keyNamespace + element.Name, element.Value) : update.Set(keyNamespace + element.Name, element.Value); } return(update); }
public Task <UpdateResult> SaveAsync(IMongoCollection <BsonDocument> collection, TrackablePocoTracker <T> tracker, params object[] keyValues) { if (keyValues.Length == 0) { throw new ArgumentException("At least 1 keyValue required."); } if (tracker.HasChange == false) { return(Task.FromResult((UpdateResult)null)); } return(collection.UpdateOneAsync( Builders <BsonDocument> .Filter.Eq("_id", keyValues[0]), BuildUpdatesForSave(null, tracker, keyValues.Skip(1).ToArray()))); }
public void TestPoco_ApplyToTracker_Work() { var person = CreateTestPersonWithTracker(); person.Name = "Bob"; person.Age = 30; var tracker2 = new TrackablePocoTracker <IPerson>(); person.Tracker.ApplyTo(tracker2); var person2 = CreateTestPerson(); tracker2.ApplyTo(person2); Assert.Equal(person.Name, person2.Name); Assert.Equal(person.Age, person2.Age); }
public string BuildSqlForSave(TrackablePocoTracker <T> tracker, params object[] keyValues) { if (tracker.HasChange == false) { return(string.Empty); } var sb = new StringBuilder(); sb.Append($"UPDATE {_tableEscapedName} SET "); var concating = false; foreach (var c in tracker.ChangeMap) { ColumnProperty column; if (_valueColumnMap.TryGetValue(c.Key, out column) == false) { continue; } if (concating == false) { concating = true; } else { sb.Append(","); } sb.Append(column.EscapedName); sb.Append("="); sb.Append(column.ConvertToSqlValue(c.Value.NewValue)); } if (concating == false) { return(string.Empty); } BuildWhereClauses(sb, keyValues); sb.Append(";\n"); return(sb.ToString()); }
public static TrackablePersonTrackerSurrogate Convert(TrackablePocoTracker <IPerson> tracker) { if (tracker == null) { return(null); } var surrogate = new TrackablePersonTrackerSurrogate(); foreach (var changeItem in tracker.ChangeMap) { switch (changeItem.Key.Name) { case "Name": surrogate.Name = new EnvelopedObject <string> { Value = (string)changeItem.Value.NewValue }; break; case "Age": surrogate.Age = new EnvelopedObject <int> { Value = (int)changeItem.Value.NewValue }; break; case "LeftHand": surrogate.LeftHand = new EnvelopedObject <TrackableHand> { Value = (TrackableHand)changeItem.Value.NewValue }; break; case "RightHand": surrogate.RightHand = new EnvelopedObject <TrackableHand> { Value = (TrackableHand)changeItem.Value.NewValue }; break; } } return(surrogate); }
public async Task SaveAsync(IDatabase db, TrackablePocoTracker <T> tracker, RedisKey key) { if (tracker.HasChange == false) { return; } var updates = new List <HashEntry>(); var removes = new List <RedisValue>(); foreach (var change in tracker.ChangeMap) { PropertyItem item; if (_propertyInfoToItemMap.TryGetValue(change.Key, out item) == false) { continue; } var redisValue = item.ConvertToRedisValue(change.Value.NewValue); if (redisValue.IsNull) { removes.Add(item.FieldName); } else { updates.Add(new HashEntry(item.FieldName, redisValue)); } } if (updates.Any()) { await db.HashSetAsync(key, updates.ToArray()); } if (removes.Any()) { await db.HashDeleteAsync(key, removes.ToArray()); } }
public static TrackablePocoTracker <IRing> Convert(TrackableRingTrackerSurrogate surrogate) { if (surrogate == null) { return(null); } var tracker = new TrackablePocoTracker <IRing>(); if (surrogate.Name != null) { tracker.ChangeMap.Add(TrackableRing.PropertyTable.Name, new TrackablePocoTracker <IRing> .Change { NewValue = surrogate.Name.Value }); } if (surrogate.Power != null) { tracker.ChangeMap.Add(TrackableRing.PropertyTable.Power, new TrackablePocoTracker <IRing> .Change { NewValue = surrogate.Power.Value }); } return(tracker); }
public static TrackablePocoTracker <IHand> Convert(TrackableHandTrackerSurrogate surrogate) { if (surrogate == null) { return(null); } var tracker = new TrackablePocoTracker <IHand>(); if (surrogate.MainRing != null) { tracker.ChangeMap.Add(TrackableHand.PropertyTable.MainRing, new TrackablePocoTracker <IHand> .Change { NewValue = surrogate.MainRing.Value }); } if (surrogate.SubRing != null) { tracker.ChangeMap.Add(TrackableHand.PropertyTable.SubRing, new TrackablePocoTracker <IHand> .Change { NewValue = surrogate.SubRing.Value }); } return(tracker); }
public static TrackablePocoTracker <ISpaceShipData> Convert(TrackableSpaceShipDataTrackerSurrogate surrogate) { if (surrogate == null) { return(null); } var tracker = new TrackablePocoTracker <ISpaceShipData>(); if (surrogate.Hp != null) { tracker.ChangeMap.Add(TrackableSpaceShipData.PropertyTable.Hp, new TrackablePocoTracker <ISpaceShipData> .Change { NewValue = surrogate.Hp.Value }); } if (surrogate.Score != null) { tracker.ChangeMap.Add(TrackableSpaceShipData.PropertyTable.Score, new TrackablePocoTracker <ISpaceShipData> .Change { NewValue = surrogate.Score.Value }); } return(tracker); }
public static TrackableUserDataTrackerSurrogate Convert(TrackablePocoTracker <IUserData> tracker) { if (tracker == null) { return(null); } var surrogate = new TrackableUserDataTrackerSurrogate(); foreach (var changeItem in tracker.ChangeMap) { switch (changeItem.Key.Name) { case "Name": surrogate.Name = new EnvelopedObject <string> { Value = (string)changeItem.Value.NewValue }; break; case "RegisterTime": surrogate.RegisterTime = new EnvelopedObject <DateTime> { Value = (DateTime)changeItem.Value.NewValue }; break; case "LastLoginTime": surrogate.LastLoginTime = new EnvelopedObject <DateTime> { Value = (DateTime)changeItem.Value.NewValue }; break; case "LoginCount": surrogate.LoginCount = new EnvelopedObject <int> { Value = (int)changeItem.Value.NewValue }; break; case "PlayCount": surrogate.PlayCount = new EnvelopedObject <int> { Value = (int)changeItem.Value.NewValue }; break; case "WinCount": surrogate.WinCount = new EnvelopedObject <int> { Value = (int)changeItem.Value.NewValue }; break; case "LoseCount": surrogate.LoseCount = new EnvelopedObject <int> { Value = (int)changeItem.Value.NewValue }; break; case "DrawCount": surrogate.DrawCount = new EnvelopedObject <int> { Value = (int)changeItem.Value.NewValue }; break; } } return(surrogate); }
public void Serialize(ref MessagePackWriter writer, TrackablePocoTracker <T> value, MessagePackSerializerOptions options) { TrackablePocoTrackerMessagePackFormatter <T> .Serialize(ref writer, value, options); }
public static TrackablePocoTracker<IUserData> Convert(TrackableUserDataTrackerSurrogate surrogate) { if (surrogate == null) return null; var tracker = new TrackablePocoTracker<IUserData>(); if (surrogate.Name != null) tracker.ChangeMap.Add(TrackableUserData.PropertyTable.Name, new TrackablePocoTracker<IUserData>.Change { NewValue = surrogate.Name.Value }); if (surrogate.Gold != null) tracker.ChangeMap.Add(TrackableUserData.PropertyTable.Gold, new TrackablePocoTracker<IUserData>.Change { NewValue = surrogate.Gold.Value }); if (surrogate.Level != null) tracker.ChangeMap.Add(TrackableUserData.PropertyTable.Level, new TrackablePocoTracker<IUserData>.Change { NewValue = surrogate.Level.Value }); return tracker; }
public static TrackableUserDataTrackerSurrogate Convert(TrackablePocoTracker<IUserData> tracker) { if (tracker == null) return null; var surrogate = new TrackableUserDataTrackerSurrogate(); foreach(var changeItem in tracker.ChangeMap) { switch (changeItem.Key.Name) { case "Name": surrogate.Name = new EnvelopedObject<string> { Value = (string)changeItem.Value.NewValue }; break; case "Gold": surrogate.Gold = new EnvelopedObject<int> { Value = (int)changeItem.Value.NewValue }; break; case "Level": surrogate.Level = new EnvelopedObject<int> { Value = (int)changeItem.Value.NewValue }; break; } } return surrogate; }
public void TestPoco_ApplyToTracker_Work() { var person = CreateTestPersonWithTracker(); person.Name = "Bob"; person.Age = 30; var tracker2 = new TrackablePocoTracker<IPerson>(); person.Tracker.ApplyTo(tracker2); var person2 = CreateTestPerson(); tracker2.ApplyTo(person2); Assert.Equal(person.Name, person2.Name); Assert.Equal(person.Age, person2.Age); }