Skip to content

Commit 61bf970

Browse files
committed
Add Data_Detail class
1 parent 015594d commit 61bf970

32 files changed

+407
-271
lines changed

src/Column.hxx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@ public:
4343

4444
Column(const std::string &name, const Data_Type &type) : Column(name, type, 1) {}
4545

46-
47-
inline size_t get_data_size() const {
48-
return tablator::data_size(type_) * array_size_;
49-
}
50-
5146
// accessors
5247
inline const std::string &get_name() const { return name_; }
5348
inline const Data_Type &get_type() const { return type_; }
@@ -85,6 +80,10 @@ public:
8580
inline bool get_dynamic_array_flag() const { return dynamic_array_flag_; }
8681
inline void set_dynamic_array_flag(bool b) { dynamic_array_flag_ = b; }
8782

83+
inline size_t get_data_size() const {
84+
return tablator::data_size(type_) * array_size_;
85+
}
86+
8887
private:
8988
std::string name_;
9089
Data_Type type_;

src/Common.hxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ static const std::string PARAMREF("PARAMref");
6464
static const std::string QUERY_STATUS("QUERY_STATUS");
6565
static const std::string REF("ref");
6666
static const std::string RESOURCE("RESOURCE");
67+
static const std::string STREAM("STREAM");
6768
static const std::string TABLE("TABLE");
6869
static const std::string TABLEDATA("TABLEDATA");
6970
static const std::string TIMESYS("TIMESYS");

src/Data_Details.hxx

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#pragma once
2+
3+
#include "Common.hxx"
4+
#include "Field_Framework.hxx"
5+
#include "Row.hxx"
6+
7+
namespace tablator {
8+
9+
class Data_Details {
10+
public:
11+
Data_Details(size_t row_size, size_t num_rows = 0) : row_size_(row_size) {
12+
init(num_rows);
13+
}
14+
15+
Data_Details(const Field_Framework &field_framework, size_t num_rows = 0)
16+
: Data_Details(field_framework.get_row_size(), num_rows) {}
17+
18+
19+
void append_row(const Row &row) {
20+
assert(row.get_data().size() == get_row_size());
21+
data_.reserve(data_.size() + row.get_data().size());
22+
data_.insert(data_.end(), row.get_data().begin(), row.get_data().end());
23+
}
24+
25+
26+
void append_rows(const Data_Details &other) {
27+
assert(other.get_row_size() == get_row_size());
28+
29+
data_.reserve(data_.size() + other.get_data().size());
30+
data_.insert(data_.end(), other.get_data().begin(), other.get_data().end());
31+
}
32+
33+
void adjust_num_rows(const size_t new_num_rows) {
34+
data_.resize(new_num_rows * get_row_size());
35+
}
36+
37+
void reserve_rows(const size_t &new_num_rows) {
38+
data_.reserve(get_row_size() * new_num_rows);
39+
}
40+
41+
// accessors
42+
43+
size_t get_data_size() const { return data_.size(); }
44+
45+
size_t get_num_rows() const {
46+
if (get_row_size() == 0) {
47+
return 0;
48+
}
49+
return get_data_size() / get_row_size();
50+
};
51+
52+
inline size_t get_row_size() const { return row_size_; }
53+
54+
inline const std::vector<uint8_t> &get_data() const { return data_; }
55+
56+
// Non-const to support append_rows().
57+
inline std::vector<uint8_t> &get_data() { return data_; }
58+
59+
inline void set_data(const std::vector<uint8_t> &d) { data_ = d; }
60+
61+
62+
private:
63+
void init(const size_t &new_num_rows) {
64+
reserve_rows(new_num_rows);
65+
}
66+
67+
// Can't be const because of append_rows().
68+
std::vector<uint8_t> data_;
69+
size_t row_size_;
70+
};
71+
72+
} // namespace tablator

src/Data_Element.hxx

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,30 @@
11
#pragma once
22

33
#include "Column.hxx"
4+
#include "Data_Details.hxx"
45
#include "Field_Framework.hxx"
56

67
namespace tablator {
78

89
class Data_Element {
910
public:
1011
Data_Element(const Field_Framework &field_framework,
11-
const std::vector<uint8_t> &data)
12-
: field_framework_(field_framework), data_(data) {}
13-
14-
Data_Element(const Field_Framework &field_framework)
15-
: Data_Element(field_framework, std::vector<uint8_t>()) {}
12+
const Data_Details &data_details)
13+
: field_framework_(field_framework), data_details_(data_details) {}
1614

15+
Data_Element(const Field_Framework &field_framework, size_t num_rows = 0)
16+
: Data_Element(field_framework, Data_Details(field_framework, num_rows)) {}
1717

1818
// accessors
1919
const Field_Framework &get_field_framework() const { return field_framework_; }
2020

2121
Field_Framework &get_field_framework() { return field_framework_; }
2222

2323

24+
const Data_Details &get_data_details() const { return data_details_; }
25+
26+
Data_Details &get_data_details() { return data_details_; }
27+
2428
inline const std::vector<Column> &get_columns() const {
2529
return field_framework_.get_columns();
2630
}
@@ -33,37 +37,31 @@ public:
3337
}
3438

3539
size_t get_row_size() const { return field_framework_.get_row_size(); }
40+
size_t get_num_rows() const { return data_details_.get_num_rows(); }
3641

37-
size_t get_num_rows() const {
38-
if (get_row_size() == 0) {
39-
return 0;
40-
}
41-
return data_.size() / get_row_size();
42+
void adjust_num_rows(const size_t &new_num_rows) {
43+
data_details_.adjust_num_rows(new_num_rows);
4244
}
4345

44-
// called by query_server to trim result set
45-
void resize_data(size_t &new_num_rows) {
46-
data_.resize(get_row_size() * new_num_rows);
46+
void reserve_rows(const size_t &new_num_rows) {
47+
get_data_details().reserve_rows(new_num_rows);
4748
}
4849

49-
void reserve_data(size_t &new_num_rows) {
50-
data_.reserve(get_row_size() * new_num_rows);
50+
inline const std::vector<uint8_t> &get_data() const {
51+
return data_details_.get_data();
5152
}
5253

53-
54-
inline const std::vector<uint8_t> &get_data() const { return data_; }
55-
5654
// Non-const to support append_rows().
57-
inline std::vector<uint8_t> &get_data() { return data_; }
55+
inline std::vector<uint8_t> &get_data() { return data_details_.get_data(); }
5856

59-
inline void set_data(const std::vector<uint8_t> &d) { data_ = d; }
57+
inline void set_data(const std::vector<uint8_t> &d) { data_details_.set_data(d); }
6058

6159
private:
6260
// Non-const to allow query_server to update column's field_properties.
6361
Field_Framework field_framework_;
6462

6563
// Non-const because of append_rows().
66-
std::vector<uint8_t> data_;
64+
Data_Details data_details_;
6765
};
6866

6967
} // namespace tablator

src/Field_Framework.hxx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ public:
4646
inline const std::vector<size_t> &get_offsets() const { return offsets_; }
4747
inline std::vector<size_t> &get_offsets() { return offsets_; }
4848

49-
5049
private:
5150
void append_column(const Column &column) {
5251
columns_.emplace_back(column);

src/Resource_Element.hxx

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,16 @@ public:
381381
return get_main_table_element().get_field_framework();
382382
}
383383

384+
385+
const Data_Details &get_data_details() const {
386+
return get_main_table_element().get_data_details();
387+
}
388+
389+
Data_Details &get_data_details() {
390+
return get_main_table_element().get_data_details();
391+
}
392+
393+
384394
const std::vector<Column> &get_columns() const {
385395
return get_main_table_element().get_columns();
386396
}
@@ -397,13 +407,12 @@ public:
397407
size_t get_num_rows() const { return get_main_table_element().get_num_rows(); }
398408

399409
// called by query_server to trim result set
400-
void resize_data(size_t &new_num_rows) {
401-
get_main_table_element().resize_data(new_num_rows);
410+
void adjust_num_rows(const size_t &new_num_rows) {
411+
get_main_table_element().adjust_num_rows(new_num_rows);
402412
}
403413

404-
// called by query_server to trim result set
405-
void reserve_data(size_t &new_num_rows) {
406-
get_main_table_element().reserve_data(new_num_rows);
414+
void reserve_rows(const size_t &new_num_rows) {
415+
get_main_table_element().reserve_rows(new_num_rows);
407416
}
408417

409418
std::vector<Field> &get_table_element_params() {

src/Row.hxx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,25 @@
33
#include <cassert>
44
#include <vector>
55

6+
#include "Common.hxx"
67
#include "Data_Type.hxx"
7-
#include "unsafe_copy_to_row.hxx"
88

99
namespace tablator {
1010
class Row {
1111
public:
12-
Row(const size_t &size) : data_(size) {}
12+
Row(const size_t &data_size) : data_(data_size) {}
1313

1414
void fill_with_zeros() { std::fill(data_.begin(), data_.end(), 0); }
1515

16-
void insert_null(const Data_Type &type, const size_t &array_size,
17-
const size_t &col_idx, const size_t &offset,
18-
const size_t &offset_end);
16+
void insert_null(Data_Type type, const size_t &array_size, const size_t &col_idx,
17+
const size_t &offset, const size_t &offset_end);
1918

2019
template <typename T>
2120
void insert(const T &element, const size_t &offset) {
2221
assert(offset + sizeof(T) <= data_.size());
23-
unsafe_copy_to_row(element, offset, data_.data());
22+
std::copy(reinterpret_cast<const char *>(&element),
23+
reinterpret_cast<const char *>(&element) + sizeof(T),
24+
data_.data() + offset);
2425
}
2526

2627
template <typename T>
@@ -29,6 +30,7 @@ public:
2930
std::copy(begin, end, data_.data() + offset);
3031
}
3132

33+
3234
void insert(const std::string &element, const size_t &offset_begin,
3335
const size_t &offset_end) {
3436
std::string element_copy(element);
@@ -54,7 +56,7 @@ private:
5456
insert(tablator::get_null<T>(), offset);
5557
}
5658

57-
void insert_null_by_type(const Data_Type &data_type, const size_t &offset);
59+
void insert_null_by_type(Data_Type data_type, const size_t &offset);
5860

5961
std::vector<char> data_;
6062
};

src/Row/insert_from_ascii.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace tablator {
1010
void Row::insert_from_ascii(const std::string &element, const Data_Type &data_type,
11-
const size_t &array_size, const size_t &column,
11+
const size_t &array_size, const size_t &col_idx,
1212
const size_t &offset, const size_t &offset_end) {
1313
if (array_size != 1 && data_type != Data_Type::CHAR) {
1414
std::vector<std::string> elements;
@@ -22,15 +22,15 @@ void Row::insert_from_ascii(const std::string &element, const Data_Type &data_ty
2222
auto element_offset = offset;
2323
auto element_size = data_size(data_type);
2424
for (auto &e : elements) {
25-
insert_from_ascii(e, data_type, 1, column, element_offset,
25+
insert_from_ascii(e, data_type, 1, col_idx, element_offset,
2626
element_offset + element_size);
2727
element_offset += element_size;
2828
}
2929
} else {
3030
switch (data_type) {
3131
case Data_Type::INT8_LE:
3232
if (element == "?" || element == " " || element[0] == '\0') {
33-
insert_null(data_type, array_size, column, offset, offset_end);
33+
insert_null(data_type, array_size, col_idx, offset, offset_end);
3434
} else {
3535
bool result = (boost::iequals(element, "true") ||
3636
boost::iequals(element, "t") || element == "1");

src/Row/insert_null.cxx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
#include "../Row.hxx"
44
#include "../data_size.hxx"
55

6-
void tablator::Row::insert_null(const Data_Type &data_type, const size_t &array_size,
7-
const size_t &col_idx, const size_t &offset,
8-
const size_t &offset_end) {
6+
void tablator::Row::insert_null(Data_Type data_type, const size_t& array_size,
7+
const size_t& col_idx, const size_t& offset,
8+
const size_t& offset_end) {
99
const int byte = (col_idx - 1) / 8;
1010
const char mask = (128 >> ((col_idx - 1) % 8));
1111

@@ -26,8 +26,7 @@ void tablator::Row::insert_null(const Data_Type &data_type, const size_t &array_
2626
}
2727
}
2828

29-
void tablator::Row::insert_null_by_type(const Data_Type &data_type,
30-
const size_t &offset) {
29+
void tablator::Row::insert_null_by_type(Data_Type data_type, const size_t& offset) {
3130
switch (data_type) {
3231
case Data_Type::INT8_LE:
3332
insert_null_internal<int8_t>(offset);
@@ -63,7 +62,6 @@ void tablator::Row::insert_null_by_type(const Data_Type &data_type,
6362
insert('\0', offset);
6463
break;
6564
default:
66-
throw std::runtime_error(
67-
"Unexpected data type in insert_null_by_type()");
65+
throw std::runtime_error("Unexpected data type in insert_null_by_type()");
6866
}
6967
}

0 commit comments

Comments
 (0)