Пример #1
0
        public SubObjectDirtyTrackerTemplate(object aggregate, BsonMemberMap map)
        {
            _map = map;

            var currentSubObjectValue = aggregate == null ? null : _map.Getter(aggregate);

            _originalValue    = _map.GetSerializer().ToBsonValue(currentSubObjectValue);
            _trackerTemplates = GetDirtyTrackerTemplates(_map.MemberType, currentSubObjectValue);
        }
Пример #2
0
        private void SerializeMember(BsonSerializationContext context, TClass document, BsonMemberMap memberMap)
        {
            IBsonWriter bsonWriter = context.Writer;
            object      value      = memberMap.Getter(document);

            if (memberMap.ShouldSerialize(document, value))
            {
                bsonWriter.WriteName(memberMap.ElementName);
                memberMap.GetSerializer().Serialize(context, value);
            }
        }
 /// <summary>
 /// Applies the Ignore Empty Enumerables convention to the given <paramref name="memberMap"/>.
 /// </summary>
 /// <param name="memberMap">The <see cref="BsonMemberMap" /> to which the convention will be applied.</param>
 public virtual void Apply(BsonMemberMap memberMap)
 {
     Check.NotNull(memberMap, nameof(memberMap));
     if (memberMap.MemberType.TryGetSequenceType() != null)
     {
         memberMap.SetShouldSerializeMethod(@object =>
         {
             object value = memberMap.Getter(@object);
             return((value as IEnumerable)?.GetEnumerator().MoveNext() ?? false);
         });
     }
 }
        private void DeserializeExtraElement(BsonReader bsonReader, object obj, string elementName, BsonMemberMap extraElementsMemberMap)
        {
            BsonDocument bsonDocument = (BsonDocument)extraElementsMemberMap.Getter(obj);

            if (bsonDocument == (BsonDocument)null)
            {
                bsonDocument = new BsonDocument();
                extraElementsMemberMap.Setter(obj, (object)bsonDocument);
            }
            BsonValue bsonValue = BsonValue.ReadFrom(bsonReader);

            bsonDocument[elementName] = bsonValue;
        }
Пример #5
0
        public void Replace <T>(string collectionName, string criteria, T data, bool insertIfNotFound)
        {
            var flags = UpdateFlags.None;

            if (insertIfNotFound)
            {
                flags |= UpdateFlags.Upsert;
            }
            BsonDocument deserialized;
            var          stringData = data as string;

            if (stringData != null)
            {
                Exception exception;
                if (!AttemptDeserialize(data as string, out deserialized, out exception))
                {
                    throw new Exception("Invalid JSON format in 'Data'", exception);
                }
                Replace(collectionName, criteria, deserialized, insertIfNotFound);
                return;
            }
            RegisterClassForBSONSerialisation <T>();
            MongoCollection <T> collection = Database.GetCollection <T>(collectionName);

            WriteConcernResult result;

            if (String.IsNullOrEmpty(criteria) && typeof(T) != typeof(BsonDocument))
            {
                IEnumerable <BsonClassMap> maps = BsonClassMap.GetRegisteredClassMaps();
                BsonMemberMap idMap             = maps.First(v => v.ClassType == typeof(T)).IdMemberMap;
                if (idMap == null)
                {
                    throw new MongoException(
                              "Cannot perform mongo replace: no criteria specified and the object does not have an id field");
                }
                var id = (string)idMap.Getter(data);
                if (String.IsNullOrEmpty(id))
                {
                    throw new MongoException("Cannot perform mongo replace: no criteria specified and the object's id field is not set");
                }

                result = collection.Update(Query.EQ("_id", new ObjectId(id)), global::MongoDB.Driver.Builders.Update.Replace(data), flags);
            }
            else
            {
                result = collection.Update(new QueryDocument(ParseQuery(criteria)), global::MongoDB.Driver.Builders.Update.Replace(data),
                                           flags);
            }

            Log(string.Format("{0} items {1}.", result.DocumentsAffected, (result.DocumentsAffected == 0) || (result.UpdatedExisting) ? "replaced" : "inserted"));
        }
        private void SerializeExtraElements(BsonWriter bsonWriter, object obj, BsonMemberMap extraElementsMemberMap)
        {
            BsonDocument bsonDocument = (BsonDocument)extraElementsMemberMap.Getter(obj);

            if (!(bsonDocument != (BsonDocument)null))
            {
                return;
            }
            foreach (BsonElement bsonElement in bsonDocument)
            {
                bsonWriter.WriteName(bsonElement.Name);
                bsonElement.Value.WriteTo(bsonWriter);
            }
        }
        public void Apply(BsonMemberMap memberMap)
        {
            if (!typeof(IEnumerable).IsAssignableFrom(memberMap.MemberType) || //Allow IEnumerable
                typeof(string) == memberMap.MemberType ||                      //But not String
                typeof(IDictionary).IsAssignableFrom(memberMap.MemberType))    //Or Dictionary (concrete classes only see below)
            {
                return;
            }

            //*NOTE Microsoft was too stupid to make the generic dictionary interfaces implement IDictonary even though every single concrete class does
            //      They were also too stupid to make generic IDictionary implement IReadOnlyDictionary even though every single concrete class does I believe this should catch all
            if (memberMap.MemberType.IsGenericType && memberMap.MemberType.IsInterface)
            {
                var genericType = memberMap.MemberType.GetGenericTypeDefinition();
                if (genericType == typeof(IDictionary <,>) || genericType == typeof(IReadOnlyDictionary <,>))
                {
                    return;
                }
            }

            if (memberMap.MemberType.IsArray) //Load Empty Array
            {
                memberMap.SetDefaultValue(() => Array.CreateInstance(memberMap.MemberType.GetElementType(), 0));
            }
            else if (!memberMap.MemberType.IsInterface) //Create ConcreteType directly
            {
                memberMap.SetDefaultValue(() => Activator.CreateInstance(memberMap.MemberType));
            }
            else if (memberMap.MemberType.IsGenericType) //Generic Interface type
            {
                var interfaceType = memberMap.MemberType.GetGenericTypeDefinition();
                var concreteType  = InterfaceToConcreteMap.ContainsKey(interfaceType)
                    ? InterfaceToConcreteMap[interfaceType]
                    : DefaultType;
                memberMap.SetDefaultValue(() => Activator.CreateInstance(concreteType.MakeGenericType(memberMap.MemberType.GetGenericArguments())));
            }
            else //This should just be the antique non generic interfaces like ICollection, IEnumerable, etc.
            {
                memberMap.SetDefaultValue(() => Activator.CreateInstance(typeof(List <object>)));
            }
            memberMap.SetShouldSerializeMethod(instance =>
            {
                var value = (IEnumerable)memberMap.Getter(instance);
                return(value?.GetEnumerator().MoveNext() ?? false);
            });
        }
        private void SerializeMember(BsonWriter bsonWriter, object obj, BsonMemberMap memberMap)
        {
            object objA = memberMap.Getter(obj);

            if (objA == null && memberMap.IgnoreIfNull || (memberMap.HasDefaultValue && !memberMap.SerializeDefaultValue && object.Equals(objA, memberMap.DefaultValue) || !memberMap.ShouldSerializeMethod(obj)))
            {
                return;
            }
            bsonWriter.WriteName(memberMap.ElementName);
            Type memberType = memberMap.MemberType;
            Type actualType = objA == null ? memberType : objA.GetType();

            if (IsRelation(memberMap))
            {
                ValidateVirtualRelation(memberMap);
            }
            memberMap.GetSerializer(actualType).Serialize(bsonWriter, memberType, objA, memberMap.SerializationOptions);
        }
        public bool GetDocumentId(object document, out object id, out Type idNominalType, out IIdGenerator idGenerator)
        {
            BsonMemberMap idMemberMap = BsonClassMap.LookupClassMap(document.GetType()).IdMemberMap;

            if (idMemberMap != null)
            {
                id            = idMemberMap.Getter(document);
                idNominalType = idMemberMap.MemberType;
                idGenerator   = idMemberMap.IdGenerator;
                return(true);
            }
            else
            {
                id            = (object)null;
                idNominalType = (Type)null;
                idGenerator   = (IIdGenerator)null;
                return(false);
            }
        }
Пример #10
0
 private static void ShouldSerializeIfNotDefault(BsonMemberMap memberMap, string defaultString)
 => memberMap.SetShouldSerializeMethod(@object => !string.Equals(defaultString, memberMap.Getter(@object) as string));
Пример #11
0
 private static void ShouldSerializeIfNotEmpty(BsonMemberMap memberMap)
 => memberMap.SetShouldSerializeMethod(@object => !string.IsNullOrEmpty(memberMap.Getter(@object) as string));
        private void SerializeMember(
            BsonWriter bsonWriter,
            object obj,
            BsonMemberMap memberMap
        )
        {
            var value = memberMap.Getter(obj);
            if (value == null && memberMap.IgnoreIfNull) {
                return; // don't serialize null value
            }
            if (memberMap.HasDefaultValue && !memberMap.SerializeDefaultValue && value.Equals(memberMap.DefaultValue)) {
                return; // don't serialize default value
            }

            var nominalType = memberMap.MemberType;
            var actualType = (value == null) ? nominalType : value.GetType();
            var serializer = memberMap.GetSerializerForActualType(actualType);
            var elementName = memberMap.ElementName;
            bsonWriter.WriteName(elementName);
            serializer.Serialize(bsonWriter, nominalType, value, memberMap.SerializationOptions);
        }
 private void SerializeExtraElements(
     BsonWriter bsonWriter,
     object obj,
     BsonMemberMap extraElementsMemberMap
 )
 {
     var extraElements = (BsonDocument) extraElementsMemberMap.Getter(obj);
     if (extraElements != null) {
         foreach (var element in extraElements) {
             element.WriteTo(bsonWriter);
         }
     }
 }
 private void DeserializeExtraElement(
     BsonReader bsonReader,
     object obj,
     string elementName,
     BsonMemberMap extraElementsMemberMap
 )
 {
     var extraElements = (BsonDocument) extraElementsMemberMap.Getter(obj);
     if (extraElements == null) {
         extraElements = new BsonDocument();
         extraElementsMemberMap.Setter(obj, extraElements);
     }
     var value = BsonValue.ReadFrom(bsonReader);
     extraElements[elementName] = value;
 }
Пример #15
0
 public IMemberDirtyTracker ToDirtyTracker(object aggregate)
 {
     return(new SubObjectDirtyTracker(aggregate, _map, _originalValue, _trackerTemplates.ToTrackers(_map.Getter(aggregate)).ToList()));
 }
Пример #16
0
 private BsonValue GetBsonValue(object aggregate)
 {
     return(_memberMap.GetSerializer().ToBsonValue(_memberMap.Getter(aggregate)));
 }
Пример #17
0
 public MemberDirtyTrackerTemplate(object aggregate, BsonMemberMap map)
 {
     _map           = map;
     _originalValue = aggregate == null ? null : _map.GetSerializer().ToBsonValue(_map.Getter(aggregate));
 }