diff --git a/common/cpp/include/asapo/database/database.h b/common/cpp/include/asapo/database/database.h index 0d1f5c61470184612b93ee47658a1078c5168f80..678983382422b09a6ccdfd3c3c9354d8478d0d9f 100644 --- a/common/cpp/include/asapo/database/database.h +++ b/common/cpp/include/asapo/database/database.h @@ -15,8 +15,8 @@ class Database { public: virtual Error Connect(const std::string& address, const std::string& database) = 0; virtual Error Insert(const std::string& collection, const MessageMeta& file, bool ignore_duplicates) const = 0; - virtual Error Insert(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size, - MetaIngestMode mode) const = 0; + virtual Error InsertMeta(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size, + MetaIngestMode mode) const = 0; virtual Error InsertAsDatasetMessage(const std::string& collection, const MessageMeta& file, uint64_t dataset_size, bool ignore_duplicates) const = 0; diff --git a/common/cpp/include/asapo/unittests/MockDatabase.h b/common/cpp/include/asapo/unittests/MockDatabase.h index f5d4d75cc0f623035c3aa50c28d7bc6a0bfbb14b..65631cdd87c7962251b8f7dc0f3091f1c7cbe347 100644 --- a/common/cpp/include/asapo/unittests/MockDatabase.h +++ b/common/cpp/include/asapo/unittests/MockDatabase.h @@ -30,13 +30,13 @@ class MockDatabase : public Database { MOCK_CONST_METHOD4(InsertAsDatasetMessage_t, ErrorInterface * (const std::string&, const MessageMeta&, uint64_t, bool)); - Error Insert(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size, - MetaIngestMode mode) const override { - return Error{Insert_t(collection, id, data, size, mode)}; + Error InsertMeta(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size, + MetaIngestMode mode) const override { + return Error{InsertMeta_t(collection, id, data, size, mode)}; } - MOCK_CONST_METHOD5(Insert_t, ErrorInterface * (const std::string&, const std::string& id, const uint8_t* data, - uint64_t size, MetaIngestMode mode)); + MOCK_CONST_METHOD5(InsertMeta_t, ErrorInterface * (const std::string&, const std::string& id, const uint8_t* data, + uint64_t size, MetaIngestMode mode)); Error GetById(const std::string& collection, uint64_t id, MessageMeta* file) const override { return Error{GetById_t(collection, id, file)}; diff --git a/common/cpp/src/database/mongodb_client.cpp b/common/cpp/src/database/mongodb_client.cpp index 0f496865b624f12f85173e2f5329c86e51ab7e94..747c4ed23a194b39172e9fccf83ced015db7fae2 100644 --- a/common/cpp/src/database/mongodb_client.cpp +++ b/common/cpp/src/database/mongodb_client.cpp @@ -190,16 +190,16 @@ Error MongoDBClient::ReplaceBsonDocument(const std::string& id, const bson_p& do Error err = nullptr; bson_iter_t iter; - if (!mongoc_collection_replace_one(current_collection_, selector, document.get(), opts,&reply, &mongo_err)) { + if (!mongoc_collection_replace_one(current_collection_, selector, document.get(), opts, &reply, &mongo_err)) { err = DBErrorTemplates::kInsertError.Generate(mongo_err.message); } - if (err==nullptr) { + if (err == nullptr) { bson_iter_init_find(&iter, &reply, "upsertedCount"); auto n_upsert = bson_iter_int32(&iter); bson_iter_init_find(&iter, &reply, "modifiedCount"); auto n_mod = bson_iter_int32(&iter); - if (n_mod + n_upsert!=1) { + if (n_mod + n_upsert != 1) { err = DBErrorTemplates::kInsertError.Generate("metadata does not exist"); } } @@ -233,8 +233,9 @@ MongoDBClient::~MongoDBClient() { CleanUp(); } -Error MongoDBClient::Insert(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size, - MetaIngestMode mode) const { +Error MongoDBClient::InsertMeta(const std::string& collection, const std::string& id, const uint8_t* data, + uint64_t size, + MetaIngestMode mode) const { if (!connected_) { return DBErrorTemplates::kNotConnected.Generate(); } @@ -248,18 +249,18 @@ Error MongoDBClient::Insert(const std::string& collection, const std::string& id if (err) { return err; } - - if (!BSON_APPEND_UTF8(document.get(), "_id", id.c_str())) { + auto id_encoded = EncodeColName(id); + if (!BSON_APPEND_UTF8(document.get(), "_id", id_encoded.c_str())) { err = DBErrorTemplates::kInsertError.Generate("cannot assign document id "); } switch (mode.op) { - case MetaIngestOp::kInsert: - return InsertBsonDocument(document,false); - case asapo::MetaIngestOp::kReplace: - return ReplaceBsonDocument(id, document, mode.upsert); - case MetaIngestOp::kUpdate: - break; + case MetaIngestOp::kInsert: + return InsertBsonDocument(document, false); + case asapo::MetaIngestOp::kReplace: + return ReplaceBsonDocument(id_encoded, document, mode.upsert); + case MetaIngestOp::kUpdate: + break; } @@ -645,6 +646,7 @@ Error MongoDBClient::DeleteStream(const std::string& stream) const { DeleteCollections(acks_col); std::string querystr = ".*_" + EscapeQuery(stream_encoded) + "$"; DeleteDocumentsInCollection("current_location", querystr); + DeleteDocumentsInCollection("meta", "^" + EscapeQuery(stream_encoded) + "$"); } return err; } diff --git a/common/cpp/src/database/mongodb_client.h b/common/cpp/src/database/mongodb_client.h index 2114c4c05bfdcc186e6ee969ad4d609d391bbe49..517e75a640c5deef3e1faad6a6515af70a36d709 100644 --- a/common/cpp/src/database/mongodb_client.h +++ b/common/cpp/src/database/mongodb_client.h @@ -49,8 +49,8 @@ class MongoDBClient final : public Database { Error Insert(const std::string& collection, const MessageMeta& file, bool ignore_duplicates) const override; Error InsertAsDatasetMessage(const std::string& collection, const MessageMeta& file, uint64_t dataset_size, bool ignore_duplicates) const override; - Error Insert(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size, - MetaIngestMode mode) const override; + Error InsertMeta(const std::string& collection, const std::string& id, const uint8_t* data, uint64_t size, + MetaIngestMode mode) const override; Error GetById(const std::string& collection, uint64_t id, MessageMeta* file) const override; Error GetDataSetById(const std::string& collection, uint64_t id_in_set, uint64_t id, MessageMeta* file) const override; Error GetStreamInfo(const std::string& collection, StreamInfo* info) const override; diff --git a/receiver/src/request_handler/request_handler_db_meta_write.cpp b/receiver/src/request_handler/request_handler_db_meta_write.cpp index 58aa2af5cffee516232cb4d9f28bccdd0c39de25..c1b096af12fcb93eeb2108f5b6b0a3602ef1672a 100644 --- a/receiver/src/request_handler/request_handler_db_meta_write.cpp +++ b/receiver/src/request_handler/request_handler_db_meta_write.cpp @@ -27,7 +27,7 @@ Error RequestHandlerDbMetaWrite::ProcessRequest(Request* request) const { mode.Decode(request->GetCustomData()[kPosMetaIngestMode]); } - auto err = db_client__->Insert(collection_name_prefix_, stream.empty() ? "bt" : "st_" + stream, meta, size, mode); + auto err = db_client__->InsertMeta(collection_name_prefix_, stream.empty() ? "bt" : "st_" + stream, meta, size, mode); if (!err) { if (stream.empty()) { log__->Debug(std::string{"insert beamtime meta"} + " to " + collection_name_prefix_ + " in " + diff --git a/receiver/unittests/request_handler/test_request_handler_db_meta_writer.cpp b/receiver/unittests/request_handler/test_request_handler_db_meta_writer.cpp index 73a88dd21958e230ac37343155ad9900fc6c21e8..56d3ad7a8be794d60d3bc814bc39becda3ac63a2 100644 --- a/receiver/unittests/request_handler/test_request_handler_db_meta_writer.cpp +++ b/receiver/unittests/request_handler/test_request_handler_db_meta_writer.cpp @@ -130,8 +130,8 @@ TEST_F(DbMetaWriterHandlerTests, CallsIngestBeamtimeMetaOldVersion) { asapo::MetaIngestMode expected_mode{asapo::MetaIngestOp::kReplace, true}; - EXPECT_CALL(mock_db, Insert_t(expected_collection_name, "bt", expected_meta, expected_meta_size, - M_CheckIngestMode(expected_mode))). + EXPECT_CALL(mock_db, InsertMeta_t(expected_collection_name, "bt", expected_meta, expected_meta_size, + M_CheckIngestMode(expected_mode))). WillOnce(testing::Return(nullptr)); EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("insert beamtime meta"), @@ -152,8 +152,8 @@ TEST_F(DbMetaWriterHandlerTests, CallsIngestBeamtimeMeta) { asapo::MetaIngestMode expected_mode{asapo::MetaIngestOp::kInsert, true}; - EXPECT_CALL(mock_db, Insert_t(expected_collection_name, "bt", expected_meta, expected_meta_size, - M_CheckIngestMode(expected_mode))). + EXPECT_CALL(mock_db, InsertMeta_t(expected_collection_name, "bt", expected_meta, expected_meta_size, + M_CheckIngestMode(expected_mode))). WillOnce(testing::Return(nullptr)); EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("insert beamtime meta"), @@ -173,8 +173,8 @@ TEST_F(DbMetaWriterHandlerTests, CallsIngestStreamMeta) { ExpectRequestParams(asapo::GetReceiverApiVersion(), 13, expected_stream); asapo::MetaIngestMode expected_mode{asapo::MetaIngestOp::kUpdate, true}; - EXPECT_CALL(mock_db, Insert_t(expected_collection_name, "st_" + expected_stream, expected_meta, expected_meta_size, - M_CheckIngestMode(expected_mode))). + EXPECT_CALL(mock_db, InsertMeta_t(expected_collection_name, "st_" + expected_stream, expected_meta, expected_meta_size, + M_CheckIngestMode(expected_mode))). WillOnce(testing::Return(nullptr)); EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("insert stream meta"), diff --git a/tests/automatic/mongo_db/insert_retrieve/insert_retrieve_mongodb.cpp b/tests/automatic/mongo_db/insert_retrieve/insert_retrieve_mongodb.cpp index 5e05165dd5a9d8655d718a4cd7b806b6d18d430a..9fdcc4cacf8a0ac84376b2fb8646fa84a03c14f5 100644 --- a/tests/automatic/mongo_db/insert_retrieve/insert_retrieve_mongodb.cpp +++ b/tests/automatic/mongo_db/insert_retrieve/insert_retrieve_mongodb.cpp @@ -100,16 +100,16 @@ int main(int argc, char* argv[]) { // metadata - asapo::MetaIngestMode mode{asapo::MetaIngestOp::kInsert,false}; + asapo::MetaIngestMode mode{asapo::MetaIngestOp::kInsert, false}; std::string meta = R"({"data":"test"})"; - err = db_new.Insert("meta","bt", reinterpret_cast<const uint8_t *>(meta.c_str()),meta.size(),mode); + err = db_new.InsertMeta("meta", stream_name, reinterpret_cast<const uint8_t*>(meta.c_str()), meta.size(), mode); M_AssertEq(nullptr, err); - err = db_new.Insert("meta","bt", reinterpret_cast<const uint8_t *>(meta.c_str()),meta.size(),mode); + err = db_new.InsertMeta("meta", stream_name, reinterpret_cast<const uint8_t*>(meta.c_str()), meta.size(), mode); M_AssertTrue(err == asapo::DBErrorTemplates::kDuplicateID); mode.op = asapo::MetaIngestOp::kReplace; - err = db_new.Insert("meta","bt", reinterpret_cast<const uint8_t *>(meta.c_str()),meta.size(),mode); + err = db_new.InsertMeta("meta", stream_name, reinterpret_cast<const uint8_t*>(meta.c_str()), meta.size(), mode); M_AssertEq(nullptr, err); - err = db_new.Insert("meta","bt1", reinterpret_cast<const uint8_t *>(meta.c_str()),meta.size(),mode); + err = db_new.InsertMeta("meta", "notexist", reinterpret_cast<const uint8_t*>(meta.c_str()), meta.size(), mode); M_AssertTrue(err == asapo::DBErrorTemplates::kInsertError); diff --git a/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp b/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp index 9b14210d037a3d901b77dbba1b9f134dce0e939c..ffdbfda51eff87fcdff166fbbdfb67b7b0e08922 100644 --- a/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp +++ b/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp @@ -46,14 +46,14 @@ int main(int argc, char* argv[]) { } auto mode = asapo::MetaIngestMode{asapo::MetaIngestOp::kReplace, true}; - auto err = db.Insert("meta", "0", reinterpret_cast<const uint8_t*>(json.c_str()), json.size(), mode); + auto err = db.InsertMeta("meta", "0", reinterpret_cast<const uint8_t*>(json.c_str()), json.size(), mode); if (err) { std::cout << err->Explain() << std::endl; } Assert(err, args.keyword); - err = db.Insert("meta", "0", reinterpret_cast<const uint8_t*>(json.c_str()), json.size(), mode); + err = db.InsertMeta("meta", "0", reinterpret_cast<const uint8_t*>(json.c_str()), json.size(), mode); if (err) { std::cout << err->Explain() << std::endl; }