Skip to content

Commit 2ce2818

Browse files
committed
CXX-1536 use mongoc_bulk_operation_insert_with_opts
Also test errors returned from libmongoc bulk functions.
1 parent ac36a5a commit 2ce2818

File tree

6 files changed

+141
-21
lines changed

6 files changed

+141
-21
lines changed

src/mongocxx/bulk_write.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,12 @@ bulk_write& bulk_write::append(const model::write& operation) {
6060
switch (operation.type()) {
6161
case write_type::k_insert_one: {
6262
scoped_bson_t doc(operation.get_insert_one().document());
63-
64-
libmongoc::bulk_operation_insert(_impl->operation_t, doc.bson());
63+
bson_error_t error;
64+
auto result = libmongoc::bulk_operation_insert_with_opts(
65+
_impl->operation_t, doc.bson(), nullptr, &error);
66+
if (!result) {
67+
throw_exception<logic_error>(error);
68+
}
6569
break;
6670
}
6771
case write_type::k_update_one: {

src/mongocxx/private/libmongoc_symbols.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
MONGOCXX_LIBMONGOC_SYMBOL(bulk_operation_destroy)
1616
MONGOCXX_LIBMONGOC_SYMBOL(bulk_operation_execute)
1717
MONGOCXX_LIBMONGOC_SYMBOL(bulk_operation_get_write_concern)
18-
MONGOCXX_LIBMONGOC_SYMBOL(bulk_operation_insert)
18+
MONGOCXX_LIBMONGOC_SYMBOL(bulk_operation_insert_with_opts)
1919
MONGOCXX_LIBMONGOC_SYMBOL(bulk_operation_new)
2020
MONGOCXX_LIBMONGOC_SYMBOL(bulk_operation_remove_many_with_opts)
2121
MONGOCXX_LIBMONGOC_SYMBOL(bulk_operation_remove_one_with_opts)

src/mongocxx/test/bulk_write.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ class insert_functor {
8282
insert_functor(bool* called, bsoncxx::document::view document)
8383
: _called{called}, _document{document} {}
8484

85-
void operator()(mongoc_bulk_operation_t*, const bson_t* document) {
85+
void operator()(mongoc_bulk_operation_t*,
86+
const bson_t* document,
87+
const bson_t*,
88+
bson_error_t*) {
8689
*_called = true;
8790
REQUIRE(bson_get_data(document) == _document.data());
8891
}
@@ -199,8 +202,8 @@ TEST_CASE("passing write operations to append calls corresponding C function", "
199202
update_functor replace_func(&called, filter, doc);
200203
delete_functor delete_func(&called, doc);
201204

202-
SECTION("insert_one invokes mongoc_bulk_operation_insert") {
203-
auto bulk_insert = libmongoc::bulk_operation_insert.create_instance();
205+
SECTION("insert_one invokes mongoc_bulk_operation_insert_with_opts") {
206+
auto bulk_insert = libmongoc::bulk_operation_insert_with_opts.create_instance();
204207
bulk_insert->visit(insert_func);
205208

206209
bw.append(model::insert_one(doc));

src/mongocxx/test/client_session.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ TEST_CASE("session", "[session]") {
156156
client c2{uri{}};
157157

158158
REQUIRE_THROWS_MATCHES(c2["db"]["collection"].insert_one(s, {}),
159-
bulk_write_exception,
159+
logic_error,
160160
mongocxx_exception_matcher{"Invalid sessionId"});
161161
}
162162
}

src/mongocxx/test/collection_mocked.cpp

Lines changed: 125 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -428,19 +428,24 @@ TEST_CASE("Collection", "[collection]") {
428428
[&](mongoc_bulk_operation_t*) { bulk_operation_destroy_called = true; });
429429

430430
SECTION("Insert One", "[collection::insert_one]") {
431-
bulk_operation_insert->interpose([&](mongoc_bulk_operation_t*, const bson_t* doc) {
432-
bulk_operation_op_called = true;
433-
REQUIRE(bson_get_data(doc) == filter_doc.view().data());
434-
});
431+
bulk_operation_insert_with_opts->interpose(
432+
[&](mongoc_bulk_operation_t*, const bson_t* doc, const bson_t*, bson_error_t*) {
433+
bulk_operation_op_called = true;
434+
REQUIRE(bson_get_data(doc) == filter_doc.view().data());
435+
return true;
436+
});
435437

436438
mongo_coll.insert_one(filter_doc.view());
439+
REQUIRE(bulk_operation_execute_called);
437440
}
438441

439442
SECTION("Insert One Bypassing Validation", "[collection::insert_one]") {
440-
bulk_operation_insert->interpose([&](mongoc_bulk_operation_t*, const bson_t* doc) {
441-
bulk_operation_op_called = true;
442-
REQUIRE(bson_get_data(doc) == filter_doc.view().data());
443-
});
443+
bulk_operation_insert_with_opts->interpose(
444+
[&](mongoc_bulk_operation_t*, const bson_t* doc, const bson_t*, bson_error_t*) {
445+
bulk_operation_op_called = true;
446+
REQUIRE(bson_get_data(doc) == filter_doc.view().data());
447+
return true;
448+
});
444449

445450
expect_set_bypass_document_validation_called = true;
446451
SECTION("...set to false") {
@@ -452,13 +457,16 @@ TEST_CASE("Collection", "[collection]") {
452457
options::insert opts{};
453458
opts.bypass_document_validation(expected_bypass_document_validation);
454459
mongo_coll.insert_one(filter_doc.view(), opts);
460+
REQUIRE(bulk_operation_execute_called);
455461
}
456462

457463
SECTION("Insert Many Ordered", "[collection::insert_many]") {
458-
bulk_operation_insert->interpose([&](mongoc_bulk_operation_t*, const bson_t* doc) {
459-
bulk_operation_op_called = true;
460-
REQUIRE(bson_get_data(doc) == filter_doc.view().data());
461-
});
464+
bulk_operation_insert_with_opts->interpose(
465+
[&](mongoc_bulk_operation_t*, const bson_t* doc, const bson_t*, bson_error_t*) {
466+
bulk_operation_op_called = true;
467+
REQUIRE(bson_get_data(doc) == filter_doc.view().data());
468+
return true;
469+
});
462470

463471
// The interposed collection_create_bulk_operation_with_opts validates this setting.
464472
SECTION("...set to false") {
@@ -472,6 +480,7 @@ TEST_CASE("Collection", "[collection]") {
472480
std::vector<bsoncxx::document::view> docs{};
473481
docs.push_back(filter_doc.view());
474482
mongo_coll.insert_many(docs, opts);
483+
REQUIRE(bulk_operation_execute_called);
475484
}
476485

477486
SECTION("Update One", "[collection::update_one]") {
@@ -530,6 +539,50 @@ TEST_CASE("Collection", "[collection]") {
530539
}
531540

532541
mongo_coll.update_one(filter_doc.view(), modification_doc.view(), options);
542+
REQUIRE(bulk_operation_execute_called);
543+
}
544+
545+
SECTION("Insert One Error", "[collection::insert_one]") {
546+
bulk_operation_insert_with_opts->interpose(
547+
[&](mongoc_bulk_operation_t*, const bson_t*, const bson_t*, bson_error_t* err) {
548+
bulk_operation_op_called = true;
549+
bson_set_error(err, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "err");
550+
return false;
551+
});
552+
553+
REQUIRE_THROWS_AS(mongo_coll.insert_one(filter_doc.view()), mongocxx::logic_error);
554+
REQUIRE(!bulk_operation_execute_called);
555+
}
556+
557+
SECTION("Insert Many Error", "[collection::insert_many]") {
558+
bulk_operation_insert_with_opts->interpose(
559+
[&](mongoc_bulk_operation_t*, const bson_t*, const bson_t*, bson_error_t* err) {
560+
bulk_operation_op_called = true;
561+
bson_set_error(err, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "err");
562+
return false;
563+
});
564+
565+
std::vector<bsoncxx::document::view> docs{};
566+
docs.push_back(filter_doc.view());
567+
expected_order_setting = true;
568+
REQUIRE_THROWS_AS(mongo_coll.insert_many(docs), mongocxx::logic_error);
569+
REQUIRE(!bulk_operation_execute_called);
570+
}
571+
572+
SECTION("Update One Error", "[collection::update_one]") {
573+
bulk_operation_update_one_with_opts->interpose([&](mongoc_bulk_operation_t*,
574+
const bson_t*,
575+
const bson_t*,
576+
const bson_t*,
577+
bson_error_t* err) {
578+
bulk_operation_op_called = true;
579+
bson_set_error(err, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "err");
580+
return false;
581+
});
582+
583+
REQUIRE_THROWS_AS(mongo_coll.update_one(filter_doc.view(), modification_doc.view()),
584+
mongocxx::logic_error);
585+
REQUIRE(!bulk_operation_execute_called);
533586
}
534587

535588
SECTION("Update Many", "[collection::update_many]") {
@@ -580,6 +633,23 @@ TEST_CASE("Collection", "[collection]") {
580633
}
581634

582635
mongo_coll.update_many(filter_doc.view(), modification_doc.view(), options);
636+
REQUIRE(bulk_operation_execute_called);
637+
}
638+
639+
SECTION("Update Many Error", "[collection::update_many]") {
640+
bulk_operation_update_many_with_opts->interpose([&](mongoc_bulk_operation_t*,
641+
const bson_t*,
642+
const bson_t*,
643+
const bson_t*,
644+
bson_error_t* err) {
645+
bulk_operation_op_called = true;
646+
bson_set_error(err, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "err");
647+
return false;
648+
});
649+
650+
REQUIRE_THROWS_AS(mongo_coll.update_many(filter_doc.view(), modification_doc.view()),
651+
mongocxx::logic_error);
652+
REQUIRE(!bulk_operation_execute_called);
583653
}
584654

585655
SECTION("Replace One", "[collection::replace_one]") {
@@ -630,6 +700,23 @@ TEST_CASE("Collection", "[collection]") {
630700
}
631701

632702
mongo_coll.replace_one(filter_doc.view(), modification_doc.view(), options);
703+
REQUIRE(bulk_operation_execute_called);
704+
}
705+
706+
SECTION("Replace One Error", "[collection::update_one]") {
707+
bulk_operation_replace_one_with_opts->interpose([&](mongoc_bulk_operation_t*,
708+
const bson_t*,
709+
const bson_t*,
710+
const bson_t*,
711+
bson_error_t* err) {
712+
bulk_operation_op_called = true;
713+
bson_set_error(err, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "err");
714+
return false;
715+
});
716+
717+
REQUIRE_THROWS_AS(mongo_coll.replace_one(filter_doc.view(), modification_doc.view()),
718+
mongocxx::logic_error);
719+
REQUIRE(!bulk_operation_execute_called);
633720
}
634721

635722
SECTION("Delete One", "[collection::delete_one]") {
@@ -641,6 +728,19 @@ TEST_CASE("Collection", "[collection]") {
641728
});
642729

643730
mongo_coll.delete_one(filter_doc.view());
731+
REQUIRE(bulk_operation_execute_called);
732+
}
733+
734+
SECTION("Delete One Error", "[collection::delete_one]") {
735+
bulk_operation_remove_one_with_opts->interpose(
736+
[&](mongoc_bulk_operation_t*, const bson_t*, const bson_t*, bson_error_t* err) {
737+
bulk_operation_op_called = true;
738+
bson_set_error(err, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "err");
739+
return false;
740+
});
741+
742+
REQUIRE_THROWS_AS(mongo_coll.delete_one(filter_doc.view()), mongocxx::logic_error);
743+
REQUIRE(!bulk_operation_execute_called);
644744
}
645745

646746
SECTION("Delete Many", "[collection::delete_many]") {
@@ -652,13 +752,25 @@ TEST_CASE("Collection", "[collection]") {
652752
});
653753

654754
mongo_coll.delete_many(filter_doc.view());
755+
REQUIRE(bulk_operation_execute_called);
756+
}
757+
758+
SECTION("Delete Many Error", "[collection::delete_one]") {
759+
bulk_operation_remove_many_with_opts->interpose(
760+
[&](mongoc_bulk_operation_t*, const bson_t*, const bson_t*, bson_error_t* err) {
761+
bulk_operation_op_called = true;
762+
bson_set_error(err, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "err");
763+
return false;
764+
});
765+
766+
REQUIRE_THROWS_AS(mongo_coll.delete_many(filter_doc.view()), mongocxx::logic_error);
767+
REQUIRE(!bulk_operation_execute_called);
655768
}
656769

657770
REQUIRE(collection_create_bulk_operation_called);
658771
REQUIRE(expect_set_bypass_document_validation_called ==
659772
bulk_operation_set_bypass_document_validation_called);
660773
REQUIRE(bulk_operation_op_called);
661-
REQUIRE(bulk_operation_execute_called);
662774
REQUIRE(bulk_operation_destroy_called);
663775
}
664776
}

src/third_party/catch/include/helpers.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,8 @@ MONGOCXX_INLINE_NAMESPACE_END
211211
cursor_destroy->interpose([&](mongoc_cursor_t*) {});
212212

213213
#define MOCK_BULK \
214-
auto bulk_operation_insert = libmongoc::bulk_operation_insert.create_instance(); \
214+
auto bulk_operation_insert_with_opts = \
215+
libmongoc::bulk_operation_insert_with_opts.create_instance(); \
215216
auto bulk_operation_remove_one_with_opts = \
216217
libmongoc::bulk_operation_remove_one_with_opts.create_instance(); \
217218
auto bulk_operation_update_one_with_opts = \

0 commit comments

Comments
 (0)