Skip to content

Commit 705d0c8

Browse files
author
rstam
committed
CSHARP-797: Prohibit Find and Insert on a bulk write operation after Execute.
1 parent f08307b commit 705d0c8

File tree

4 files changed

+219
-145
lines changed

4 files changed

+219
-145
lines changed

MongoDB.Driver/Operations/BulkWriteOperation.cs

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +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;
30+
private bool _hasBeenExecuted;
3131

3232
// constructors
3333
internal BulkWriteOperation(MongoCollection collection, bool isOrdered)
@@ -43,18 +43,7 @@ internal BulkWriteOperation(MongoCollection collection, bool isOrdered)
4343
/// <returns>A BulkWriteResult.</returns>
4444
public BulkWriteResult Execute()
4545
{
46-
if (_hasAlreadyBeenExecuted)
47-
{
48-
throw new InvalidOperationException("A bulk write operation can only be executed once.");
49-
}
50-
_hasAlreadyBeenExecuted = true;
51-
52-
var args = new BulkWriteArgs
53-
{
54-
IsOrdered = _isOrdered,
55-
Requests = _requests
56-
};
57-
return _collection.BulkWrite(args);
46+
return ExecuteHelper(null);
5847
}
5948

6049
/// <summary>
@@ -68,13 +57,7 @@ public BulkWriteResult Execute(WriteConcern writeConcern)
6857
{
6958
throw new ArgumentNullException("writeConcern");
7059
}
71-
var args = new BulkWriteArgs
72-
{
73-
IsOrdered = _isOrdered,
74-
WriteConcern = writeConcern,
75-
Requests = _requests
76-
};
77-
return _collection.BulkWrite(args);
60+
return ExecuteHelper(writeConcern);
7861
}
7962

8063
/// <summary>
@@ -88,6 +71,10 @@ public BulkWriteRequestBuilder Find(IMongoQuery query)
8871
{
8972
throw new ArgumentNullException("query");
9073
}
74+
if (_hasBeenExecuted)
75+
{
76+
throw new InvalidOperationException("The bulk write operation has already been executed.");
77+
}
9178
return new BulkWriteRequestBuilder(AddRequest, query);
9279
}
9380

@@ -109,7 +96,28 @@ public void Insert<TDocument>(TDocument document)
10996
// private methods
11097
private void AddRequest(WriteRequest request)
11198
{
99+
if (_hasBeenExecuted)
100+
{
101+
throw new InvalidOperationException("The bulk write operation has already been executed.");
102+
}
112103
_requests.Add(request);
113104
}
105+
106+
private BulkWriteResult ExecuteHelper(WriteConcern writeConcern)
107+
{
108+
if (_hasBeenExecuted)
109+
{
110+
throw new InvalidOperationException("The bulk write operation has already been executed.");
111+
}
112+
_hasBeenExecuted = true;
113+
114+
var args = new BulkWriteArgs
115+
{
116+
IsOrdered = _isOrdered,
117+
WriteConcern = writeConcern,
118+
Requests = _requests
119+
};
120+
return _collection.BulkWrite(args);
121+
}
114122
}
115123
}

MongoDB.DriverUnitTests/MongoCollectionTests.cs

Lines changed: 0 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -246,23 +246,6 @@ 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-
266249
[Test]
267250
public void TestBulkInsert()
268251
{
@@ -1261,114 +1244,6 @@ public void TestFindWithMaxTime()
12611244
}
12621245
}
12631246

1264-
[Test]
1265-
public void TestFluentBulkDelete()
1266-
{
1267-
_collection.Drop();
1268-
_collection.Insert(new BsonDocument("x", 1));
1269-
_collection.Insert(new BsonDocument("x", 2));
1270-
_collection.Insert(new BsonDocument("x", 3));
1271-
1272-
var bulk = _collection.InitializeOrderedBulkOperation();
1273-
bulk.Find(Query.EQ("x", 1)).RemoveOne();
1274-
bulk.Find(Query.EQ("x", 3)).RemoveOne();
1275-
var result = bulk.Execute(WriteConcern.Acknowledged);
1276-
1277-
Assert.AreEqual(1, _collection.Count());
1278-
Assert.AreEqual(2, _collection.FindOne()["x"].ToInt32());
1279-
}
1280-
1281-
[Test]
1282-
public void TestFluentBulkDeleteMissingQuery()
1283-
{
1284-
var bulk = _collection.InitializeOrderedBulkOperation();
1285-
Assert.Throws<ArgumentNullException>(() => bulk.Find(null));
1286-
}
1287-
1288-
[Test]
1289-
public void TestFluentBulkInsert()
1290-
{
1291-
_collection.Drop();
1292-
var bulk = _collection.InitializeOrderedBulkOperation();
1293-
bulk.Insert(new BsonDocument("x", 1));
1294-
bulk.Insert(new BsonDocument("x", 2));
1295-
bulk.Insert(new BsonDocument("x", 3));
1296-
var result = bulk.Execute(WriteConcern.Acknowledged);
1297-
1298-
Assert.AreEqual(3, _collection.Count());
1299-
}
1300-
1301-
[Test]
1302-
public void TestFluentBulkUpdate()
1303-
{
1304-
_collection.Drop();
1305-
_collection.Insert(new BsonDocument("x", 1));
1306-
_collection.Insert(new BsonDocument("x", 2));
1307-
_collection.Insert(new BsonDocument("x", 3));
1308-
1309-
var bulk = _collection.InitializeOrderedBulkOperation();
1310-
bulk.Find(Query.GT("x", 0)).Update(Update.Set("z", 1));
1311-
bulk.Find(Query.EQ("x", 3)).UpdateOne(Update.Set("z", 3));
1312-
bulk.Find(Query.EQ("x", 4)).Upsert().UpdateOne(Update.Set("z", 4));
1313-
var result = bulk.Execute(WriteConcern.Acknowledged);
1314-
1315-
Assert.AreEqual(4, _collection.Count());
1316-
foreach (var document in _collection.FindAll())
1317-
{
1318-
var x = document["x"].ToInt32();
1319-
var z = document["z"].ToInt32();
1320-
var expected = (x == 2) ? 1 : x;
1321-
Assert.AreEqual(expected, z);
1322-
}
1323-
}
1324-
1325-
[Test]
1326-
public void TestFluentBulkWrite()
1327-
{
1328-
_collection.Drop();
1329-
var bulk = _collection.InitializeOrderedBulkOperation();
1330-
bulk.Insert(new BsonDocument("x", 1));
1331-
bulk.Insert(new BsonDocument("x", 2));
1332-
bulk.Insert(new BsonDocument("x", 3));
1333-
bulk.Insert(new BsonDocument("x", 4));
1334-
bulk.Find(Query.GT("x", 2)).Update(Update.Inc("x", 10));
1335-
bulk.Find(Query.EQ("x", 13)).RemoveOne();
1336-
bulk.Find(Query.EQ("x", 14)).RemoveOne();
1337-
var result = bulk.Execute(WriteConcern.Acknowledged);
1338-
1339-
Assert.AreEqual(2, _collection.Count());
1340-
}
1341-
1342-
[Test]
1343-
public void TestBulkFluentWriteOrdered()
1344-
{
1345-
_collection.Drop();
1346-
var bulk = _collection.InitializeOrderedBulkOperation();
1347-
bulk.Find(Query.EQ("x", 1)).Upsert().UpdateOne(Update.Set("y", 1));
1348-
bulk.Find(Query.EQ("x", 1)).RemoveOne();
1349-
bulk.Find(Query.EQ("x", 1)).Upsert().UpdateOne(Update.Set("y", 1));
1350-
bulk.Find(Query.EQ("x", 1)).RemoveOne();
1351-
bulk.Find(Query.EQ("x", 1)).Upsert().UpdateOne(Update.Set("y", 1));
1352-
var result = bulk.Execute(WriteConcern.Acknowledged);
1353-
1354-
Assert.AreEqual(1, _collection.Count());
1355-
}
1356-
1357-
[Test]
1358-
public void TestFluentBulkWriteUnordered()
1359-
{
1360-
_collection.Drop();
1361-
var bulk = _collection.InitializeUnorderedBulkOperation();
1362-
bulk.Find(Query.EQ("x", 1)).Upsert().UpdateOne(Update.Set("y", 1));
1363-
bulk.Find(Query.EQ("x", 1)).RemoveOne();
1364-
bulk.Find(Query.EQ("x", 1)).Upsert().UpdateOne(Update.Set("y", 1));
1365-
bulk.Find(Query.EQ("x", 1)).RemoveOne();
1366-
bulk.Find(Query.EQ("x", 1)).Upsert().UpdateOne(Update.Set("y", 1));
1367-
var result = bulk.Execute(WriteConcern.Acknowledged);
1368-
1369-
Assert.AreEqual(0, _collection.Count());
1370-
}
1371-
13721247
#pragma warning disable 649 // never assigned to
13731248
private class Place
13741249
{

MongoDB.DriverUnitTests/MongoDB.DriverUnitTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@
145145
<Compile Include="MongoClientSettingsTests.cs" />
146146
<Compile Include="MongoServerBuildInfoTests.cs" />
147147
<Compile Include="Operations\BulkWriteBatchResultCombinerTests.cs" />
148+
<Compile Include="Operations\BulkWriteOperationTests.cs" />
148149
<Compile Include="Operations\DeleteCommandEmulatorTests.cs" />
149150
<Compile Include="ReadPreferenceTests.cs" />
150151
<Compile Include="MongoCollectionSettingsTests.cs" />

0 commit comments

Comments
 (0)