From 0643eeba5de821c0585223fdb160a3cf1a8fb1b0 Mon Sep 17 00:00:00 2001 From: JinmingHu Date: Tue, 12 Jan 2021 15:36:57 +0800 Subject: [PATCH] add a bool indicating whether the opration succeeds for CreateIfNotExists/DeleteIfExists (#1313) --- .../inc/azure/storage/blobs/append_blob_client.hpp | 4 ++-- .../inc/azure/storage/blobs/blob_client.hpp | 3 ++- .../inc/azure/storage/blobs/blob_container_client.hpp | 7 ++++--- .../inc/azure/storage/blobs/page_blob_client.hpp | 4 ++-- .../azure/storage/blobs/protocol/blob_rest_client.hpp | 5 +++++ .../azure-storage-blobs/src/append_blob_client.cpp | 4 +++- sdk/storage/azure-storage-blobs/src/blob_client.cpp | 4 +++- .../azure-storage-blobs/src/blob_container_client.cpp | 10 ++++++++-- .../azure-storage-blobs/src/page_blob_client.cpp | 5 ++++- .../test/append_blob_client_test.cpp | 4 ++-- .../test/blob_container_client_test.cpp | 8 ++++---- .../test/block_blob_client_test.cpp | 8 ++++---- .../azure-storage-blobs/test/page_blob_client_test.cpp | 4 ++-- 13 files changed, 45 insertions(+), 25 deletions(-) diff --git a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/append_blob_client.hpp b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/append_blob_client.hpp index e014a2061..bcb107120 100644 --- a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/append_blob_client.hpp +++ b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/append_blob_client.hpp @@ -119,8 +119,8 @@ namespace Azure { namespace Storage { namespace Blobs { * exists. * * @param options Optional parameters to execute this function. - * @return A CreateAppendBlobResult describing the newly created append blob. Null if the blob - * already exists. + * @return A CreateAppendBlobResult describing the newly created append blob. + * CreateAppendBlobResult.Created is false if the blob already exists. */ Azure::Core::Response CreateIfNotExists( const CreateAppendBlobOptions& options = CreateAppendBlobOptions()) const; diff --git a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/blob_client.hpp b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/blob_client.hpp index cfbb06d30..fb795c661 100644 --- a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/blob_client.hpp +++ b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/blob_client.hpp @@ -278,7 +278,8 @@ namespace Azure { namespace Storage { namespace Blobs { * @brief Marks the specified blob or snapshot for deletion if it exists. * * @param options Optional parameters to execute this function. - * @return A DeleteBlobResult on successfully deleting. Null if the blob doesn't exist. + * @return A DeleteBlobResult on successfully deleting. DeleteBlobResult.Deleted is false if the + * blob doesn't exist. */ Azure::Core::Response DeleteIfExists( const DeleteBlobOptions& options = DeleteBlobOptions()) const; diff --git a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/blob_container_client.hpp b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/blob_container_client.hpp index 0f1dcdc5b..1a57bd255 100644 --- a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/blob_container_client.hpp +++ b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/blob_container_client.hpp @@ -137,7 +137,8 @@ namespace Azure { namespace Storage { namespace Blobs { * * @param options Optional parameters to execute this function. * @return A CreateBlobContainerResult describing the newly created blob container if the - * container doesn't exist. Null if the container already exists. + * container doesn't exist. CreateBlobContainerResult.Created is false if the container already + * exists. */ Azure::Core::Response CreateIfNotExists( const CreateBlobContainerOptions& options = CreateBlobContainerOptions()) const; @@ -157,8 +158,8 @@ namespace Azure { namespace Storage { namespace Blobs { * contained within it are later deleted during garbage collection. * * @param options Optional parameters to execute this function. - * @return A DeleteBlobContainerResult if the container exists. Null if the container doesn't - * exist. + * @return A DeleteBlobContainerResult if the container exists. + * DeleteBlobContainerResult.Deleted is false if the container doesn't exist. */ Azure::Core::Response DeleteIfExists( const DeleteBlobContainerOptions& options = DeleteBlobContainerOptions()) const; diff --git a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/page_blob_client.hpp b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/page_blob_client.hpp index 787b4a4b5..cb2ce36d1 100644 --- a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/page_blob_client.hpp +++ b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/page_blob_client.hpp @@ -125,8 +125,8 @@ namespace Azure { namespace Storage { namespace Blobs { * @param blobContentLength Specifies the maximum size for the page blob. The size must be * aligned to a 512-byte boundary. * @param options Optional parameters to execute this function. - * @return A CreatePageBlobResult describing the newly created page blob. Null if the blob - * already exists. + * @return A CreatePageBlobResult describing the newly created page blob. + * CreatePageBlobResult.Created is false if the blob already exists. */ Azure::Core::Response CreateIfNotExists( int64_t blobContentLength, diff --git a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/protocol/blob_rest_client.hpp b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/protocol/blob_rest_client.hpp index 1c6adb38a..b1ab1870a 100644 --- a/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/protocol/blob_rest_client.hpp +++ b/sdk/storage/azure-storage-blobs/inc/azure/storage/blobs/protocol/blob_rest_client.hpp @@ -297,6 +297,7 @@ namespace Azure { namespace Storage { namespace Blobs { struct CreateAppendBlobResult { + bool Created = true; std::string ETag; Azure::Core::DateTime LastModified; Azure::Core::Nullable VersionId; @@ -307,6 +308,7 @@ namespace Azure { namespace Storage { namespace Blobs { struct CreateBlobContainerResult { + bool Created = true; std::string ETag; Azure::Core::DateTime LastModified; }; // struct CreateBlobContainerResult @@ -324,6 +326,7 @@ namespace Azure { namespace Storage { namespace Blobs { struct CreatePageBlobResult { + bool Created = true; std::string ETag; Azure::Core::DateTime LastModified; Azure::Core::Nullable VersionId; @@ -335,10 +338,12 @@ namespace Azure { namespace Storage { namespace Blobs { struct DeleteBlobContainerResult { + bool Deleted = true; }; // struct DeleteBlobContainerResult struct DeleteBlobResult { + bool Deleted = true; }; // struct DeleteBlobResult class DeleteSnapshotsOption { diff --git a/sdk/storage/azure-storage-blobs/src/append_blob_client.cpp b/sdk/storage/azure-storage-blobs/src/append_blob_client.cpp index da21d1773..56af513a5 100644 --- a/sdk/storage/azure-storage-blobs/src/append_blob_client.cpp +++ b/sdk/storage/azure-storage-blobs/src/append_blob_client.cpp @@ -110,7 +110,9 @@ namespace Azure { namespace Storage { namespace Blobs { if (e.StatusCode == Core::Http::HttpStatusCode::Conflict && e.ErrorCode == "BlobAlreadyExists") { - return Azure::Core::Response(std::move(e.RawResponse)); + Models::CreateAppendBlobResult ret; + ret.Created = false; + return Azure::Core::Response(std::move(ret), std::move(e.RawResponse)); } throw; } diff --git a/sdk/storage/azure-storage-blobs/src/blob_client.cpp b/sdk/storage/azure-storage-blobs/src/blob_client.cpp index b23829c74..e726b3300 100644 --- a/sdk/storage/azure-storage-blobs/src/blob_client.cpp +++ b/sdk/storage/azure-storage-blobs/src/blob_client.cpp @@ -634,7 +634,9 @@ namespace Azure { namespace Storage { namespace Blobs { if (e.StatusCode == Core::Http::HttpStatusCode::NotFound && (e.ErrorCode == "BlobNotFound" || e.ErrorCode == "ContainerNotFound")) { - return Azure::Core::Response(std::move(e.RawResponse)); + Models::DeleteBlobResult ret; + ret.Deleted = false; + return Azure::Core::Response(std::move(ret), std::move(e.RawResponse)); } throw; } diff --git a/sdk/storage/azure-storage-blobs/src/blob_container_client.cpp b/sdk/storage/azure-storage-blobs/src/blob_container_client.cpp index 564617977..63527d974 100644 --- a/sdk/storage/azure-storage-blobs/src/blob_container_client.cpp +++ b/sdk/storage/azure-storage-blobs/src/blob_container_client.cpp @@ -163,7 +163,10 @@ namespace Azure { namespace Storage { namespace Blobs { if (e.StatusCode == Core::Http::HttpStatusCode::Conflict && e.ErrorCode == "ContainerAlreadyExists") { - return Azure::Core::Response(std::move(e.RawResponse)); + Models::CreateBlobContainerResult ret; + ret.Created = false; + return Azure::Core::Response( + std::move(ret), std::move(e.RawResponse)); } throw; } @@ -192,7 +195,10 @@ namespace Azure { namespace Storage { namespace Blobs { if (e.StatusCode == Core::Http::HttpStatusCode::NotFound && e.ErrorCode == "ContainerNotFound") { - return Azure::Core::Response(std::move(e.RawResponse)); + Models::DeleteBlobContainerResult ret; + ret.Deleted = false; + return Azure::Core::Response( + std::move(ret), std::move(e.RawResponse)); } throw; } diff --git a/sdk/storage/azure-storage-blobs/src/page_blob_client.cpp b/sdk/storage/azure-storage-blobs/src/page_blob_client.cpp index 8940f83a2..7e3146e6b 100644 --- a/sdk/storage/azure-storage-blobs/src/page_blob_client.cpp +++ b/sdk/storage/azure-storage-blobs/src/page_blob_client.cpp @@ -117,7 +117,10 @@ namespace Azure { namespace Storage { namespace Blobs { if (e.StatusCode == Core::Http::HttpStatusCode::Conflict && e.ErrorCode == "BlobAlreadyExists") { - return Azure::Core::Response(std::move(e.RawResponse)); + Models::CreatePageBlobResult ret; + ret.Created = false; + return Azure::Core::Response( + std::move(ret), std::move(e.RawResponse)); } throw; } diff --git a/sdk/storage/azure-storage-blobs/test/append_blob_client_test.cpp b/sdk/storage/azure-storage-blobs/test/append_blob_client_test.cpp index 07508360b..9a6549123 100644 --- a/sdk/storage/azure-storage-blobs/test/append_blob_client_test.cpp +++ b/sdk/storage/azure-storage-blobs/test/append_blob_client_test.cpp @@ -340,14 +340,14 @@ namespace Azure { namespace Storage { namespace Test { EXPECT_THROW(blobClientWithoutAuth.CreateIfNotExists(), StorageException); { auto response = blobClient.CreateIfNotExists(); - EXPECT_TRUE(response.HasValue()); + EXPECT_TRUE(response->Created); } auto blobContent = Azure::Core::Http::MemoryBodyStream(m_blobContent.data(), m_blobContent.size()); blobClient.AppendBlock(&blobContent); { auto response = blobClient.CreateIfNotExists(); - EXPECT_FALSE(response.HasValue()); + EXPECT_FALSE(response->Created); } auto downloadStream = std::move(blobClient.Download()->BodyStream); EXPECT_EQ( diff --git a/sdk/storage/azure-storage-blobs/test/blob_container_client_test.cpp b/sdk/storage/azure-storage-blobs/test/blob_container_client_test.cpp index 116af7cd2..232de3517 100644 --- a/sdk/storage/azure-storage-blobs/test/blob_container_client_test.cpp +++ b/sdk/storage/azure-storage-blobs/test/blob_container_client_test.cpp @@ -79,19 +79,19 @@ namespace Azure { namespace Storage { namespace Test { StandardStorageConnectionString(), LowercaseRandomString()); { auto response = container_client.DeleteIfExists(); - EXPECT_FALSE(response.HasValue()); + EXPECT_FALSE(response->Deleted); } { auto response = container_client.CreateIfNotExists(); - EXPECT_TRUE(response.HasValue()); + EXPECT_TRUE(response->Created); } { auto response = container_client.CreateIfNotExists(); - EXPECT_FALSE(response.HasValue()); + EXPECT_FALSE(response->Created); } { auto response = container_client.DeleteIfExists(); - EXPECT_TRUE(response.HasValue()); + EXPECT_TRUE(response->Deleted); } } diff --git a/sdk/storage/azure-storage-blobs/test/block_blob_client_test.cpp b/sdk/storage/azure-storage-blobs/test/block_blob_client_test.cpp index 218de2339..bcc29bbe2 100644 --- a/sdk/storage/azure-storage-blobs/test/block_blob_client_test.cpp +++ b/sdk/storage/azure-storage-blobs/test/block_blob_client_test.cpp @@ -780,14 +780,14 @@ namespace Azure { namespace Storage { namespace Test { auto blobClientWithoutAuth = Azure::Storage::Blobs::BlockBlobClient(blobClient.GetUrl()); { auto response = blobClient.DeleteIfExists(); - EXPECT_FALSE(response.HasValue()); + EXPECT_FALSE(response->Deleted); } std::vector emptyContent; blobClient.UploadFrom(emptyContent.data(), emptyContent.size()); EXPECT_THROW(blobClientWithoutAuth.DeleteIfExists(), StorageException); { auto response = blobClient.DeleteIfExists(); - EXPECT_TRUE(response.HasValue()); + EXPECT_TRUE(response->Deleted); } blobClient.UploadFrom(emptyContent.data(), emptyContent.size()); @@ -795,11 +795,11 @@ namespace Azure { namespace Storage { namespace Test { auto blobClientWithSnapshot = blobClient.WithSnapshot(snapshot); { auto response = blobClientWithSnapshot.DeleteIfExists(); - EXPECT_TRUE(response.HasValue()); + EXPECT_TRUE(response->Deleted); } { auto response = blobClientWithSnapshot.DeleteIfExists(); - EXPECT_FALSE(response.HasValue()); + EXPECT_FALSE(response->Deleted); } } diff --git a/sdk/storage/azure-storage-blobs/test/page_blob_client_test.cpp b/sdk/storage/azure-storage-blobs/test/page_blob_client_test.cpp index 3d385cd2b..160ab716f 100644 --- a/sdk/storage/azure-storage-blobs/test/page_blob_client_test.cpp +++ b/sdk/storage/azure-storage-blobs/test/page_blob_client_test.cpp @@ -264,7 +264,7 @@ namespace Azure { namespace Storage { namespace Test { EXPECT_THROW(blobClientWithoutAuth.CreateIfNotExists(m_blobContent.size()), StorageException); { auto response = blobClient.CreateIfNotExists(m_blobContent.size()); - EXPECT_TRUE(response.HasValue()); + EXPECT_TRUE(response->Created); } auto blobContent @@ -272,7 +272,7 @@ namespace Azure { namespace Storage { namespace Test { blobClient.UploadPages(0, &blobContent); { auto response = blobClient.CreateIfNotExists(m_blobContent.size()); - EXPECT_FALSE(response.HasValue()); + EXPECT_FALSE(response->Created); } auto downloadStream = std::move(blobClient.Download()->BodyStream); EXPECT_EQ(