Skip to content

Commit f8930ef

Browse files
Merge pull request #97 from jackyding2679/optimize-async-api
optimize async api
2 parents 2a69788 + 2f111b6 commit f8930ef

33 files changed

+1778
-1132
lines changed

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ int main(int argc, char *argv[]) {
296296
// 创建成功
297297
} else {
298298
// 创建存储桶失败,可以调用 CosResult 的成员函数输出错误信息,例如 requestID 等
299-
std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
299+
std::cout << "ErrorInfo=" << result.GetErrorMsg() << std::endl;
300300
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
301301
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
302302
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
@@ -341,7 +341,7 @@ int main(int argc, char *argv[]) {
341341
// 查询存储桶列表成功
342342
} else {
343343
// 查询存储桶列表失败,可以调用 CosResult 的成员函数输出错误信息,比如 requestID 等
344-
std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
344+
std::cout << "ErrorInfo=" << result.GetErrorMsg() << std::endl;
345345
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
346346
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
347347
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
@@ -380,7 +380,7 @@ int main(int argc, char *argv[]) {
380380
// 上传文件成功
381381
} else {
382382
// 上传文件失败,可以调用 CosResult 的成员函数输出错误信息,比如 requestID 等
383-
std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
383+
std::cout << "ErrorInfo=" << result.GetErrorMsg() << std::endl;
384384
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
385385
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
386386
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
@@ -421,7 +421,7 @@ int main(int argc, char *argv[]) {
421421
// 查询对象列表成功
422422
} else {
423423
// 查询对象列表失败,可以调用 CosResult 的成员函数输出错误信息,例如 requestID 等
424-
std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
424+
std::cout << "ErrorInfo=" << result.GetErrorMsg() << std::endl;
425425
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
426426
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
427427
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
@@ -460,7 +460,7 @@ int main(int argc, char *argv[]) {
460460
// 下载文件成功
461461
} else {
462462
// 下载文件失败,可以调用 CosResult 的成员函数输出错误信息,例如 requestID 等
463-
std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
463+
std::cout << "ErrorInfo=" << result.GetErrorMsg() << std::endl;
464464
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
465465
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
466466
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
@@ -496,7 +496,7 @@ int main(int argc, char *argv[]) {
496496
// 删除对象成功
497497
} else {
498498
// 删除对象失败,可以调用 CosResult 的成员函数输出错误信息,例如 requestID 等
499-
std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
499+
std::cout << "ErrorInfo=" << result.GetErrorMsg() << std::endl;
500500
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
501501
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
502502
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;

cos-cpp-sdk.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ static std::string Sign(const std::string& secret_id,
139139

140140
`string GetXCosTraceId()`, 当请求出错时,服务端将会自动为这个错误生成一个唯一的 ID。使用遇到问题时,trace-id能更快地协助 COS 定位问题。当请求出错时,trace-id与request-id一一对应。
141141

142-
`string GetErrorInfo()`, 获取sdk内部错误信息。
142+
`string GetErrorMsg()`, 获取sdk内部错误信息。
143143

144144
`int GetHttpStatus()`, 获取http状态码。
145145

@@ -242,7 +242,7 @@ if (result.IsSucc()) {
242242
std::cout << "Marker=" << resp.GetMarker() << std::endl;
243243
std::cout << "MaxKeys=" << resp.GetMaxKeys() << std::endl;
244244
} else {
245-
std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
245+
std::cout << "ErrorInfo=" << result.GetErrorMsg() << std::endl;
246246
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
247247
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
248248
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
@@ -1509,7 +1509,7 @@ std::string object_name = "object_name";
15091509
do sth
15101510
} else {
15111511
// 调用失败,调用result的成员函数获取错误信息
1512-
std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
1512+
std::cout << "ErrorInfo=" << result.GetErrorMsg() << std::endl;
15131513
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
15141514
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
15151515
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
@@ -1532,7 +1532,7 @@ std::string object_name = "object_name";
15321532
do sth
15331533
} else {
15341534
// 调用失败,调用result的成员函数获取错误信息
1535-
std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
1535+
std::cout << "ErrorInfo=" << result.GetErrorMsg() << std::endl;
15361536
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
15371537
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
15381538
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
@@ -1804,21 +1804,21 @@ Multipart Upload封装了初始化分块上传、分块上传、完成分块上
18041804
#### 方法原型
18051805
18061806
```cpp
1807-
CosResult MultiUploadObject(const MultiUploadObjectReq& request, MultiUploadObjectResp* response);
1807+
CosResult MultiUploadObject(const MultiPutObjectReq& request, MultiPutObjectResp* response);
18081808
```
18091809

18101810
#### 参数说明
18111811

1812-
- req —— MultiUploadObjectReq MultiUploadObject操作的请求
1812+
- req —— MultiPutObjectReq MultiUploadObject操作的请求
18131813

1814-
MultiUploadObjectReq需要在构造的时候指明bucket、object以及待上传文件的本地路径, 如果不指明本地路径,则默认是当前工作路径下与object同名的文件。
1814+
MultiPutObjectReq需要在构造的时候指明bucket、object以及待上传文件的本地路径, 如果不指明本地路径,则默认是当前工作路径下与object同名的文件。
18151815

18161816
``` cpp
1817-
MultiUploadObjectReq(const std::string& bucket_name,
1817+
MultiPutObjectReq(const std::string& bucket_name,
18181818
const std::string& object_name, const std::string& local_file_path = "");
18191819
```
18201820
1821-
- resp —— MultiUploadObjectResp MultiUploadObject操作的返回
1821+
- resp —— MultiPutObjectResp MultiUploadObject操作的返回
18221822
18231823
分块上传成功的情况下,该Response的返回内容与CompleteMultiUploadResp一致。
18241824
分块上传失败的情况下,该Response根据不同的失败情况,返回内容与InitMultiUploadResp、UploadPartDataResp、CompleteMultiUploadResp一致。可调用`GetRespTag()`来获取具体失败在哪一步。
@@ -1831,8 +1831,8 @@ std::string GetRespTag();
18311831
#### 示例
18321832

18331833
``` cpp
1834-
qcloud_cos::MultiUploadObjectReq req( bucket_name, object_name, "/temp/demo_6G.tmp");
1835-
qcloud_cos::MultiUploadObjectResp resp;
1834+
qcloud_cos::MultiPutObjectReq req( bucket_name, object_name, "/temp/demo_6G.tmp");
1835+
qcloud_cos::MultiPutObjectResp resp;
18361836
qcloud_cos::CosResult result = cos.MultiUploadObject(req, &resp);
18371837

18381838
if (result.IsSucc()) {

demo/cos_demo.cpp

Lines changed: 95 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <iostream>
1212
#include <map>
1313
#include <string>
14+
#include <thread>
1415
#include <vector>
1516

1617
#include "cos_api.h"
@@ -23,7 +24,7 @@ void PrintResult(const qcloud_cos::CosResult& result,
2324
if (result.IsSucc()) {
2425
std::cout << resp.DebugString() << std::endl;
2526
} else {
26-
std::cout << "ErrorInfo=" << result.GetErrorInfo() << std::endl;
27+
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
2728
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
2829
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
2930
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
@@ -625,10 +626,10 @@ void CompleteMultiUpload(qcloud_cos::CosAPI& cos,
625626
void MultiUploadObject(qcloud_cos::CosAPI& cos, const std::string& bucket_name,
626627
const std::string& object_name,
627628
const std::string& local_file) {
628-
qcloud_cos::MultiUploadObjectReq req(bucket_name, object_name, local_file);
629+
qcloud_cos::MultiPutObjectReq req(bucket_name, object_name, local_file);
629630
req.SetRecvTimeoutInms(1000 * 60);
630-
qcloud_cos::MultiUploadObjectResp resp;
631-
qcloud_cos::CosResult result = cos.MultiUploadObject(req, &resp);
631+
qcloud_cos::MultiPutObjectResp resp;
632+
qcloud_cos::CosResult result = cos.PutObject(req, &resp);
632633

633634
if (result.IsSucc()) {
634635
std::cout << "MultiUpload Succ." << std::endl;
@@ -662,11 +663,11 @@ void MultiUploadObjectWideChar(qcloud_cos::CosAPI& cos,
662663
const std::string& bucket_name) {
663664
std::string local_file = "./안녕하십니까.mp4";
664665
std::string object_name = "안녕하십니까.mp4";
665-
qcloud_cos::MultiUploadObjectReq req(bucket_name, object_name, local_file);
666+
qcloud_cos::MultiPutObjectReq req(bucket_name, object_name, local_file);
666667
req.SetWideCharPath(); // 需要调用该函数
667668
req.SetRecvTimeoutInms(1000 * 60);
668-
qcloud_cos::MultiUploadObjectResp resp;
669-
qcloud_cos::CosResult result = cos.MultiUploadObject(req, &resp);
669+
qcloud_cos::MultiPutObjectResp resp;
670+
qcloud_cos::CosResult result = cos.PutObject(req, &resp);
670671

671672
if (result.IsSucc()) {
672673
std::cout << "MultiUploadObjectWideChar Succ." << std::endl;
@@ -693,15 +694,15 @@ void MultiUploadObjectLimitTraffic(qcloud_cos::CosAPI& cos,
693694
const std::string& local_file,
694695
const uint64_t traffic_limit,
695696
bool set_header = true) {
696-
qcloud_cos::MultiUploadObjectReq req(bucket_name, object_name, local_file);
697+
qcloud_cos::MultiPutObjectReq req(bucket_name, object_name, local_file);
697698
if (set_header) {
698699
req.SetTrafficLimitByHeader(StringUtil::Uint64ToString(traffic_limit));
699700
} else {
700701
req.SetTrafficLimitByParam(StringUtil::Uint64ToString(traffic_limit));
701702
}
702703
req.SetRecvTimeoutInms(1000 * 60);
703-
qcloud_cos::MultiUploadObjectResp resp;
704-
qcloud_cos::CosResult result = cos.MultiUploadObject(req, &resp);
704+
qcloud_cos::MultiPutObjectResp resp;
705+
qcloud_cos::CosResult result = cos.PutObject(req, &resp);
705706

706707
if (result.IsSucc()) {
707708
std::cout << "MultiUpload Succ." << std::endl;
@@ -1659,88 +1660,118 @@ static void ProgressCallback(uint64_t transferred_size, uint64_t total_size,
16591660
}
16601661
}
16611662

1662-
static void StatusCallback(const std::string& status, void* user_data) {
1663-
qcloud_cos::ObjectReq* req = static_cast<qcloud_cos::ObjectReq*>(user_data);
1664-
std::cout << "ObjectName:" << req->GetObjectName()
1665-
<< ", CurrentStatus:" << status << std::endl;
1663+
static void MultiGetObjectAsyncDoneCallback(const SharedAsyncContext& context,
1664+
void* user_data) {
1665+
std::cout << "MultiGetObjectAsyncDoneCallback, BucketName:"
1666+
<< context->GetBucketName()
1667+
<< ", ObjectName:" << context->GetObjectName()
1668+
<< ", LocalFile:" << context->GetLocalFilePath() << std::endl;
1669+
// qcloud_cos::MultiGetObjectReq对应的响应为qcloud_cos::MultiGetObjectResp
1670+
if (context->GetResult().IsSucc()) {
1671+
// 获取响应
1672+
std::cout << "MultiGetObjectAsync succeed" << std::endl;
1673+
std::cout << "Result:" << context->GetResult().DebugString() << std::endl;
1674+
MultiGetObjectResp resp = context->GetMultiGetObjectResp();
1675+
std::cout << "ETag:" << resp.GetEtag() << std::endl;
1676+
std::cout << "Crc64:" << resp.GetXCosHashCrc64Ecma() << std::endl;
1677+
} else {
1678+
std::cout << "MultiGetObjectAsync failed" << std::endl;
1679+
std::cout << "ErrorMsg:" << context->GetResult().GetErrorMsg() << std::endl;
1680+
}
16661681
}
1667-
16681682
// 异步下载对象,支持更新下载进度
1669-
void GetObjectAsync(qcloud_cos::CosAPI& cos, const std::string& bucket_name,
1670-
const std::string& object_name,
1671-
const std::string& file_path) {
1683+
void MultiGetObjectAsync(qcloud_cos::CosAPI& cos,
1684+
const std::string& bucket_name,
1685+
const std::string& object_name,
1686+
const std::string& file_path) {
16721687
qcloud_cos::MultiGetObjectReq req(bucket_name, object_name, file_path);
1673-
qcloud_cos::MultiGetObjectResp resp;
16741688
// 设置进度回调
16751689
req.SetTransferProgressCallback(&ProgressCallback);
16761690
// 设置状态回调
1677-
req.SetTransferStatusCallback(&StatusCallback);
1691+
req.SetDoneCallback(&MultiGetObjectAsyncDoneCallback);
16781692
// 设置私有数据
1679-
req.SetTransferCallbackUserData(&req);
1693+
req.SetUserData(&req);
16801694

16811695
// 开始下载
1682-
SharedTransferHandler handler = cos.GetObjectAsync(req, &resp);
1696+
SharedAsyncContext context = cos.GetObjectAsync(req);
16831697

16841698
// 等待下载结束
1685-
handler->WaitUntilFinish();
1699+
context->WaitUntilFinish();
16861700

16871701
// 检查结果
1688-
if (handler->m_result.IsSucc()) {
1689-
std::cout << "GetObjectAsync Succ." << std::endl;
1690-
std::cout << "Etag:" << resp.GetEtag() << std::endl;
1691-
std::cout << "ContentLength:" << resp.GetContentLength() << std::endl;
1702+
if (context->GetResult().IsSucc()) {
1703+
// 获取响应
1704+
std::cout << "MultiGetObjectAsync succeed" << std::endl;
1705+
std::cout << "Result:" << context->GetResult().DebugString() << std::endl;
1706+
MultiGetObjectResp resp = context->GetMultiGetObjectResp();
1707+
std::cout << "ETag:" << resp.GetEtag() << std::endl;
1708+
std::cout << "Crc64:" << resp.GetXCosHashCrc64Ecma() << std::endl;
16921709
} else {
1693-
std::cout << "GetObjectAsync Fail." << std::endl;
1694-
std::cout << "ErrorMsg:" << handler->m_result.GetErrorMsg() << std::endl;
1710+
std::cout << "MultiGetObjectAsync failed" << std::endl;
1711+
std::cout << "ErrorMsg:" << context->GetResult().GetErrorMsg() << std::endl;
1712+
}
1713+
std::this_thread::sleep_for(std::chrono::seconds(1));
1714+
}
1715+
1716+
static void MultiPutObjectAsyncDoneCallback(const SharedAsyncContext& context,
1717+
void* user_data) {
1718+
std::cout << "MultiPutObjectAsyncDoneCallback, BucketName:"
1719+
<< context->GetBucketName()
1720+
<< ", ObjectName:" << context->GetObjectName()
1721+
<< ", LocalFile:" << context->GetLocalFilePath() << std::endl;
1722+
// qcloud_cos::MultiPutObjectReq对应的响应为qcloud_cos::MultiPutObjectResp
1723+
if (context->GetResult().IsSucc()) {
1724+
// 获取响应
1725+
std::cout << "MultiPutObjectAsync succeed" << std::endl;
1726+
std::cout << "Result:" << context->GetResult().DebugString() << std::endl;
1727+
MultiPutObjectResp resp = context->GetMultiPutObjectResp();
1728+
std::cout << "Location:" << resp.GetLocation() << std::endl;
1729+
std::cout << "Bucket:" << resp.GetBucket() << std::endl;
1730+
std::cout << "Key:" << resp.GetKey() << std::endl;
1731+
std::cout << "ETag:" << resp.GetEtag() << std::endl;
1732+
std::cout << "Crc64:" << resp.GetXCosHashCrc64Ecma() << std::endl;
1733+
} else {
1734+
std::cout << "MultiGetObjectAsync failed" << std::endl;
1735+
std::cout << "ErrorMsg:" << context->GetResult().GetErrorMsg() << std::endl;
16951736
}
1696-
std::cout << "===================GetObjectAsync============================="
1697-
<< std::endl;
1698-
PrintResult(handler->m_result, resp);
1699-
std::cout << "========================================================"
1700-
<< std::endl;
17011737
}
17021738

17031739
// 异步多上传对象,支持更新上传进度
1704-
void PutObjectAsync(qcloud_cos::CosAPI& cos, const std::string& bucket_name,
1705-
const std::string& object_name,
1706-
const std::string& local_file) {
1707-
qcloud_cos::MultiUploadObjectReq req(bucket_name, object_name, local_file);
1708-
qcloud_cos::MultiUploadObjectResp resp;
1740+
void MultiPutObjectAsync(qcloud_cos::CosAPI& cos,
1741+
const std::string& bucket_name,
1742+
const std::string& object_name,
1743+
const std::string& local_file) {
1744+
qcloud_cos::MultiPutObjectReq req(bucket_name, object_name, local_file);
17091745
req.SetRecvTimeoutInms(1000 * 60);
17101746
// 设置上传进度回调
17111747
req.SetTransferProgressCallback(&ProgressCallback);
17121748
// 设置上传状态回调
1713-
req.SetTransferStatusCallback(&StatusCallback);
1749+
req.SetDoneCallback(&MultiPutObjectAsyncDoneCallback);
17141750
// 设置私有数据
1715-
req.SetTransferCallbackUserData(&req);
1751+
req.SetUserData(&req);
17161752

17171753
// 开始上传
1718-
SharedTransferHandler handler = cos.PutObjectAsync(req, &resp);
1754+
SharedAsyncContext context = cos.PutObjectAsync(req);
17191755

17201756
// 等待上传结束
1721-
handler->WaitUntilFinish();
1757+
std::cout << "wait finish..." << std::endl;
1758+
context->WaitUntilFinish();
17221759

17231760
// 检查结果
1724-
if (handler->m_result.IsSucc()) {
1725-
std::cout << "PutObjectAsync Succ." << std::endl;
1726-
std::cout << "Etag:" << resp.GetEtag() << std::endl;
1761+
if (context->GetResult().IsSucc()) {
1762+
// 获取响应
1763+
std::cout << "MultiPutObjectAsync succeed" << std::endl;
1764+
std::cout << "Result:" << context->GetResult().DebugString() << std::endl;
1765+
MultiPutObjectResp resp = context->GetMultiPutObjectResp();
1766+
std::cout << "Location:" << resp.GetLocation() << std::endl;
1767+
std::cout << "Bucket:" << resp.GetBucket() << std::endl;
1768+
std::cout << "Key:" << resp.GetKey() << std::endl;
1769+
std::cout << "ETag:" << resp.GetEtag() << std::endl;
1770+
std::cout << "Crc64:" << resp.GetXCosHashCrc64Ecma() << std::endl;
17271771
} else {
1728-
std::cout << "PutObjectAsync Fail." << std::endl;
1729-
// 获取具体失败在哪一步
1730-
std::string resp_tag = resp.GetRespTag();
1731-
if ("Init" == resp_tag) {
1732-
// print result
1733-
} else if ("Upload" == resp_tag) {
1734-
// print result
1735-
} else if ("Complete" == resp_tag) {
1736-
// print result
1737-
}
1772+
std::cout << "MultiPutObjectAsync failed" << std::endl;
1773+
std::cout << "ErrorMsg:" << context->GetResult().GetErrorMsg() << std::endl;
17381774
}
1739-
std::cout << "===================PutObjectAsync============================="
1740-
<< std::endl;
1741-
PrintResult(handler->m_result, resp);
1742-
std::cout << "========================================================"
1743-
<< std::endl;
17441775
}
17451776

17461777
// 从目录上传文件
@@ -2600,7 +2631,7 @@ int main(int argc, char** argv) {
26002631
// // Copy(cos, bucket_name, "sevenyou_6G_diff_region_copy_part",
26012632
// "sevenyoutest-123456.cos.ap-beijing-1.myqcloud.com/sevenyou_6G");
26022633

2603-
// //MultiUploadObject(cos, bucket_name, "sevenyou_e2_multi",
2634+
// MultiUploadObject(cos, bucket_name, "test", "/tmp/testfile10GB");
26042635
// "/data/sevenyou/temp/seven_50M.tmp.0925");
26052636
// //MultiUploadObject(cos, bucket_name, "sevenyou_1102_north_multi",
26062637
// "/data/sevenyou/temp/seven_50M.tmp.0925");
@@ -2803,8 +2834,8 @@ int main(int argc, char** argv) {
28032834

28042835
// async
28052836
//{
2806-
// PutObjectAsync(cos, bucket_name, "bigfile", "./bigfile");
2807-
// GetObjectAsync(cos, bucket_name, "bigfile", "./bigfile_download");
2837+
// MultiPutObjectAsync(cos, bucket_name, "bigfile", "./bigfile");
2838+
// MultiGetObjectAsync(cos, bucket_name, "bigfile", "./bigfile_download");
28082839
//}
28092840

28102841
//{

0 commit comments

Comments
 (0)