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 unsigned long long direct_io_offset{0};
86 unsigned int d_filter_mask{0};
90 bool linked_block=
false;
91 unsigned int linked_block_index = 0;
97 bool multi_linked_blocks =
false;
98 unsigned int multi_linked_block_index_in_dmrpp_file=0;
100 std::vector<std::pair<unsigned long long,unsigned long long>> mlb_offset_lengths;
102 bool d_uses_fill_value{
false};
103 libdap::Type d_fill_value_type{libdap::dods_null_c};
104 std::vector<std::pair<libdap::Type,int>> compound_udf_type_elms;
105 unsigned int struct_size = 0;
107 std::vector<unsigned long long> d_chunk_position_in_array;
128 bool d_read_buffer_is_mine {
true};
129 unsigned long long d_bytes_read {0};
130 char *d_read_buffer {
nullptr};
131 unsigned long long d_read_buffer_size {0};
132 bool d_is_read {
false};
133 bool d_is_inflated {
false};
134 std::string d_response_content_type;
136 friend class ChunkTest;
137 friend class DmrppCommonTest;
138 friend class MockChunk;
140 unsigned int obtain_compound_udf_type_size()
const;
141 unsigned int get_value_size(libdap::Type);
142 const char* get_value_ptr(
fill_value &,libdap::Type,
const std::string &,
bool);
143 void obtain_fv_strs(
vector<string>& fv_str,
const string &v)
const;
144 void get_compound_fvalue(
const string &v,
vector<char> &compound_fvalue)
const;
148 void _duplicate(
const Chunk &bs)
151 d_offset = bs.d_offset;
152 direct_io_offset = bs.direct_io_offset;
153 d_filter_mask = bs.d_filter_mask;
154 linked_block = bs.linked_block;
155 linked_block_index = bs.linked_block_index;
156 multi_linked_block_index_in_dmrpp_file = bs.multi_linked_block_index_in_dmrpp_file;
157 multi_linked_blocks = bs.multi_linked_blocks;
158 d_data_url = bs.d_data_url;
159 d_byte_order = bs.d_byte_order;
160 d_fill_value = bs.d_fill_value;
161 d_uses_fill_value = bs.d_uses_fill_value;
162 d_query_marker = bs.d_query_marker;
163 d_chunk_position_in_array = bs.d_chunk_position_in_array;
189 Chunk(std::shared_ptr<http::url> data_url, std::string order,
unsigned long long size,
190 unsigned long long offset,
const std::string &pia_str =
"") :
191 d_data_url(std::move(data_url)), d_byte_order(std::move(order)),
192 d_size(size), d_offset(offset)
194#if ENABLE_TRACKING_QUERY_PARAMETER
210 Chunk(std::string order,
unsigned long long size,
unsigned long long offset,
const std::string &pia_str =
"") :
211 d_byte_order(std::move(order)), d_size(size), d_offset(offset) {
212#if ENABLE_TRACKING_QUERY_PARAMETER
218 Chunk(std::shared_ptr<http::url> data_url, std::string order,
unsigned long long size,
219 unsigned long long offset,
bool lb,
unsigned int lblock_index,
const std::string &pia_str =
"") :
220 d_data_url(std::move(data_url)), d_byte_order(std::move(order)),
221 d_size(size), d_offset(offset), linked_block(lb),linked_block_index(lblock_index)
223#if ENABLE_TRACKING_QUERY_PARAMETER
229 Chunk(std::string order,
unsigned long long size,
unsigned long long offset,
230 bool lb,
unsigned int lblock_index,
const std::string &pia_str =
"") :
231 d_byte_order(std::move(order)), d_size(size), d_offset(offset),
232 linked_block(lb), linked_block_index(lblock_index) {
233#if ENABLE_TRACKING_QUERY_PARAMETER
240 Chunk(std::shared_ptr<http::url> data_url, std::string order,
unsigned long long size,
unsigned long long offset,
241 const std::vector<unsigned long long> &pia_vec,
bool is_multi_lb,
unsigned int lb_index) :
242 d_data_url(std::move(data_url)), d_byte_order(std::move(order)),
243 d_size(size), d_offset(offset), multi_linked_blocks(is_multi_lb), multi_linked_block_index_in_dmrpp_file(lb_index) {
244#if ENABLE_TRACKING_QUERY_PARAMETER
250 Chunk(std::string order,
unsigned long long size,
unsigned long long offset,
251 const std::vector<unsigned long long> &pia_vec,
bool is_multi_lb,
unsigned int lb_index) :
252 d_byte_order(std::move(order)),
253 d_size(size), d_offset(offset), multi_linked_blocks(is_multi_lb), multi_linked_block_index_in_dmrpp_file(lb_index) {
254#if ENABLE_TRACKING_QUERY_PARAMETER
261 Chunk(std::shared_ptr<http::url> data_url, std::string order,
262 const std::string &pia_vec,
const std::vector<std::pair<unsigned long long, unsigned long long>> &lb_ol) :
263 d_data_url(std::move(data_url)), d_byte_order(std::move(order))
265#if ENABLE_TRACKING_QUERY_PARAMETER
269 set_multi_linked_offset_length(lb_ol);
270 if (lb_ol.empty()==
false)
271 multi_linked_blocks =
true;
274 Chunk(std::string order,
275 const std::string &pia_vec,
const std::vector<std::pair<unsigned long long, unsigned long long>> &lb_ol) :
276 d_byte_order(std::move(order))
278#if ENABLE_TRACKING_QUERY_PARAMETER
282 set_multi_linked_offset_length(lb_ol);
295 Chunk(std::shared_ptr<http::url> data_url, std::string order,
unsigned long long size,
unsigned long long offset,
296 const std::vector<unsigned long long> &pia_vec) :
297 d_data_url(std::move(data_url)), d_byte_order(std::move(order)),
298 d_size(size), d_offset(offset) {
299#if ENABLE_TRACKING_QUERY_PARAMETER
305 Chunk(std::shared_ptr<http::url> data_url, std::string order,
unsigned long long size,
unsigned long long offset,
306 unsigned int filter_mask,
const std::vector<unsigned long long> &pia_vec) :
307 d_data_url(std::move(data_url)), d_byte_order(std::move(order)),
308 d_size(size), d_offset(offset), d_filter_mask(filter_mask) {
309#if ENABLE_TRACKING_QUERY_PARAMETER
324 Chunk(std::string order,
unsigned long long size,
unsigned long long offset,
325 unsigned int filter_mask,
const std::vector<unsigned long long> &pia_vec) :
326 d_byte_order(std::move(order)), d_size(size), d_offset(offset), d_filter_mask(filter_mask) {
327#if ENABLE_TRACKING_QUERY_PARAMETER
333 Chunk(std::string order,
unsigned long long size,
unsigned long long offset,
334 const std::vector<unsigned long long> &pia_vec) :
335 d_byte_order(std::move(order)), d_size(size), d_offset(offset) {
336#if ENABLE_TRACKING_QUERY_PARAMETER
341 Chunk(std::string order, std::string fill_value, libdap::Type fv_type,
unsigned long long chunk_size, std::vector<unsigned long long> pia) :
342 d_byte_order(std::move(order)), d_fill_value(std::move(fill_value)), d_size(chunk_size),
343 d_uses_fill_value(true), d_fill_value_type(fv_type), d_chunk_position_in_array(std::move(pia)) {
347 Chunk(std::string order, std::string fill_value, libdap::Type fv_type,
unsigned long long size,
348 unsigned long long offset,
const std::string &pia_str =
"") :
349 d_byte_order(std::move(order)),d_fill_value(std::move(fill_value)),
350 d_size(size), d_offset(offset), d_uses_fill_value(true), d_fill_value_type(fv_type)
352#if ENABLE_TRACKING_QUERY_PARAMETER
358 Chunk(std::string order, std::string fill_value, libdap::Type fv_type,
unsigned long long chunk_size, std::vector<unsigned long long> pia,
const std::vector<std::pair<libdap::Type,int>> & compound_udf_type_elms) :
359 d_byte_order(std::move(order)), d_fill_value(std::move(fill_value)), d_size(chunk_size),
360 d_uses_fill_value(true), d_fill_value_type(fv_type), d_chunk_position_in_array(std::move(pia)) {
361 set_compound_udf_info(compound_udf_type_elms);
365 Chunk(std::string order, std::string fill_value, libdap::Type fv_type,
unsigned long long chunk_size, std::vector<unsigned long long> pia,
unsigned int s_size) :
366 d_byte_order(std::move(order)), d_fill_value(std::move(fill_value)), d_size(chunk_size),
367 d_uses_fill_value(true), d_fill_value_type(fv_type), struct_size(s_size),d_chunk_position_in_array(std::move(pia)) {
378 if(d_read_buffer_is_mine)
379 delete[] d_read_buffer;
380 d_read_buffer =
nullptr;
389 if (
this == &rhs)
return *
this;
417 virtual void set_size(
unsigned long long storage_size)
419 d_size = storage_size;
422 virtual unsigned long long get_direct_io_offset()
const
424 return direct_io_offset;
427 virtual void set_direct_io_offset(
unsigned long long dio_offset) {
428 direct_io_offset = dio_offset;
431 virtual unsigned int get_filter_mask()
const
433 return d_filter_mask;
436 virtual bool get_linked_block()
const
441 virtual unsigned int get_linked_block_index()
const
443 return linked_block_index;
446 virtual bool get_multi_linked_blocks()
const
448 return multi_linked_blocks;
451 virtual unsigned int get_multi_linked_block_index_in_dmrpp_file()
const
453 return multi_linked_block_index_in_dmrpp_file;
459 virtual libdap::Type get_fill_value_type()
const {
return d_fill_value_type; }
465 virtual std::shared_ptr<http::url>
get_data_url()
const;
470 d_data_url = std::move(data_url);
473 virtual bool get_read_buffer_is_mine() {
return d_read_buffer_is_mine; }
486 d_bytes_read = bytes_read;
505 if(d_read_buffer_is_mine)
506 delete[] d_read_buffer;
507 d_read_buffer =
new char[d_size];
508 d_read_buffer_size = d_size;
509 d_read_buffer_is_mine =
true;
517 return d_read_buffer;
531 void set_read_buffer(
char *buf,
unsigned long long buf_size,
unsigned long long bytes_read = 0,
532 bool assume_ownership =
true ) {
533 if(d_read_buffer_is_mine)
534 delete[] d_read_buffer;
535 d_read_buffer_is_mine = assume_ownership;
537 d_read_buffer_size = buf_size;
545 return d_read_buffer_size;
551 return d_chunk_position_in_array;
559 void set_multi_linked_offset_length(
const std::vector<std::pair<unsigned long long,unsigned long long>> &lb_offset_lengths){
561 for (
const auto &lb_ol:lb_offset_lengths) {
563 std::pair<unsigned long long,unsigned long long> temp_pair;
564 temp_pair.first = lb_ol.first;
565 temp_pair.second = lb_ol.second;
566 mlb_offset_lengths.push_back(temp_pair);
570 void obtain_multi_linked_offset_length(vector<std::pair<unsigned long long, unsigned long long>> & cur_chunk_lb_offset_length)
const{
572 for (
const auto &lb_ol:mlb_offset_lengths) {
574 std::pair<unsigned long long,unsigned long long> temp_pair;
575 temp_pair.first = lb_ol.first;
576 temp_pair.second = lb_ol.second;
577 cur_chunk_lb_offset_length.push_back(temp_pair);
582 void set_compound_udf_info(
const std::vector<std::pair<libdap::Type,int>> &structure_type_element){
584 for (
const auto &ste:structure_type_element) {
586 std::pair<libdap::Type,int> temp_pair;
587 temp_pair.first = ste.first;
588 temp_pair.second = ste.second;
589 compound_udf_type_elms.push_back(temp_pair);
595 virtual void read_chunk_dio();
598 virtual void filter_chunk(
const std::string &filters,
unsigned long long chunk_size,
unsigned long long elem_width);
600 virtual bool get_is_read() {
return d_is_read; }
601 virtual void set_is_read(
bool state) { d_is_read = state; }
605 static void parse_chunk_position_in_array_string(
const std::string &pia, std::vector<unsigned long long> &pia_vect);
607 virtual void dump(std::ostream & strm)
const;
609 virtual std::string to_string()
const;