Пример #1
0
 /// <summary>
 /// Converts an object to a BSON document byte array.
 /// </summary>
 /// <typeparam name="T">The nominal type of the object.</typeparam>
 /// <param name="obj">The object.</param>
 /// <param name="settings">The BsonBinaryWriter settings.</param>
 /// <returns>A byte array.</returns>
 public static byte[] ToBson <T>(
     this T obj,
     BsonBinaryWriterSettings settings
     )
 {
     return(ToBson(obj, null, settings));
 }
        public void Serialize_should_throw_when_effectiveGuidRepresentation_is_Unspecified(
            GuidRepresentationMode defaultGuidRepresentationMode,
            GuidRepresentation defaultGuidRepresentation,
            GuidRepresentation serializerGuidRepresentation,
            GuidRepresentation?writerGuidRepresentation)
        {
            GuidMode.Set(defaultGuidRepresentationMode, defaultGuidRepresentation);

            var subject        = new GuidSerializer(serializerGuidRepresentation);
            var memoryStream   = new MemoryStream();
            var writerSettings = new BsonBinaryWriterSettings();

            if (defaultGuidRepresentationMode == GuidRepresentationMode.V2 && writerGuidRepresentation.HasValue)
            {
#pragma warning disable 618
                writerSettings.GuidRepresentation = writerGuidRepresentation.Value;
#pragma warning restore 618
            }
            var writer  = new BsonBinaryWriter(memoryStream, writerSettings);
            var context = BsonSerializationContext.CreateRoot(writer);
            var args    = new BsonSerializationArgs();
            var value   = new Guid("01020304-0506-0708-090a-0b0c0d0e0f10");

            writer.WriteStartDocument();
            writer.WriteName("x");
            var exception = Record.Exception(() => subject.Serialize(context, args, value));

            exception.Should().BeOfType <BsonSerializationException>();
        }
        public void DeserializeBatch_should_return_expected_result_when_GuidRepresentation_is_Standard()
        {
            var document = BsonDocument.Parse("{ batch : [ { a : HexData(4, \"0102030405060708090a0b0c0d0e0f10\") } ] }");

#pragma warning disable 618
            var writerSettings = new BsonBinaryWriterSettings();
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
            {
                writerSettings.GuidRepresentation = GuidRepresentation.Standard;
            }
#pragma warning restore 618
            var bson                   = document.ToBson(writerSettings: writerSettings);
            var rawDocument            = new RawBsonDocument(bson);
            var batch                  = (RawBsonArray)rawDocument["batch"];
            var documentSerializer     = BsonDocumentSerializer.Instance;
            var messageEncoderSettings = new MessageEncoderSettings {
                { "GuidRepresentation", GuidRepresentation.Standard }
            };

            var result = CursorBatchDeserializationHelper.DeserializeBatch <BsonDocument>(batch, documentSerializer, messageEncoderSettings);

            result.Count.Should().Be(1);
            result[0].Should().BeOfType <BsonDocument>();
            result[0].Should().Be("{ a : HexData(4, \"0102030405060708090a0b0c0d0e0f10\") }");
        }
 // constructors
 internal MongoDeleteMessage(BsonBinaryWriterSettings writerSettings, string collectionFullName, RemoveFlags flags, IMongoQuery query)
     : base(MessageOpcode.Delete, null, writerSettings)
 {
     this.collectionFullName = collectionFullName;
     this.flags = flags;
     this.query = query;
 }
Пример #5
0
 /// <summary>
 /// Converts an object to a BSON document byte array.
 /// </summary>
 /// <typeparam name="TNominalType">The nominal type of the object.</typeparam>
 /// <param name="obj">The object.</param>
 /// <param name="options">The serialization options.</param>
 /// <param name="settings">The BsonBinaryWriter settings.</param>
 /// <returns>A byte array.</returns>
 public static byte[] ToBson <TNominalType>(
     this TNominalType obj,
     IBsonSerializationOptions options,
     BsonBinaryWriterSettings settings)
 {
     return(ToBson(obj, typeof(TNominalType), options, settings));
 }
 // constructors
 public BulkMixedWriteOperation(
     Action <InsertRequest> assignId,
     bool checkElementNames,
     string collectionName,
     string databaseName,
     int maxBatchCount,
     int maxBatchLength,
     bool isOrdered,
     BsonBinaryReaderSettings readerSettings,
     IEnumerable <WriteRequest> requests,
     WriteConcern writeConcern,
     BsonBinaryWriterSettings writerSettings)
 {
     _assignId          = assignId;
     _checkElementNames = checkElementNames;
     _collectionName    = collectionName;
     _databaseName      = databaseName;
     _maxBatchCount     = maxBatchCount;
     _maxBatchLength    = maxBatchLength;
     _isOrdered         = isOrdered;
     _readerSettings    = readerSettings;
     _requests          = requests;
     _writeConcern      = writeConcern;
     _writerSettings    = writerSettings;
 }
 // constructors
 public BulkInsertOperationArgs(
     Action <InsertRequest> assignId,
     bool checkElementNames,
     string collectionName,
     string databaseName,
     int maxBatchCount,
     int maxBatchLength,
     int maxDocumentSize,
     int maxWireDocumentSize,
     bool isOrdered,
     BsonBinaryReaderSettings readerSettings,
     IEnumerable <InsertRequest> requests,
     WriteConcern writeConcern,
     BsonBinaryWriterSettings writerSettings)
     : base(
         collectionName,
         databaseName,
         maxBatchCount,
         maxBatchLength,
         maxDocumentSize,
         maxWireDocumentSize,
         isOrdered,
         readerSettings,
         requests.Cast <WriteRequest>(),
         writeConcern,
         writerSettings)
 {
     _assignId          = assignId;
     _checkElementNames = checkElementNames;
 }
Пример #8
0
        /// <summary>
        /// Serializes an object to a BSON byte array.
        /// </summary>
        /// <param name="obj">The object.</param>
        /// <param name="nominalType">The nominal type of the object..</param>
        /// <param name="writerSettings">The writer settings.</param>
        /// <param name="serializer">The serializer.</param>
        /// <param name="configurator">The serialization context configurator.</param>
        /// <param name="args">The serialization args.</param>
        /// <returns>A BSON byte array.</returns>
        /// <exception cref="System.ArgumentNullException">nominalType</exception>
        /// <exception cref="System.ArgumentException">serializer</exception>
        public static byte[] ToBson(
            this object obj,
            Type nominalType,
            BsonBinaryWriterSettings writerSettings = null,
            IBsonSerializer serializer = null,
            Action <BsonSerializationContext.Builder> configurator = null,
            BsonSerializationArgs args = default(BsonSerializationArgs))
        {
            if (nominalType == null)
            {
                throw new ArgumentNullException("nominalType");
            }

            if (serializer == null)
            {
                serializer = BsonSerializer.LookupSerializer(nominalType);
            }
            if (serializer.ValueType != nominalType)
            {
                var message = string.Format("Serializer type {0} value type does not match document types {1}.", serializer.GetType().FullName, nominalType.FullName);
                throw new ArgumentException(message, "serializer");
            }

            using (var memoryStream = new MemoryStream())
            {
                using (var bsonWriter = new BsonBinaryWriter(memoryStream, writerSettings ?? BsonBinaryWriterSettings.Defaults))
                {
                    var context = BsonSerializationContext.CreateRoot(bsonWriter, configurator);
                    args.NominalType = nominalType;
                    serializer.Serialize(context, args, obj);
                }
                return(memoryStream.ToArray());
            }
        }
Пример #9
0
 // constructors
 public BulkDeleteOperationArgs(
     string collectionName,
     string databaseName,
     int maxBatchCount,
     int maxBatchLength,
     int maxDocumentSize,
     int maxWireDocumentSize,
     bool isOrdered,
     BsonBinaryReaderSettings readerSettings,
     IEnumerable <DeleteRequest> requests,
     WriteConcern writeConcern,
     BsonBinaryWriterSettings writerSettings)
     : base(
         collectionName,
         databaseName,
         maxBatchCount,
         maxBatchLength,
         maxDocumentSize,
         maxWireDocumentSize,
         isOrdered,
         readerSettings,
         requests.Cast <WriteRequest>(),
         writeConcern,
         writerSettings)
 {
 }
Пример #10
0
 // constructors
 internal MongoInsertMessage(BsonBinaryWriterSettings writerSettings, string collectionFullName, bool checkElementNames, InsertFlags flags)
     : base(MessageOpcode.Insert, null, writerSettings)
 {
     this.collectionFullName = collectionFullName;
     this.checkElementNames  = checkElementNames;
     this.flags = flags;
 }
 // constructors
 protected BulkWriteOperationArgs(
     string collectionName,
     string databaseName,
     int maxBatchCount,
     int maxBatchLength,
     int maxDocumentSize,
     int maxWireDocumentSize,
     bool isOrdered,
     BsonBinaryReaderSettings readerSettings,
     IEnumerable <WriteRequest> requests,
     WriteConcern writeConcern,
     BsonBinaryWriterSettings writerSettings)
 {
     _collectionName      = collectionName;
     _databaseName        = databaseName;
     _maxBatchCount       = maxBatchCount;
     _maxBatchLength      = maxBatchLength;
     _maxDocumentSize     = maxDocumentSize;
     _maxWireDocumentSize = maxWireDocumentSize;
     _isOrdered           = isOrdered;
     _readerSettings      = readerSettings;
     _requests            = requests;
     _writeConcern        = writeConcern;
     _writerSettings      = writerSettings;
 }
Пример #12
0
        public QueryOperation(
            string databaseName,
            string collectionName,
            BsonBinaryReaderSettings readerSettings,
            BsonBinaryWriterSettings writerSettings,
            int batchSize,
            IMongoFields fields,
            QueryFlags flags,
            int limit,
            BsonDocument options,
            IMongoQuery query,
            ReadPreference readPreference,
            IBsonSerializationOptions serializationOptions,
            IBsonSerializer serializer,
            int skip)
            : base(databaseName, collectionName, readerSettings, writerSettings)
        {
            _batchSize            = batchSize;
            _fields               = fields;
            _flags                = flags;
            _limit                = limit;
            _options              = options;
            _query                = query;
            _readPreference       = readPreference;
            _serializationOptions = serializationOptions;
            _serializer           = serializer;
            _skip = skip;

            // since we're going to block anyway when a tailable cursor is temporarily out of data
            // we might as well do it as efficiently as possible
            if ((_flags & QueryFlags.TailableCursor) != 0)
            {
                _flags |= QueryFlags.AwaitData;
            }
        }
 /// <summary>
 /// Converts an object to a BSON document byte array.
 /// </summary>
 /// <typeparam name="TNominalType">The nominal type of the object.</typeparam>
 /// <param name="obj">The object.</param>
 /// <param name="settings">The BsonBinaryWriter settings.</param>
 /// <returns>A byte array.</returns>
 public static byte[] ToBson <TNominalType>(
     this TNominalType obj,
     BsonBinaryWriterSettings settings
     )
 {
     return(ToBson(obj, typeof(TNominalType), settings));
 }
Пример #14
0
 protected ReadOperationBase(
     string databaseName,
     string collectionName,
     BsonBinaryReaderSettings readerSettings,
     BsonBinaryWriterSettings writerSettings)
     : base(databaseName, collectionName, readerSettings, writerSettings)
 {
 }
Пример #15
0
 internal MongoInsertMessage(
     BsonBinaryWriterSettings writerSettings,
     string collectionFullName
     )
     : base(MessageOpcode.Insert, null, writerSettings)
 {
     this.collectionFullName = collectionFullName;
 }
        protected BsonWriter CreateBsonWriter()
        {
            var settings = new BsonBinaryWriterSettings {
                MaxDocumentSize = server.MaxDocumentSize
            };

            return(BsonWriter.Create(buffer, settings));
        }
 /// <summary>
 /// Converts an object to a BSON document byte array.
 /// </summary>
 /// <param name="obj">The object.</param>
 /// <param name="nominalType">The nominal type of the object.</param>
 /// <param name="settings">The BsonBinaryWriter settings.</param>
 /// <returns>A byte array.</returns>
 public static byte[] ToBson(
     this object obj,
     Type nominalType,
     BsonBinaryWriterSettings settings
     )
 {
     return(ToBson(obj, nominalType, null, settings));
 }
Пример #18
0
        private int _messageStartPosition = -1; // start position in buffer for backpatching messageLength

        // constructors
        protected MongoRequestMessage(
            MessageOpcode opcode,
            BsonBinaryWriterSettings writerSettings)
            : base(opcode)
        {
            _writerSettings = writerSettings;
            RequestId       = Interlocked.Increment(ref __lastRequestId);
        }
        protected BsonWriter CreateBsonWriter()
        {
            var settings = new BsonBinaryWriterSettings {
                MaxDocumentSize = connection.ServerInstance.MaxDocumentSize
            };

            return(BsonWriter.Create(buffer, settings));
        }
Пример #20
0
        protected byte[] ToBson(string json, GuidRepresentation guidRepresentation = GuidRepresentation.Unspecified)
        {
            var writerSettings = new BsonBinaryWriterSettings {
                GuidRepresentation = guidRepresentation
            };

            return(UnquoteExtendedJson(BsonDocument.Parse(json)).ToBson(writerSettings: writerSettings));
        }
Пример #21
0
 /// <summary>
 /// Serializes an object to a BSON byte array.
 /// </summary>
 /// <typeparam name="TNominalType">The nominal type of the object.</typeparam>
 /// <param name="obj">The object.</param>
 /// <param name="serializer">The serializer.</param>
 /// <param name="writerSettings">The writer settings.</param>
 /// <param name="configurator">The serialization context configurator.</param>
 /// <returns>A BSON byte array.</returns>
 public static byte[] ToBson <TNominalType>(
     this TNominalType obj,
     IBsonSerializer <TNominalType> serializer = null,
     BsonBinaryWriterSettings writerSettings   = null,
     Action <BsonSerializationContext.Builder> configurator = null
     )
 {
     return(ToBson(obj, typeof(TNominalType), writerSettings, serializer, configurator));
 }
Пример #22
0
 // constructors
 internal MongoUpdateMessage(BsonBinaryWriterSettings writerSettings, string collectionFullName, bool checkUpdateDocument, UpdateFlags flags, IMongoQuery query, IMongoUpdate update)
     : base(MessageOpcode.Update, null, writerSettings)
 {
     this.collectionFullName  = collectionFullName;
     this.checkUpdateDocument = checkUpdateDocument;
     this.flags  = flags;
     this.query  = query;
     this.update = update;
 }
Пример #23
0
 internal MongoQueryMessage(BsonBuffer buffer, BsonBinaryWriterSettings writerSettings, string collectionFullName, QueryFlags flags, int numberToSkip, int numberToReturn, IMongoQuery query, IMongoFields fields)
     : base(MessageOpcode.Query, buffer, writerSettings)
 {
     this.collectionFullName = collectionFullName;
     this.flags          = flags;
     this.numberToSkip   = numberToSkip;
     this.numberToReturn = numberToReturn;
     this.query          = query;
     this.fields         = fields;
 }
Пример #24
0
        public static byte[] ToBytes(BsonDocument doc)
        {
            BsonBinaryWriterSettings settings = new BsonBinaryWriterSettings()
            {
                // C# driver "magically" changes UUIDs underneath by default so tell it not to
                GuidRepresentation = GuidRepresentation.Standard
            };

            return(doc.ToBson(null, settings));
        }
Пример #25
0
 protected WriteOpcodeOperationBase(
     string databaseName,
     string collectionName,
     BsonBinaryReaderSettings readerSettings,
     BsonBinaryWriterSettings writerSettings,
     WriteConcern writeConcern)
     : base(databaseName, collectionName, readerSettings, writerSettings)
 {
     _writeConcern = writeConcern;
 }
Пример #26
0
        // protected methods
        protected void FeedResult(CryptContext context, BsonDocument document)
        {
            var writerSettings = new BsonBinaryWriterSettings {
                GuidRepresentation = GuidRepresentation.Unspecified
            };
            var documentBytes = document.ToBson(writerSettings: writerSettings);

            context.Feed(documentBytes);
            context.MarkDone();
        }
Пример #27
0
        protected WriteConcernResult SendMessageWithWriteConcern(
            MongoConnection connection,
            BsonBuffer buffer,
            int requestId,
            BsonBinaryReaderSettings readerSettings,
            BsonBinaryWriterSettings writerSettings,
            WriteConcern writeConcern)
        {
            CommandDocument getLastErrorCommand = null;

            if (writeConcern.Enabled)
            {
                var fsync    = (writeConcern.FSync == null) ? null : (BsonValue)writeConcern.FSync;
                var journal  = (writeConcern.Journal == null) ? null : (BsonValue)writeConcern.Journal;
                var w        = (writeConcern.W == null) ? null : writeConcern.W.ToGetLastErrorWValue();
                var wTimeout = (writeConcern.WTimeout == null) ? null : (BsonValue)(int)writeConcern.WTimeout.Value.TotalMilliseconds;

                getLastErrorCommand = new CommandDocument
                {
                    { "getlasterror", 1 }, // use all lowercase for backward compatibility
                    { "fsync", fsync, fsync != null },
                    { "j", journal, journal != null },
                    { "w", w, w != null },
                    { "wtimeout", wTimeout, wTimeout != null }
                };

                // piggy back on network transmission for message
                var getLastErrorMessage = new MongoQueryMessage(writerSettings, DatabaseName + ".$cmd", QueryFlags.None, 0, 1, getLastErrorCommand, null);
                getLastErrorMessage.WriteToBuffer(buffer);
            }

            connection.SendMessage(buffer, requestId);

            WriteConcernResult writeConcernResult = null;

            if (writeConcern.Enabled)
            {
                var writeConcernResultSerializer = BsonSerializer.LookupSerializer(typeof(WriteConcernResult));
                var replyMessage = connection.ReceiveMessage <WriteConcernResult>(readerSettings, writeConcernResultSerializer, null);
                if (replyMessage.NumberReturned == 0)
                {
                    throw new MongoCommandException("Command 'getLastError' failed. No response returned");
                }
                writeConcernResult         = replyMessage.Documents[0];
                writeConcernResult.Command = getLastErrorCommand;

                var mappedException = ExceptionMapper.Map(writeConcernResult);
                if (mappedException != null)
                {
                    throw mappedException;
                }
            }

            return(writeConcernResult);
        }
Пример #28
0
        public SQLiteCollectionManager(SQLiteConnection connection, ICollectionImageHandler imageHandler)
        {
            this.connection   = connection;
            this.ImageHandler = imageHandler;

            this.bsonWriterSettings = new BsonBinaryWriterSettings()
            {
                MaxDocumentSize = 24 * 1024 * 1024
            };
            this.bsonReaderSettings = new BsonBinaryReaderSettings()
            {
                MaxDocumentSize = this.bsonWriterSettings.MaxDocumentSize
            };

            this.Operations = new CollectionManagerOperations(this);

            this.loadSettings             = this.connection.CreateCommand();
            this.loadSettings.CommandText = "SELECT * FROM settings;";

            this.saveSettings             = this.connection.CreateCommand();
            this.saveSettings.CommandText = "DELETE FROM settings; INSERT INTO settings (bson) VALUES (@bson);";
            this.saveSettings.Parameters.Add("bson", DbType.Binary);

            this.loadTrackCaches             = this.connection.CreateCommand();
            this.loadTrackCaches.CommandText = "SELECT * FROM track_info_caches;";

            this.saveTrackCache             = this.connection.CreateCommand();
            this.saveTrackCache.CommandText = "INSERT INTO track_info_caches (bson) VALUES (@bson);";
            this.saveTrackCache.Parameters.Add("bson", DbType.Binary);

            this.loadReleases             = this.connection.CreateCommand();
            this.loadReleases.CommandText = "SELECT * FROM releases;";

            this.countReleases             = this.connection.CreateCommand();
            this.countReleases.CommandText = "SELECT COUNT(*) FROM releases;";

            this.loadReleaseById             = this.connection.CreateCommand();
            this.loadReleaseById.CommandText = "SELECT * FROM releases WHERE id = @id;";
            this.loadReleaseById.Parameters.Add("id", DbType.Int64);

            this.saveRelease             = this.connection.CreateCommand();
            this.saveRelease.CommandText = "INSERT INTO releases (bson) VALUES (@bson);";
            this.saveRelease.Parameters.Add("bson", DbType.Binary);

            this.updateRelease             = this.connection.CreateCommand();
            this.updateRelease.CommandText = "UPDATE releases SET bson = @bson WHERE id = @id;";
            this.updateRelease.Parameters.Add("id", DbType.Int64);
            this.updateRelease.Parameters.Add("bson", DbType.Binary);

            this.deleteRelease             = this.connection.CreateCommand();
            this.deleteRelease.CommandText = "DELETE FROM releases WHERE id = @id;";
            this.deleteRelease.Parameters.Add("id", DbType.Int64);

            this.ReloadSettings();
        }
Пример #29
0
 // constructors
 internal MongoQueryMessage(
     BsonBinaryWriterSettings writerSettings,
     string collectionFullName,
     QueryFlags flags,
     int numberToSkip,
     int numberToReturn,
     IMongoQuery query,
     IMongoFields fields)
     : this(null, writerSettings, collectionFullName, flags, numberToSkip, numberToReturn, query, fields)
 {
 }
Пример #30
0
 protected DatabaseOperation(
     string databaseName,
     string collectionName,
     BsonBinaryReaderSettings readerSettings,
     BsonBinaryWriterSettings writerSettings)
 {
     _databaseName   = databaseName;
     _collectionName = collectionName;
     _readerSettings = (BsonBinaryReaderSettings)readerSettings.FrozenCopy();
     _writerSettings = (BsonBinaryWriterSettings)writerSettings.FrozenCopy();
 }