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); } } } }
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); } }
protected override int CalculateBodySize(BsonWriter writer){ int size = 8; //first int32, number of cursors foreach(long id in this.CursorIDs){ size += 8; } return size; }
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; }
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; }
/// <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); }
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; }
protected override int CalculateBodySize(BsonWriter writer){ return writer.CalculateSize(this.Message,false); }
/// <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; }
/// <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(); }
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; }
protected abstract int CalculateBodySize(BsonWriter writer);