mirror of
https://github.com/minio/minio-cpp.git
synced 2025-07-30 05:23:05 +03:00
Add support to progress function to abort operation (#128)
Signed-off-by: Bala.FA <bala@minio.io>
This commit is contained in:
@ -37,7 +37,7 @@ int main() {
|
|||||||
<< std::endl;
|
<< std::endl;
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> void {
|
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> bool {
|
||||||
if (args.download_speed > 0) {
|
if (args.download_speed > 0) {
|
||||||
std::cout << "downloaded speed: " << (long)args.download_speed << " bps"
|
std::cout << "downloaded speed: " << (long)args.download_speed << " bps"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
@ -45,6 +45,7 @@ int main() {
|
|||||||
std::cout << "downloaded: " << (long)args.downloaded_bytes << " bytes of "
|
std::cout << "downloaded: " << (long)args.downloaded_bytes << " bytes of "
|
||||||
<< (long)args.download_total_bytes << " bytes" << std::endl;
|
<< (long)args.download_total_bytes << " bytes" << std::endl;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Call get object.
|
// Call get object.
|
||||||
|
@ -43,7 +43,7 @@ int main() {
|
|||||||
minio::s3::PutObjectArgs args(file, 47615315, 15728640);
|
minio::s3::PutObjectArgs args(file, 47615315, 15728640);
|
||||||
args.bucket = "my-bucket";
|
args.bucket = "my-bucket";
|
||||||
args.object = "my-object";
|
args.object = "my-object";
|
||||||
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> void {
|
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> bool {
|
||||||
if (args.upload_speed > 0) {
|
if (args.upload_speed > 0) {
|
||||||
std::cout << "uploaded speed: " << (long)args.upload_speed << " bps"
|
std::cout << "uploaded speed: " << (long)args.upload_speed << " bps"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
@ -51,6 +51,7 @@ int main() {
|
|||||||
std::cout << "uploaded: " << (long)args.uploaded_bytes << " bytes of "
|
std::cout << "uploaded: " << (long)args.uploaded_bytes << " bytes of "
|
||||||
<< (long)args.upload_total_bytes << " bytes" << std::endl;
|
<< (long)args.upload_total_bytes << " bytes" << std::endl;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Call put object.
|
// Call put object.
|
||||||
|
@ -69,7 +69,7 @@ using DataFunction = std::function<bool(DataFunctionArgs)>;
|
|||||||
|
|
||||||
struct ProgressFunctionArgs;
|
struct ProgressFunctionArgs;
|
||||||
|
|
||||||
using ProgressFunction = std::function<void(ProgressFunctionArgs)>;
|
using ProgressFunction = std::function<bool(ProgressFunctionArgs)>;
|
||||||
|
|
||||||
struct Response;
|
struct Response;
|
||||||
|
|
||||||
|
@ -484,21 +484,21 @@ PutObjectResponse Client::PutObject(PutObjectArgs args, std::string& upload_id,
|
|||||||
[&object_size = object_size, &uploaded_bytes = uploaded_bytes,
|
[&object_size = object_size, &uploaded_bytes = uploaded_bytes,
|
||||||
&upload_speed = upload_speed, &progressfunc = args.progressfunc,
|
&upload_speed = upload_speed, &progressfunc = args.progressfunc,
|
||||||
&progress_userdata = args.progress_userdata](
|
&progress_userdata = args.progress_userdata](
|
||||||
http::ProgressFunctionArgs args) -> void {
|
http::ProgressFunctionArgs args) -> bool {
|
||||||
if (args.upload_speed > 0) {
|
if (args.upload_speed > 0) {
|
||||||
if (upload_speed == -1) {
|
if (upload_speed == -1) {
|
||||||
upload_speed = args.upload_speed;
|
upload_speed = args.upload_speed;
|
||||||
} else {
|
} else {
|
||||||
upload_speed = (upload_speed + args.upload_speed) / 2;
|
upload_speed = (upload_speed + args.upload_speed) / 2;
|
||||||
}
|
}
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
http::ProgressFunctionArgs actual_args;
|
http::ProgressFunctionArgs actual_args;
|
||||||
actual_args.upload_total_bytes = static_cast<double>(object_size);
|
actual_args.upload_total_bytes = static_cast<double>(object_size);
|
||||||
actual_args.uploaded_bytes = uploaded_bytes + args.uploaded_bytes;
|
actual_args.uploaded_bytes = uploaded_bytes + args.uploaded_bytes;
|
||||||
actual_args.userdata = progress_userdata;
|
actual_args.userdata = progress_userdata;
|
||||||
progressfunc(actual_args);
|
return progressfunc(actual_args);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (args.sse != nullptr) {
|
if (args.sse != nullptr) {
|
||||||
@ -514,7 +514,10 @@ PutObjectResponse Client::PutObject(PutObjectArgs args, std::string& upload_id,
|
|||||||
actual_args.upload_total_bytes = static_cast<double>(object_size);
|
actual_args.upload_total_bytes = static_cast<double>(object_size);
|
||||||
actual_args.uploaded_bytes = uploaded_bytes;
|
actual_args.uploaded_bytes = uploaded_bytes;
|
||||||
actual_args.userdata = args.progress_userdata;
|
actual_args.userdata = args.progress_userdata;
|
||||||
args.progressfunc(actual_args);
|
if (!args.progressfunc(actual_args)) {
|
||||||
|
return UploadPartResponse(
|
||||||
|
error::Error("aborted by progress function"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
parts.push_back(Part(part_number, std::move(resp.etag)));
|
parts.push_back(Part(part_number, std::move(resp.etag)));
|
||||||
} else {
|
} else {
|
||||||
@ -533,6 +536,7 @@ PutObjectResponse Client::PutObject(PutObjectArgs args, std::string& upload_id,
|
|||||||
http::ProgressFunctionArgs actual_args;
|
http::ProgressFunctionArgs actual_args;
|
||||||
actual_args.upload_speed = upload_speed;
|
actual_args.upload_speed = upload_speed;
|
||||||
actual_args.userdata = args.progress_userdata;
|
actual_args.userdata = args.progress_userdata;
|
||||||
|
// ignore the return value as we completed the upload
|
||||||
args.progressfunc(actual_args);
|
args.progressfunc(actual_args);
|
||||||
}
|
}
|
||||||
return PutObjectResponse(resp);
|
return PutObjectResponse(resp);
|
||||||
@ -792,6 +796,8 @@ UploadObjectResponse Client::UploadObject(UploadObjectArgs args) {
|
|||||||
po_args.retention = std::move(args.retention);
|
po_args.retention = std::move(args.retention);
|
||||||
po_args.legal_hold = std::move(args.legal_hold);
|
po_args.legal_hold = std::move(args.legal_hold);
|
||||||
po_args.content_type = std::move(args.content_type);
|
po_args.content_type = std::move(args.content_type);
|
||||||
|
po_args.progressfunc = std::move(args.progressfunc);
|
||||||
|
po_args.progress_userdata = std::move(args.progress_userdata);
|
||||||
|
|
||||||
PutObjectResponse resp = PutObject(std::move(po_args));
|
PutObjectResponse resp = PutObject(std::move(po_args));
|
||||||
file.close();
|
file.close();
|
||||||
|
@ -411,8 +411,10 @@ Response Request::execute() {
|
|||||||
args.upload_total_bytes = ultotal;
|
args.upload_total_bytes = ultotal;
|
||||||
args.uploaded_bytes = ulnow;
|
args.uploaded_bytes = ulnow;
|
||||||
args.userdata = progress_userdata;
|
args.userdata = progress_userdata;
|
||||||
progressfunc(args);
|
if (progressfunc(args)) {
|
||||||
return CURL_PROGRESSFUNC_CONTINUE;
|
return CURL_PROGRESSFUNC_CONTINUE;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
};
|
};
|
||||||
if (progressfunc != nullptr) {
|
if (progressfunc != nullptr) {
|
||||||
request.setOpt(new curlpp::options::NoProgress(false));
|
request.setOpt(new curlpp::options::NoProgress(false));
|
||||||
|
Reference in New Issue
Block a user