Skip to content

Commit

Permalink
Support metadata feature in cpp interface
Browse files Browse the repository at this point in the history
  • Loading branch information
MorvenH committed Jun 10, 2018
1 parent 762abeb commit 3aaf85c
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 0 deletions.
7 changes: 7 additions & 0 deletions docs/sdk_cpp_style_usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,13 @@ objectStream->seekg(0, objectStream->beg);
input.SetBody(objectStream);
input.SetContentLength(streamSize);

// if you want to add custom metadata header to request, please
// refer to 'https://docs.qingcloud.com/qingstor/api/common/metadat
// 'uid' here is taken as an example of custom metadata.
std::map<std::string, std::string> metadata;
metadata["uid"] = "qingstor";
input.SetMetadata(metadata);

QsError err = qsBucket.PutObject(objectKey, input, output);
if (QsError::QS_ERR_NO_ERROR == err)
{
Expand Down
59 changes: 59 additions & 0 deletions include/qingstor/Bucket.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,8 @@
// Range of response data content'flag
#define SETTING_OUTPUT_GET_OBJECT_CONTENT_RANGE_FLAG 0x800

#define SETTING_OUTPUT_GET_OBJECT_X_QS_METADATA_FLAG 0x1000

// Check whether the object has not been modified'flag
#define SETTING_INPUT_HEAD_OBJECT_IF_UNMODIFIED_SINCE_FLAG 0x1

Expand Down Expand Up @@ -322,6 +324,8 @@
// Encryption algorithm of the object'flag
#define SETTING_OUTPUT_HEAD_OBJECT_X_QS_ENCRYPTION_CUSTOMER_ALGORITHM_FLAG 0x20

#define SETTING_OUTPUT_HEAD_OBJECT_X_QS_METADATA_FLAG 0x40

// Specified the Content-Encoding response header'flag
#define SETTING_INPUT_IMAGE_PROCESS_RESPONSE_CONTENT_ENCODING_FLAG 0x1

Expand Down Expand Up @@ -365,6 +369,9 @@
// XQSStorageClass's available values: STANDARD, STANDARD_IA
#define SETTING_INPUT_INITIATE_MULTIPART_UPLOAD_X_QS_STORAGE_CLASS_FLAG 0x10

// custom meta data'flag
#define SETTING_INPUT_INITIATE_MULTIPART_UPLOAD_X_QS_METADATA_FLAG 0x20

// Encryption algorithm of the object'flag
#define SETTING_OUTPUT_INITIATE_MULTIPART_UPLOAD_X_QS_ENCRYPTION_CUSTOMER_ALGORITHM_FLAG 0x1

Expand Down Expand Up @@ -474,6 +481,9 @@
// Encryption key of the object'flag
#define SETTING_INPUT_PUT_OBJECT_X_QS_ENCRYPTION_CUSTOMER_KEY_FLAG 0x40000

// custom meta data'flag
#define SETTING_INPUT_PUT_OBJECT_X_QS_METADATA_FLAG 0x80000

// MD5sum of the object'flag
#define SETTING_OUTPUT_PUT_OBJECT_ETAG_FLAG 0x1

Expand Down Expand Up @@ -1789,6 +1799,16 @@ class QS_SDK_API InitiateMultipartUploadInput:public QsInput
return m_XQSStorageClass;
};

inline std::map<std::string, std::string> GetMetadata()
{
return m_metadata;
};

inline void SetMetadata(const std::map<std::string, std::string>& value) {
m_settingFlag |= SETTING_INPUT_INITIATE_MULTIPART_UPLOAD_X_QS_METADATA_FLAG;
m_metadata = value;
}

private:
// Object content type
std::string m_ContentType;
Expand All @@ -1806,6 +1826,9 @@ class QS_SDK_API InitiateMultipartUploadInput:public QsInput
// XQSStorageClass's available values: STANDARD, STANDARD_IA
std::string m_XQSStorageClass;

// Object metadata
std::map<std::string, std::string> m_metadata;

};
// ListMultipartInput presents input for ListMultipart.
class QS_SDK_API ListMultipartInput:public QsInput
Expand Down Expand Up @@ -2246,6 +2269,17 @@ class QS_SDK_API PutObjectInput:public QsInput
{
m_streambody = streambody;
};

inline std::map<std::string, std::string> GetMetadata()
{
return m_metadata;
};

void SetMetadata(const std::map<std::string, std::string>& value) {
m_settingFlag |= SETTING_INPUT_PUT_OBJECT_X_QS_METADATA_FLAG;
m_metadata = value;
}

private:
// Object content size
int64_t m_ContentLength; // Required
Expand Down Expand Up @@ -2306,6 +2340,8 @@ class QS_SDK_API PutObjectInput:public QsInput
std::string m_XQSStorageClass;

std::iostream * m_streambody;

std::map<std::string, std::string> m_metadata;
};
// UploadMultipartInput presents input for UploadMultipart.
class QS_SDK_API UploadMultipartInput:public QsInput
Expand Down Expand Up @@ -3500,6 +3536,16 @@ class QS_SDK_API GetObjectOutput:public QsOutput
m_streambody = streambody;
};

inline void SetMetadata(const std::map<std::string, std::string>& value) {
m_settingFlag |= SETTING_OUTPUT_GET_OBJECT_X_QS_METADATA_FLAG;
m_metadata = value;
}

inline std::map<std::string, std::string> GetMetadata()
{
return m_metadata;
};

private:
// The Cache-Control general-header field is used to specify directives for caching mechanisms in both requests and responses.
std::string m_CacheControl;
Expand Down Expand Up @@ -3538,6 +3584,8 @@ class QS_SDK_API GetObjectOutput:public QsOutput

std::iostream * m_streambody;

std::map<std::string, std::string> m_metadata;

};

// HeadObjectOutput presents input for HeadObject.
Expand Down Expand Up @@ -3628,6 +3676,16 @@ class QS_SDK_API HeadObjectOutput:public QsOutput
return m_XQSStorageClass;
};

inline std::map<std::string, std::string> GetMetadata()
{
return m_metadata;
};

inline void SetMetadata(const std::map<std::string, std::string>& value) {
m_settingFlag |= SETTING_OUTPUT_HEAD_OBJECT_X_QS_METADATA_FLAG;
m_metadata = value;
}

private:
// Object content length
int64_t m_ContentLength;
Expand All @@ -3646,6 +3704,7 @@ class QS_SDK_API HeadObjectOutput:public QsOutput
// Storage class of the object
std::string m_XQSStorageClass;

std::map<std::string, std::string> m_metadata;
};

// ImageProcessOutput presents input for ImageProcess.
Expand Down
8 changes: 8 additions & 0 deletions samples/samples_sdk_cpp/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ void ShowHow2Do_InitiateMultipartUpload(Bucket * qsBucket, std::string &objectke
InitiateMultipartUploadOutput output;
// If you want to specify the storage type, Call SetXQSStorageClass fun.
input.SetXQSStorageClass("STANDARD_IA");
std::map<std::string, std::string> metadata;
metadata["uid"] = "qingstor";
input.SetMetadata(metadata);

QsError err = qsBucket->InitiateMultipartUpload (objectkey, input, output);
if (QS_ERR_NO_ERROR == err)
{
Expand Down Expand Up @@ -233,6 +237,10 @@ void ShowHow2Do_GetObject(Bucket * qsBucket, std::string &objectkey)
printf("The length of object is : %ld\n" , streamSize);
std::string strStorageClassInfo = "The storage class of object is : " + output.GetXQSStorageClass();
printf("The storage class of object is : %s\n" , strStorageClassInfo.c_str());
std::map<std::string, std::string> metadata = output.GetMetadata();
std::string strMetadataUid= "The metadata uid of object is : " + metadata["uid"];
printf("The storage class of object is : %s\n" , strMetadataUid.c_str());

return;
}

Expand Down
52 changes: 52 additions & 0 deletions src/service/Bucket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1507,6 +1507,19 @@ void GetObjectUnparker::ParseResponseHeaders(const Http::
{
m_output->SetXQSStorageClass(XQSStorageClassIter->second);
}

std::size_t prefixSize = sizeof("x-qs-meta-") - 1; //subtract the NULL terminator out
std::map<std::string, std::string> metadata;
for(HeaderValueCollection::const_iterator it = headers.begin(); it != headers.end(); it++)
{
std::size_t foundPrefix = it->first.find("x-qs-meta-");
if(foundPrefix != std::string::npos)
{
std::string key = it->first.substr(prefixSize);
metadata[key] = it->second;
}
}
m_output->SetMetadata(metadata);
}

void GetObjectUnparker::ParseResponseBody(std::iostream * responseBody)
Expand Down Expand Up @@ -1684,6 +1697,19 @@ void HeadObjectUnparker::ParseResponseHeaders(const Http::
{
m_output->SetXQSStorageClass(XQSStorageClassIter->second);
}

std::size_t prefixSize = sizeof("x-qs-meta-") - 1; //subtract the NULL terminator out
std::map < std::string, std::string> metadata;
for(HeaderValueCollection::const_iterator it = headers.begin(); it != headers.end(); it++)
{
std::size_t foundPrefix = it->first.find("x-qs-meta-");
if(foundPrefix != std::string::npos)
{
std::string key = it->first.substr(prefixSize);
metadata[key] = it->second;
}
}
m_output->SetMetadata(metadata);
}

class ImageProcessBuilder:public QsDefaultRequestBuilder < ImageProcessInput >
Expand Down Expand Up @@ -1934,6 +1960,19 @@ GetHeaderValueCollection()
headers.insert(Http::HeaderValuePair("X-QS-Storage-Class", ss.str()));
ss.str("");
}

if (m_input->
IsPropHasBeenSet
(SETTING_INPUT_INITIATE_MULTIPART_UPLOAD_X_QS_METADATA_FLAG))
{
std::map<std::string, std::string> metadata = m_input->GetMetadata();
for(std::map<std::string, std::string>::iterator it = metadata.begin(); it != metadata.end(); it++)
{
ss << "x-qs-meta-" << it->first;
headers.insert(Http::HeaderValuePair(ss.str(), it->second));
ss.str("");
}
}
return headers;
}

Expand Down Expand Up @@ -2460,6 +2499,19 @@ Http::HeaderValueCollection PutObjectBuilder::GetHeaderValueCollection()
headers.insert(Http::HeaderValuePair("X-QS-Storage-Class", ss.str()));
ss.str("");
}

if (m_input->
IsPropHasBeenSet(SETTING_INPUT_PUT_OBJECT_X_QS_METADATA_FLAG))
{
std::map<std::string, std::string> metadata = m_input->GetMetadata();
for(std::map<std::string, std::string>::iterator it = metadata.begin(); it != metadata.end(); it++)
{
ss << "x-qs-meta-" << it->first;
headers.insert(Http::HeaderValuePair(ss.str(), it->second));
ss.str("");
}
}

return headers;
}

Expand Down

0 comments on commit 3aaf85c

Please sign in to comment.