diff --git a/services/backup/docker-server/contents/server/src/DatabaseManager.cpp b/services/backup/docker-server/contents/server/src/DatabaseManager.cpp new file mode 100644 index 000000000..ec6bd9ff0 --- /dev/null +++ b/services/backup/docker-server/contents/server/src/DatabaseManager.cpp @@ -0,0 +1,47 @@ +#include "DatabaseManager.h" +#include "Constants.h" + +#include +#include +#include +#include + +#include + +namespace comm { +namespace network { +namespace database { + +DatabaseManager &DatabaseManager::getInstance() { + static DatabaseManager instance; + return instance; +} + +void DatabaseManager::innerPutItem( + std::shared_ptr item, + const Aws::DynamoDB::Model::PutItemRequest &request) { + const Aws::DynamoDB::Model::PutItemOutcome outcome = + getDynamoDBClient()->PutItem(request); + if (!outcome.IsSuccess()) { + throw std::runtime_error(outcome.GetError().GetMessage()); + } +} + +void DatabaseManager::innerRemoveItem( + const Item &item, + const std::string &key) { + Aws::DynamoDB::Model::DeleteItemRequest request; + request.SetTableName(item.getTableName()); + request.AddKey( + item.getPrimaryKey(), Aws::DynamoDB::Model::AttributeValue(key)); + + const Aws::DynamoDB::Model::DeleteItemOutcome &outcome = + getDynamoDBClient()->DeleteItem(request); + if (!outcome.IsSuccess()) { + throw std::runtime_error(outcome.GetError().GetMessage()); + } +} + +} // namespace database +} // namespace network +} // namespace comm diff --git a/services/backup/docker-server/contents/server/src/DatabaseManager.h b/services/backup/docker-server/contents/server/src/DatabaseManager.h new file mode 100644 index 000000000..f21774fa4 --- /dev/null +++ b/services/backup/docker-server/contents/server/src/DatabaseManager.h @@ -0,0 +1,61 @@ +#pragma once + +#include "AwsTools.h" +#include "DatabaseEntitiesTools.h" + +#include +#include +#include +#include + +#include +#include + +#ifdef COMM_SERVICES_DEV_MODE +#include "DatabaseSimulator.h" +#endif + +namespace comm { +namespace network { +namespace database { + +// this class should be thread-safe in case any shared resources appear +class DatabaseManager { +#ifdef COMM_SERVICES_DEV_MODE + DatabaseSimulator dbSimulator; +#endif + + void innerPutItem( + std::shared_ptr item, + const Aws::DynamoDB::Model::PutItemRequest &request); + + template + std::shared_ptr + innerFindItem(Aws::DynamoDB::Model::GetItemRequest &request); + void innerRemoveItem(const Item &item, const std::string &key); + +public: + static DatabaseManager &getInstance(); +}; + +template +std::shared_ptr +DatabaseManager::innerFindItem(Aws::DynamoDB::Model::GetItemRequest &request) { + std::shared_ptr item = createItemByType(); + request.SetTableName(item->getTableName()); + const Aws::DynamoDB::Model::GetItemOutcome &outcome = + getDynamoDBClient()->GetItem(request); + if (!outcome.IsSuccess()) { + throw std::runtime_error(outcome.GetError().GetMessage()); + } + const AttributeValues &outcomeItem = outcome.GetResult().GetItem(); + if (!outcomeItem.size()) { + return nullptr; + } + item->assignItemFromDatabase(outcomeItem); + return item; +} + +} // namespace database +} // namespace network +} // namespace comm