@@ -502,9 +502,19 @@ void PatchObjectContentType(google::cloud::storage::Client client,
502502
503503void ComposeObject (google::cloud::storage::Client client,
504504 std::vector<std::string> const & argv) {
505+ using ::google::cloud::storage::examples::Usage;
506+ if (argv.size () < 4 ) {
507+ throw Usage{
508+ " compose-object <destination-object-name> "
509+ " <delete-source-objects (true/false)> <object> [object...]" };
510+ }
505511 auto it = argv.cbegin ();
506512 auto bucket_name = *it++;
507513 auto destination_object_name = *it++;
514+ if (*it != " true" && *it != " false" ) {
515+ throw Usage{" delete-source-objects must be either 'true' or 'false'" };
516+ }
517+ auto const delete_source_objects = *it++ == " true" ;
508518 std::vector<google::cloud::storage::ComposeSourceObject> compose_objects;
509519 do {
510520 // NOLINTNEXTLINE(modernize-use-emplace) - brace initialization
@@ -516,18 +526,23 @@ void ComposeObject(google::cloud::storage::Client client,
516526 using ::google::cloud::StatusOr;
517527 [](gcs::Client client, std::string const & bucket_name,
518528 std::string const & destination_object_name,
519- std::vector<gcs::ComposeSourceObject> const & compose_objects) {
529+ std::vector<gcs::ComposeSourceObject> const & compose_objects,
530+ bool delete_source_objects) {
520531 StatusOr<gcs::ObjectMetadata> composed_object = client.ComposeObject (
521- bucket_name, compose_objects, destination_object_name);
532+ bucket_name, compose_objects, destination_object_name,
533+ gcs::DeleteSourceObjects (delete_source_objects));
522534 if (!composed_object) throw std::move (composed_object).status ();
523535
524536 std::cout << " Composed new object " << composed_object->name ()
525537 << " in bucket " << composed_object->bucket ()
526538 << " \n Full metadata: " << *composed_object << " \n " ;
539+ if (delete_source_objects) {
540+ std::cout << " The source objects were deleted.\n " ;
541+ }
527542 }
528543 // ! [compose object] [END storage_compose_file]
529544 (std::move (client), bucket_name, destination_object_name,
530- std::move (compose_objects));
545+ std::move (compose_objects), delete_source_objects );
531546}
532547
533548void ComposeObjectFromMany (google::cloud::storage::Client client,
@@ -735,10 +750,24 @@ void RunAll(std::vector<std::string> const& argv) {
735750 std::cout << " \n Running ComposeObject() example" << std::endl;
736751 auto const composed_object_name =
737752 examples::MakeRandomObjectName (generator, " composed-object-" );
738- ComposeObject (client,
739- {bucket_name, composed_object_name, object_name, object_name});
753+ ComposeObject (client, {bucket_name, composed_object_name, " false " ,
754+ object_name, object_name});
740755 DeleteObject (client, {bucket_name, composed_object_name});
741756
757+ std::cout << " \n Running ComposeObject() with deleteSourceObjects=true example"
758+ << std::endl;
759+ auto const temp_source_1 =
760+ examples::MakeRandomObjectName (generator, " temp-source-1-" );
761+ auto const temp_source_2 =
762+ examples::MakeRandomObjectName (generator, " temp-source-2-" );
763+ InsertObject (client, {bucket_name, temp_source_1, " content1" });
764+ InsertObject (client, {bucket_name, temp_source_2, " content2" });
765+ auto const composed_deleted_sources_object_name =
766+ examples::MakeRandomObjectName (generator, " composed-deleted-sources-" );
767+ ComposeObject (client, {bucket_name, composed_deleted_sources_object_name,
768+ " true" , temp_source_1, temp_source_2});
769+ DeleteObject (client, {bucket_name, composed_deleted_sources_object_name});
770+
742771 std::cout << " \n Running ComposeObjectFromMany() example" << std::endl;
743772 ComposeObjectFromMany (
744773 client, {bucket_name, composed_object_name, object_name, object_name});
@@ -840,7 +869,9 @@ int main(int argc, char* argv[]) {
840869 make_entry (" update-object-metadata" , {" <object-name>" , " <content-type>" },
841870 PatchObjectContentType),
842871 make_entry (" compose-object" ,
843- {" <destination-object-name>" , " <object>" , " [object...]" },
872+ {" <destination-object-name>" ,
873+ " <delete-source-objects (true/false)>" , " <object>" ,
874+ " [object...]" },
844875 ComposeObject),
845876 make_entry (" compose-object-from-many" ,
846877 {" <destination-object-name>" , " <object>" , " [object...]" },
0 commit comments