host/AzureRecoveryLib/resthelper/CloudBlockBlob.h (59 lines of code) (raw):
#ifndef AZURE_REST_STORAGE_CLOUD_BLOCKBLOB_H
#define AZURE_REST_STORAGE_CLOUD_BLOCKBLOB_H
#include "HttpClient.h"
#include <cstdio>
#include <fstream>
#include <ace/OS.h>
#include <boost/shared_ptr.hpp>
#include <boost/thread/mutex.hpp>
#include "../config/LibXmlUtil.h"
namespace AzureStorageRest
{
const blob_size_t AZURE_BLOCK_BLOB_MAX_WRITE_SIZE = 4 * 1024 * 1024; /// 4 MB
const blob_size_t AZURE_BLOCK_BLOB_PARALLEL_UPLOAD_SIZE = 2 * 1024 * 1024; /// 2 MB
class CloudBlockBlob
{
private:
const std::string m_blob_sas;
const std::vector<boost::shared_ptr<HttpClient> > & m_vPtrHttpClient;
const uint8_t m_NumberOfParallelUploads;
// http request timeout in seconds
uint32_t m_timeout;
// http or curl error codes as returned by below layers for upper layer consumption
uint32_t m_last_error;
// http status code as returned by Azure REST API
uint32_t m_http_status_code;
std::string m_http_response_data;
boost::mutex m_mutexLastError;
bool m_bWriteBlockFailed;
boost::shared_ptr<AzureRecovery::XmlDoccument> m_xmldocBlockIds;
uint32_t m_BlockIdsCount;
uint64_t m_totalWriteSize;
const uint32_t m_maxParallelUploadThreads;
const uint64_t m_azureBlockBlobMaxWriteSize;
const uint64_t m_azureBlockBlobParallelUploadSize;
boost::shared_ptr<HttpProxy> m_pProxy;
private:
void WriteBlock(const std::string& blockId,
const char* sData,
const blob_size_t length,
boost::shared_ptr<HttpClient> httpClient);
bool WriteBlockBlobMaxWriteSize(const char* sData, const blob_size_t out_length);
void AddMetadataHeadersToRequest(HttpRequest& request, const metadata_t& metadata);
public:
CloudBlockBlob(const std::string& blobSas,
const std::vector<boost::shared_ptr<HttpClient> >& vPtrHttpClient,
const uint8_t numberOfParallelUploads,
const uint64_t azureBlockBlobParallelUploadSize = AZURE_BLOCK_BLOB_PARALLEL_UPLOAD_SIZE,
const uint64_t azureBlockBlobMaxWriteSize = AZURE_BLOCK_BLOB_MAX_WRITE_SIZE,
const uint32_t maxParallelUploadThreads = 0);
~CloudBlockBlob() {}
bool Write(const char* sData, const blob_size_t out_length);
bool SetMetadata(const metadata_t& metadata); // TODO: override
bool ClearBlockIds();
void SetHttpProxy(const HttpProxy& proxy); // TODO: override
void SetTimeout(const uint32_t& timeout) { m_timeout = timeout; }; // TODO: override
uint32_t GetLastError() { return m_last_error; } // TODO: override
uint32_t GetLastHttpStatusCode() { return m_http_status_code; } // TODO: override
std::string GetLastHttpResponseData() { return m_http_response_data; } // TODO: override
};
}
#endif // ~AZURE_REST_STORAGE_CLOUD_BLOCKBLOB_H
#pragma once