Skip to content

Commit f08307b

Browse files
author
rstam
committed
CSHARP-797: Throw an exception if a bulk operation is empty or Execute is called more than once.
1 parent e25f978 commit f08307b

File tree

4 files changed

+41
-13
lines changed

4 files changed

+41
-13
lines changed

MongoDB.Driver/MongoCollection.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,15 @@ public virtual CommandResult AggregateExplain(AggregateArgs args)
190190
/// </returns>
191191
public virtual BulkWriteResult BulkWrite(BulkWriteArgs args)
192192
{
193+
if (args == null)
194+
{
195+
throw new ArgumentNullException("args");
196+
}
197+
if (args.Requests == null)
198+
{
199+
throw new ArgumentNullException("args.Requests");
200+
}
201+
193202
var connection = _server.AcquireConnection(ReadPreference.Primary);
194203
try
195204
{

MongoDB.Driver/Operations/BulkMixedWriteOperation.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,11 @@ public BulkWriteResult Execute(MongoConnection connection)
7979
var remainingRequests = Enumerable.Empty<WriteRequest>();
8080
var hasWriteErrors = false;
8181

82+
var runCount = 0;
8283
foreach (var run in FindRuns())
8384
{
85+
runCount++;
86+
8487
if (hasWriteErrors && _isOrdered)
8588
{
8689
remainingRequests = remainingRequests.Concat(run.Requests);
@@ -93,6 +96,11 @@ public BulkWriteResult Execute(MongoConnection connection)
9396
hasWriteErrors |= batchResult.HasWriteErrors;
9497
}
9598

99+
if (runCount == 0)
100+
{
101+
throw new InvalidOperationException("Bulk write operation is empty.");
102+
}
103+
96104
var combiner = new BulkWriteBatchResultCombiner(batchResults, _writeConcern.Enabled);
97105
return combiner.CreateResultOrThrowIfHasErrors(remainingRequests);
98106
}

MongoDB.Driver/Operations/BulkWriteOperation.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public sealed class BulkWriteOperation
2727
private readonly MongoCollection _collection;
2828
private readonly bool _isOrdered;
2929
private readonly List<WriteRequest> _requests = new List<WriteRequest>();
30+
private bool _hasAlreadyBeenExecuted;
3031

3132
// constructors
3233
internal BulkWriteOperation(MongoCollection collection, bool isOrdered)
@@ -42,6 +43,12 @@ internal BulkWriteOperation(MongoCollection collection, bool isOrdered)
4243
/// <returns>A BulkWriteResult.</returns>
4344
public BulkWriteResult Execute()
4445
{
46+
if (_hasAlreadyBeenExecuted)
47+
{
48+
throw new InvalidOperationException("A bulk write operation can only be executed once.");
49+
}
50+
_hasAlreadyBeenExecuted = true;
51+
4552
var args = new BulkWriteArgs
4653
{
4754
IsOrdered = _isOrdered,

MongoDB.DriverUnitTests/MongoCollectionTests.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,23 @@ public void TestBulkDelete()
246246
Assert.AreEqual(2, _collection.FindOne()["x"].ToInt32());
247247
}
248248

249+
[Test]
250+
public void TestBulkEmpty()
251+
{
252+
var bulk = _collection.InitializeOrderedBulkOperation();
253+
Assert.Throws<InvalidOperationException>(() => bulk.Execute());
254+
}
255+
256+
[Test]
257+
public void TestBulkExecuteTwice()
258+
{
259+
_collection.Drop();
260+
var bulk = _collection.InitializeOrderedBulkOperation();
261+
bulk.Insert(new BsonDocument());
262+
bulk.Execute();
263+
Assert.Throws<InvalidOperationException>(() => bulk.Execute());
264+
}
265+
249266
[Test]
250267
public void TestBulkInsert()
251268
{
@@ -264,19 +281,6 @@ public void TestBulkInsert()
264281
Assert.AreEqual(3, _collection.Count());
265282
}
266283

267-
[Test]
268-
public void TestBulkInsertZeroDocuments()
269-
{
270-
if (_primary.BuildInfo.Version >= new Version(2, 5, 5))
271-
{
272-
_collection.Drop();
273-
var result = _collection.BulkWrite(
274-
new BulkWriteArgs { WriteConcern = WriteConcern.Acknowledged });
275-
276-
Assert.AreEqual(0, _collection.Count());
277-
}
278-
}
279-
280284
[Test]
281285
public void TestBulkUpdate()
282286
{

0 commit comments

Comments
 (0)