Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #8
0
        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);
        }
Пример #10
0
        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);
        }
Пример #11
0
            public void Gather(IServerEntity entity)
            {
                var e = (SpaceShipServerBase)entity;

                if (e.Data.Changed)
                {
                    DataTracker = (TrackablePocoTracker <ISpaceShipData>)e.Data.Tracker;
                }
            }
Пример #12
0
        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())));
        }
Пример #15
0
        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);
        }
Пример #16
0
        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());
        }
Пример #17
0
        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);
        }
Пример #18
0
        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());
            }
        }
Пример #19
0
        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);
        }
Пример #20
0
        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);
        }
Пример #21
0
        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);
        }
Пример #22
0
        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);
        }
Пример #23
0
 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;
        }
Пример #26
0
        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);
        }