Skip to content

Commit a70241b

Browse files
committed
CSHARP-1626: BsonBinaryReader should support reading more than 2GB.
1 parent e0ce68c commit a70241b

File tree

3 files changed

+63
-4
lines changed

3 files changed

+63
-4
lines changed

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

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,65 @@ namespace MongoDB.Bson.Tests.IO
2727
[TestFixture]
2828
public class BsonBinaryReaderTests
2929
{
30+
[Test]
31+
[Explicit] // because it creates a huge temp file and takes a long time to execute
32+
public void BsonBinaryReader_should_support_reading_more_than_2GB()
33+
{
34+
var binaryData = new BsonBinaryData(new byte[1024 * 1024]);
35+
36+
var tempFileName = Path.GetTempFileName();
37+
try
38+
{
39+
using (var stream = new FileStream(tempFileName, FileMode.Open))
40+
{
41+
using (var binaryWriter = new BsonBinaryWriter(stream))
42+
{
43+
while (stream.Position < (long)int.MaxValue * 4)
44+
{
45+
binaryWriter.WriteStartDocument();
46+
binaryWriter.WriteName("x");
47+
binaryWriter.WriteBinaryData(binaryData);
48+
binaryWriter.WriteEndDocument();
49+
}
50+
}
51+
52+
var endOfFilePosition = stream.Position;
53+
stream.Position = 0;
54+
55+
using (var binaryReader = new BsonBinaryReader(stream))
56+
{
57+
while (!binaryReader.IsAtEndOfFile())
58+
{
59+
binaryReader.ReadStartDocument();
60+
var bookmark = binaryReader.GetBookmark();
61+
62+
binaryReader.ReadName("x");
63+
binaryReader.ReturnToBookmark(bookmark);
64+
65+
binaryReader.ReadName("x");
66+
var readBinaryData = binaryReader.ReadBinaryData();
67+
Assert.That(readBinaryData.Bytes.Length, Is.EqualTo(binaryData.Bytes.Length));
68+
69+
binaryReader.ReadEndDocument();
70+
}
71+
}
72+
73+
Assert.That(stream.Position, Is.EqualTo(endOfFilePosition));
74+
}
75+
}
76+
finally
77+
{
78+
try
79+
{
80+
File.Delete(tempFileName);
81+
}
82+
catch
83+
{
84+
// ignore exceptions
85+
}
86+
}
87+
}
88+
3089
[Test]
3190
public void BsonBinaryReader_should_support_reading_multiple_documents(
3291
[Range(0, 3)]

src/MongoDB.Bson/IO/BsonBinaryReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public override void Close()
103103
/// <returns>A bookmark.</returns>
104104
public override BsonReaderBookmark GetBookmark()
105105
{
106-
return new BsonBinaryReaderBookmark(State, CurrentBsonType, CurrentName, _context, (int)_bsonStream.Position);
106+
return new BsonBinaryReaderBookmark(State, CurrentBsonType, CurrentName, _context, _bsonStream.Position);
107107
}
108108

109109
/// <summary>

src/MongoDB.Bson/IO/BsonBinaryReaderBookmark.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,23 @@ public class BsonBinaryReaderBookmark : BsonReaderBookmark
2222
{
2323
// private fields
2424
private BsonBinaryReaderContext _context;
25-
private int _position;
25+
private long _position;
2626

2727
// constructors
2828
internal BsonBinaryReaderBookmark(
2929
BsonReaderState state,
3030
BsonType currentBsonType,
3131
string currentName,
3232
BsonBinaryReaderContext context,
33-
int position)
33+
long position)
3434
: base(state, currentBsonType, currentName)
3535
{
3636
_context = context.Clone();
3737
_position = position;
3838
}
3939

4040
// internal properties
41-
internal int Position
41+
internal long Position
4242
{
4343
get { return _position; }
4444
}

0 commit comments

Comments
 (0)