diff --git a/services/blob/docker-server/contents/server/src/DatabaseEntities/BlobItem.h b/services/blob/docker-server/contents/server/src/DatabaseEntities/BlobItem.h --- a/services/blob/docker-server/contents/server/src/DatabaseEntities/BlobItem.h +++ b/services/blob/docker-server/contents/server/src/DatabaseEntities/BlobItem.h @@ -34,7 +34,8 @@ void assignItemFromDatabase(const AttributeValues &itemFromDB) override; std::string getTableName() const override; - std::string getPrimaryKey() const override; + PrimaryKey getPrimaryKey() const override; + PrimaryKeyValue getPrimaryKeyValue() const override; std::string getBlobHash() const; S3Path getS3Path() const; diff --git a/services/blob/docker-server/contents/server/src/DatabaseEntities/BlobItem.cpp b/services/blob/docker-server/contents/server/src/DatabaseEntities/BlobItem.cpp --- a/services/blob/docker-server/contents/server/src/DatabaseEntities/BlobItem.cpp +++ b/services/blob/docker-server/contents/server/src/DatabaseEntities/BlobItem.cpp @@ -49,8 +49,12 @@ return BlobItem::tableName; } -std::string BlobItem::getPrimaryKey() const { - return BlobItem::FIELD_BLOB_HASH; +PrimaryKey BlobItem::getPrimaryKey() const { + return PrimaryKey(BlobItem::FIELD_BLOB_HASH); +} + +PrimaryKeyValue BlobItem::getPrimaryKeyValue() const { + return PrimaryKeyValue(this->blobHash); } std::string BlobItem::getBlobHash() const { diff --git a/services/blob/docker-server/contents/server/src/DatabaseEntities/Item.h b/services/blob/docker-server/contents/server/src/DatabaseEntities/Item.h --- a/services/blob/docker-server/contents/server/src/DatabaseEntities/Item.h +++ b/services/blob/docker-server/contents/server/src/DatabaseEntities/Item.h @@ -3,6 +3,7 @@ #include #include +#include #include namespace comm { @@ -12,12 +13,34 @@ typedef Aws::Map AttributeValues; +struct PrimaryKeyBase { + PrimaryKeyBase(const std::string partitionKey) + : partitionKey(partitionKey), sortKey(nullptr) { + } + PrimaryKeyBase(const std::string partitionKey, const std::string sortKey) + : partitionKey(partitionKey), + sortKey(std::make_unique(sortKey)) { + } + + const std::string partitionKey; + std::unique_ptr sortKey; +}; + +struct PrimaryKey : PrimaryKeyBase { + using PrimaryKeyBase::PrimaryKeyBase; +}; + +struct PrimaryKeyValue : PrimaryKeyBase { + using PrimaryKeyBase::PrimaryKeyBase; +}; + class Item { virtual void validate() const = 0; public: virtual std::string getTableName() const = 0; - virtual std::string getPrimaryKey() const = 0; + virtual PrimaryKey getPrimaryKey() const = 0; + virtual PrimaryKeyValue getPrimaryKeyValue() const = 0; virtual void assignItemFromDatabase(const AttributeValues &itemFromDB) = 0; }; diff --git a/services/blob/docker-server/contents/server/src/DatabaseEntities/ReverseIndexItem.h b/services/blob/docker-server/contents/server/src/DatabaseEntities/ReverseIndexItem.h --- a/services/blob/docker-server/contents/server/src/DatabaseEntities/ReverseIndexItem.h +++ b/services/blob/docker-server/contents/server/src/DatabaseEntities/ReverseIndexItem.h @@ -28,7 +28,9 @@ void assignItemFromDatabase(const AttributeValues &itemFromDB) override; std::string getTableName() const override; - std::string getPrimaryKey() const override; + PrimaryKey getPrimaryKey() const override; + PrimaryKeyValue getPrimaryKeyValue() const override; + std::string getHolder() const; std::string getBlobHash() const; }; diff --git a/services/blob/docker-server/contents/server/src/DatabaseEntities/ReverseIndexItem.cpp b/services/blob/docker-server/contents/server/src/DatabaseEntities/ReverseIndexItem.cpp --- a/services/blob/docker-server/contents/server/src/DatabaseEntities/ReverseIndexItem.cpp +++ b/services/blob/docker-server/contents/server/src/DatabaseEntities/ReverseIndexItem.cpp @@ -42,8 +42,12 @@ return ReverseIndexItem::tableName; } -std::string ReverseIndexItem::getPrimaryKey() const { - return ReverseIndexItem::FIELD_HOLDER; +PrimaryKey ReverseIndexItem::getPrimaryKey() const { + return PrimaryKey(ReverseIndexItem::FIELD_HOLDER); +} + +PrimaryKeyValue ReverseIndexItem::getPrimaryKeyValue() const { + return PrimaryKeyValue(this->holder); } std::string ReverseIndexItem::getHolder() const { diff --git a/services/blob/docker-server/contents/server/src/DatabaseManager.h b/services/blob/docker-server/contents/server/src/DatabaseManager.h --- a/services/blob/docker-server/contents/server/src/DatabaseManager.h +++ b/services/blob/docker-server/contents/server/src/DatabaseManager.h @@ -35,7 +35,7 @@ template std::shared_ptr innerFindItem(Aws::DynamoDB::Model::GetItemRequest &request); - void innerRemoveItem(const Item &item, const std::string &key); + void innerRemoveItem(const Item &item); public: static DatabaseManager &getInstance(); diff --git a/services/blob/docker-server/contents/server/src/DatabaseManager.cpp b/services/blob/docker-server/contents/server/src/DatabaseManager.cpp --- a/services/blob/docker-server/contents/server/src/DatabaseManager.cpp +++ b/services/blob/docker-server/contents/server/src/DatabaseManager.cpp @@ -27,13 +27,19 @@ } } -void DatabaseManager::innerRemoveItem( - const Item &item, - const std::string &key) { +void DatabaseManager::innerRemoveItem(const Item &item) { Aws::DynamoDB::Model::DeleteItemRequest request; request.SetTableName(item.getTableName()); + PrimaryKey pk = item.getPrimaryKey(); + PrimaryKeyValue primaryKeyValue = item.getPrimaryKeyValue(); request.AddKey( - item.getPrimaryKey(), Aws::DynamoDB::Model::AttributeValue(key)); + pk.partitionKey, + Aws::DynamoDB::Model::AttributeValue(primaryKeyValue.partitionKey)); + if (pk.sortKey != nullptr && primaryKeyValue.sortKey != nullptr) { + request.AddKey( + *pk.sortKey, + Aws::DynamoDB::Model::AttributeValue(*primaryKeyValue.sortKey)); + } const Aws::DynamoDB::Model::DeleteItemOutcome &outcome = getDynamoDBClient()->DeleteItem(request); @@ -69,7 +75,11 @@ } void DatabaseManager::removeBlobItem(const std::string &blobHash) { - this->innerRemoveItem(*(createItemByType()), blobHash); + std::shared_ptr item = this->findBlobItem(blobHash); + if (item == nullptr) { + return; + } + this->innerRemoveItem(*item); } void DatabaseManager::putReverseIndexItem(const ReverseIndexItem &item) { @@ -133,7 +143,7 @@ if (item == nullptr) { return false; } - this->innerRemoveItem(*item, item->getHolder()); + this->innerRemoveItem(*item); return true; }