36#include <libdap/util.h>
45#define S3_TRACKING_CONTEXT "cloudydap"
46#define ENABLE_TRACKING_QUERY_PARAMETER 0
66size_t chunk_header_callback(
char *buffer,
size_t size,
size_t nitems,
void *data);
67size_t chunk_write_data(
void *buffer,
size_t size,
size_t nmemb,
void *data);
69void process_s3_error_response(
const std::shared_ptr<http::url> &data_url,
const std::string &xml_message);
79 std::shared_ptr<http::url> d_data_url;
80 std::string d_query_marker;
81 std::string d_byte_order;
82 std::string d_fill_value;
83 unsigned long long d_size{0};
84 unsigned long long d_offset{0};
85 bool d_uses_fill_value{
false};
86 libdap::Type d_fill_value_type{libdap::dods_null_c};
88 std::vector<unsigned long long> d_chunk_position_in_array;
109 bool d_read_buffer_is_mine {
true};
110 unsigned long long d_bytes_read {0};
111 char *d_read_buffer {
nullptr};
112 unsigned long long d_read_buffer_size {0};
113 bool d_is_read {
false};
114 bool d_is_inflated {
false};
115 std::string d_response_content_type;
117 friend class ChunkTest;
118 friend class DmrppCommonTest;
119 friend class MockChunk;
123 void _duplicate(
const Chunk &bs)
126 d_offset = bs.d_offset;
127 d_data_url = bs.d_data_url;
128 d_byte_order = bs.d_byte_order;
129 d_fill_value = bs.d_fill_value;
130 d_uses_fill_value = bs.d_uses_fill_value;
131 d_query_marker = bs.d_query_marker;
132 d_chunk_position_in_array = bs.d_chunk_position_in_array;
158 Chunk(std::shared_ptr<http::url> data_url, std::string order,
unsigned long long size,
159 unsigned long long offset,
const std::string &pia_str =
"") :
160 d_data_url(std::move(data_url)), d_byte_order(std::move(order)),
161 d_size(size), d_offset(offset)
163#if ENABLE_TRACKING_QUERY_PARAMETER
179 Chunk(std::string order,
unsigned long long size,
unsigned long long offset,
const std::string &pia_str =
"") :
180 d_byte_order(std::move(order)), d_size(size), d_offset(offset) {
181#if ENABLE_TRACKING_QUERY_PARAMETER
197 Chunk(std::shared_ptr<http::url> data_url, std::string order,
unsigned long long size,
unsigned long long offset,
198 const std::vector<unsigned long long> &pia_vec) :
199 d_data_url(std::move(data_url)), d_byte_order(std::move(order)),
200 d_size(size), d_offset(offset) {
201#if ENABLE_TRACKING_QUERY_PARAMETER
218 Chunk(std::string order,
unsigned long long size,
unsigned long long offset,
219 const std::vector<unsigned long long> &pia_vec) :
220 d_byte_order(std::move(order)), d_size(size), d_offset(offset) {
221#if ENABLE_TRACKING_QUERY_PARAMETER
227 Chunk(std::string order, std::string
fill_value, libdap::Type fv_type,
unsigned long long chunk_size, std::vector<unsigned long long> pia) :
228 d_byte_order(std::move(order)), d_fill_value(std::move(
fill_value)), d_size(chunk_size),
229 d_uses_fill_value(true), d_fill_value_type(fv_type), d_chunk_position_in_array(std::move(pia)) {
239 if(d_read_buffer_is_mine)
240 delete[] d_read_buffer;
241 d_read_buffer =
nullptr;
250 if (
this == &rhs)
return *
this;
285 virtual std::shared_ptr<http::url>
get_data_url()
const;
290 d_data_url = std::move(data_url);
305 d_bytes_read = bytes_read;
324 if(d_read_buffer_is_mine)
325 delete[] d_read_buffer;
327 d_read_buffer =
new char[d_size];
328 d_read_buffer_size = d_size;
329 d_read_buffer_is_mine =
true;
337 return d_read_buffer;
351 void set_read_buffer(
char *buf,
unsigned long long buf_size,
unsigned long long bytes_read = 0,
352 bool assume_ownership =
true ) {
353 if(d_read_buffer_is_mine)
354 delete[] d_read_buffer;
356 d_read_buffer_is_mine = assume_ownership;
358 d_read_buffer_size = buf_size;
366 return d_read_buffer_size;
372 return d_chunk_position_in_array;
383 virtual void filter_chunk(
const std::string &filters,
unsigned long long chunk_size,
unsigned long long elem_width);
385 virtual bool get_is_read() {
return d_is_read; }
386 virtual void set_is_read(
bool state) { d_is_read = state; }
390 static void parse_chunk_position_in_array_string(
const std::string &pia, std::vector<unsigned long long> &pia_vect);
392 virtual void dump(std::ostream & strm)
const;
394 virtual std::string to_string()
const;
virtual void set_bytes_read(unsigned long long bytes_read)
Set the size of this Chunk's data block.
virtual void dump(std::ostream &strm) const
Chunk(std::string order, unsigned long long size, unsigned long long offset, const std::string &pia_str="")
Get a chunk initialized with values, the data URL will not be set.
virtual char * get_rbuf()
virtual void read_chunk()
void add_tracking_query_param()
Modify this chunk's data URL so that it includes tracking info.
virtual std::string get_response_content_type()
Get the response type of the last response.
virtual std::string get_byte_order()
virtual std::string get_curl_range_arg_string()
Returns a curl range argument. The libcurl requires a string argument for range-ge activitys,...
virtual std::shared_ptr< http::url > get_data_url() const
Chunk(std::shared_ptr< http::url > data_url, std::string order, unsigned long long size, unsigned long long offset, const std::string &pia_str="")
Get a chunk initialized with values.
Chunk(std::string order, unsigned long long size, unsigned long long offset, const std::vector< unsigned long long > &pia_vec)
Get a chunk initialized with values, the data URl will not be set.
virtual void set_data_url(std::shared_ptr< http::url > data_url)
Set the data url for this Chunk's data block.
virtual std::string get_fill_value() const
Chunk & operator=(const Chunk &rhs)
virtual void set_rbuf_to_size()
Allocates the internal read buffer to be d_size bytes.
virtual unsigned long long get_offset() const
virtual unsigned long long get_bytes_read() const
void set_position_in_array(const std::string &pia)
parse the chunk position string
virtual unsigned long long get_rbuf_size() const
virtual unsigned long long get_size() const
Chunk()=default
Get an empty chunk.
Chunk(std::shared_ptr< http::url > data_url, std::string order, unsigned long long size, unsigned long long offset, const std::vector< unsigned long long > &pia_vec)
Get a chunk initialized with values.
virtual const std::vector< unsigned long long > & get_position_in_array() const
virtual bool get_uses_fill_value() const
void set_read_buffer(char *buf, unsigned long long buf_size, unsigned long long bytes_read=0, bool assume_ownership=true)
Set the target read buffer for this chunk.
virtual void filter_chunk(const std::string &filters, unsigned long long chunk_size, unsigned long long elem_width)
filter data in the chunk
virtual void load_fill_values()
Load the chunk with fill values - temporary implementation.
void set_response_content_type(const std::string &ct)
Set the response type of the last response.