Esempio n. 1
0
        public void Write(Stream stream, TextWriter logger)
        {
            MessageHeader header = this.Header;
            BufferedStream bstream = new BufferedStream(stream);

            BsonWriter bwriter = new BsonWriter(bstream);
            ChunkMessage(bwriter);

            foreach (MessageChunk chunk in chunks)
            {
                WriteChunk(bstream, chunk);
            }

            if (logger != null)
            {
                Json.JsonWriter writer = new Evaluant.Uss.MongoDB.Json.JsonWriter(logger);
                foreach(var chunk in chunks)
                {
                    foreach(var entity in chunk.Documents)
                    {
                        writer.Write(entity);
                    }
                }
            }
        }
Esempio n. 2
0
 public void Write (Stream stream,TextWriter logger){
     MessageHeader header = this.Header;
     BufferedStream bstream = new BufferedStream(stream);
     BinaryWriter writer = new BinaryWriter(bstream);
     BsonWriter bwriter = new BsonWriter(bstream);
     
     Header.MessageLength += this.CalculateBodySize(bwriter);
     if(Header.MessageLength > MessageBase.MaximumMessageSize){
         throw new MongoException("Maximum message length exceeded");
     }
     
     writer.Write(header.MessageLength);
     writer.Write(header.RequestId);
     writer.Write(header.ResponseTo);
     writer.Write((int)header.OpCode);
     writer.Flush();
     WriteBody(bwriter);
     bwriter.Flush();
     if (logger != null)
     {
         Json.JsonWriter jwriter = new Evaluant.Uss.MongoDB.Json.JsonWriter(logger);
         WriteBody(jwriter);
         jwriter.WriteString(Environment.NewLine);
     }
 }
Esempio n. 3
0
 protected override int CalculateBodySize(BsonWriter writer){
     int size = 8; //first int32, number of cursors
     foreach(long id in this.CursorIDs){
         size += 8;
     }
     return size;
 }           
Esempio n. 4
0
 protected override int CalculateBodySize(BsonWriter writer){
     int size = 4; //first int32
     size += writer.CalculateSize(this.FullCollectionName,false);
     size += 4; //flags
     size += writer.CalculateSize(this.Selector);
     size += writer.CalculateSize(this.Document);
     return size;
 }       
Esempio n. 5
0
		protected override int CalculateBodySize(BsonWriter writer){
            int size = 12; //options, numbertoskip, numbertoreturn
            size += writer.CalculateSize(this.FullCollectionName,false);
            size += writer.CalculateSize(this.Query);
            if(this.ReturnFieldSelector != null){
                size += writer.CalculateSize(this.ReturnFieldSelector);
            }
            return size;
        }        
Esempio n. 6
0
        /// <summary>
        /// Breaks down an insert message that may be too large into managable sizes.  
        /// When inserting only one document there will be only one chunk.  However chances
        /// are that when inserting thousands of documents at once there will be many.
        /// </summary>
        protected void ChunkMessage(BsonWriter writer)
        {
            int baseSize = CalculateBaseSize(writer);

            MessageChunk chunk = new MessageChunk() { Size = baseSize, Documents = new List<Entity>() };
            foreach (Entity doc in this.Documents)
            {
                int docSize = writer.CalculateSize(doc);
                if (docSize + baseSize >= MessageBase.MaximumMessageSize) throw new MongoException("Document is too big to fit in a message.");

                if (docSize + chunk.Size > MessageBase.MaximumMessageSize)
                {
                    chunks.Add(chunk);
                    chunk = new MessageChunk() { Size = baseSize, Documents = new List<Entity>() };
                }
                chunk.Documents.Add(doc);
                chunk.Size += docSize;
            }
            chunks.Add(chunk);
        }
Esempio n. 7
0
 protected override int CalculateBodySize(BsonWriter writer){
     int size = 8; //first int32, second int32 
     size += writer.CalculateSize(this.FullCollectionName,false);
     size += writer.CalculateSize(Selector);
     return size;
 }
Esempio n. 8
0
 protected override int CalculateBodySize(BsonWriter writer){
     return writer.CalculateSize(this.Message,false);
 }
Esempio n. 9
0
 /// <summary>
 /// The base size that all chunks will have.
 /// </summary>
 protected int CalculateBaseSize(BsonWriter writer)
 {
     int size = 4; //first int32
     size += writer.CalculateSize(this.FullCollectionName, false);
     size += Header.MessageLength;
     return size;
 }
Esempio n. 10
0
        /// <summary>
        /// Writes out a header and the chunk of documents.
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="chunk"></param>
        protected void WriteChunk(Stream stream, MessageChunk chunk)
        {
            WriteHeader(new BinaryWriter(stream), chunk.Size);

            BsonWriter writer = new BsonWriter(stream);
            writer.WriteValue(BsonDataType.Integer, 0);
            writer.WriteString(this.FullCollectionName);

            foreach (Entity doc in chunk.Documents)
            {
                writer.Write(doc);
            }
            writer.Flush();
        }
Esempio n. 11
0
 protected override int CalculateBodySize(BsonWriter writer){
     int size = 4; //first int32
     size += writer.CalculateSize(this.FullCollectionName,false);
     size += 12; //number to return + cursorid
     return size;
 }
Esempio n. 12
0
 protected abstract int CalculateBodySize(BsonWriter writer);