Skip to content

Commit e0ce68c

Browse files
committed
CSHARP-1626: BsonBinaryWriter should support writing more than 2GB.
1 parent 98081d7 commit e0ce68c

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

src/MongoDB.Bson.Tests/IO/BsonBinaryWriterTests.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,29 @@ public void BsonBinaryWriter_should_support_writing_multiple_documents(
5252
}
5353
}
5454

55+
[Test]
56+
public void BsonBinaryWriter_should_support_writing_more_than_2GB()
57+
{
58+
using (var stream = new NullBsonStream())
59+
using (var binaryWriter = new BsonBinaryWriter(stream))
60+
{
61+
var bigBinaryData = new BsonBinaryData(new byte[int.MaxValue / 2 - 1000]);
62+
for (var i = 0; i < 3; i++)
63+
{
64+
binaryWriter.WriteStartDocument();
65+
binaryWriter.WriteName("x");
66+
binaryWriter.WriteBinaryData(bigBinaryData);
67+
binaryWriter.WriteEndDocument();
68+
}
69+
70+
var smallBinaryData = new BsonBinaryData(new byte[2000]);
71+
binaryWriter.WriteStartDocument();
72+
binaryWriter.WriteName("x");
73+
binaryWriter.WriteBinaryData(smallBinaryData);
74+
binaryWriter.WriteEndDocument();
75+
}
76+
}
77+
5578
[Test]
5679
[Requires64BitProcess]
5780
public void BackpatchSize_should_throw_when_size_is_larger_than_2GB()

src/MongoDB.Bson/IO/BsonBinaryWriter.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ public override void WriteJavaScriptWithScope(string code)
416416

417417
_bsonStream.WriteBsonType(BsonType.JavaScriptWithScope);
418418
WriteNameHelper();
419-
_context = new BsonBinaryWriterContext(_context, ContextType.JavaScriptWithScope, (int)_bsonStream.Position);
419+
_context = new BsonBinaryWriterContext(_context, ContextType.JavaScriptWithScope, _bsonStream.Position);
420420
_bsonStream.WriteInt32(0); // reserve space for size of JavaScript with scope value
421421
_bsonStream.WriteString(code, _settings.Encoding);
422422

@@ -580,7 +580,7 @@ public override void WriteStartArray()
580580
base.WriteStartArray();
581581
_bsonStream.WriteBsonType(BsonType.Array);
582582
WriteNameHelper();
583-
_context = new BsonBinaryWriterContext(_context, ContextType.Array, (int)_bsonStream.Position);
583+
_context = new BsonBinaryWriterContext(_context, ContextType.Array, _bsonStream.Position);
584584
_bsonStream.WriteInt32(0); // reserve space for size
585585

586586
State = BsonWriterState.Value;
@@ -604,7 +604,7 @@ public override void WriteStartDocument()
604604
WriteNameHelper();
605605
}
606606
var contextType = (State == BsonWriterState.ScopeDocument) ? ContextType.ScopeDocument : ContextType.Document;
607-
_context = new BsonBinaryWriterContext(_context, contextType, (int)_bsonStream.Position);
607+
_context = new BsonBinaryWriterContext(_context, contextType, _bsonStream.Position);
608608
_bsonStream.WriteInt32(0); // reserve space for size
609609

610610
State = BsonWriterState.Name;

src/MongoDB.Bson/IO/BsonBinaryWriterContext.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ internal class BsonBinaryWriterContext
2020
// private fields
2121
private BsonBinaryWriterContext _parentContext;
2222
private ContextType _contextType;
23-
private int _startPosition;
23+
private long _startPosition;
2424
private int _index; // used when contextType is Array
2525

2626
// constructors
2727
internal BsonBinaryWriterContext(
2828
BsonBinaryWriterContext parentContext,
2929
ContextType contextType,
30-
int startPosition)
30+
long startPosition)
3131
{
3232
_parentContext = parentContext;
3333
_contextType = contextType;
@@ -45,7 +45,7 @@ internal ContextType ContextType
4545
get { return _contextType; }
4646
}
4747

48-
internal int StartPosition
48+
internal long StartPosition
4949
{
5050
get { return _startPosition; }
5151
}

0 commit comments

Comments
 (0)