| 1 | #include "append_info.h" |
| 2 | #include "append_info.hpp" |
| 3 | #include "config.h" |
| 4 | #include "porting.h" |
| 5 | #include "nulls.h" |
| 6 | #include "date.h" |
| 7 | |
| 8 | #include "duckdb/common/types/date.hpp" |
| 9 | #include "duckdb/common/exception.hpp" |
| 10 | #include "duckdb/storage/data_table.hpp" |
| 11 | #include <cstring> |
| 12 | #include <memory> |
| 13 | |
| 14 | using namespace tpcds; |
| 15 | |
| 16 | append_info *append_info_get(void *info_list, int table_id) { |
| 17 | auto &append_vector = *((std::vector<std::unique_ptr<tpcds_append_information>> *)info_list); |
| 18 | return (append_info *)append_vector[table_id].get(); |
| 19 | } |
| 20 | |
| 21 | void append_row_start(append_info *info) { |
| 22 | auto append_info = (tpcds_append_information *)info; |
| 23 | append_info->appender.BeginRow(); |
| 24 | } |
| 25 | |
| 26 | void append_row_end(append_info *info) { |
| 27 | auto append_info = (tpcds_append_information *)info; |
| 28 | append_info->appender.EndRow(); |
| 29 | } |
| 30 | |
| 31 | void append_varchar(append_info *info, const char *value) { |
| 32 | auto append_info = (tpcds_append_information *)info; |
| 33 | if (!nullCheck(append_info->appender.CurrentColumn())) { |
| 34 | append_info->appender.Append<const char*>(value); |
| 35 | } else { |
| 36 | append_info->appender.Append(nullptr); |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | // TODO: use direct array manipulation for speed, but not now |
| 41 | static void append_value(append_info *info, duckdb::Value v) { |
| 42 | auto append_info = (tpcds_append_information *)info; |
| 43 | append_info->appender.Append<duckdb::Value>(v); |
| 44 | } |
| 45 | |
| 46 | void append_key(append_info *info, int64_t value) { |
| 47 | auto append_info = (tpcds_append_information *)info; |
| 48 | append_info->appender.Append<int64_t>(value); |
| 49 | } |
| 50 | |
| 51 | void append_integer(append_info *info, int32_t value) { |
| 52 | auto append_info = (tpcds_append_information *)info; |
| 53 | append_info->appender.Append<int32_t>(value); |
| 54 | } |
| 55 | |
| 56 | void append_boolean(append_info *info, int32_t value) { |
| 57 | auto append_info = (tpcds_append_information *)info; |
| 58 | append_info->appender.Append<bool>(value != 0); |
| 59 | } |
| 60 | |
| 61 | // value is a Julian date |
| 62 | // FIXME: direct int conversion, offsets should be constant |
| 63 | void append_date(append_info *info, int64_t value) { |
| 64 | date_t dTemp; |
| 65 | jtodt(&dTemp, (int)value); |
| 66 | auto ddate = duckdb::Date::FromDate(dTemp.year, dTemp.month, dTemp.day); |
| 67 | append_integer(info, (int32_t) ddate); |
| 68 | } |
| 69 | |
| 70 | void append_decimal(append_info *info, decimal_t *val) { |
| 71 | double dTemp = val->number; |
| 72 | for (int i = 0; i < val->precision; i++) { |
| 73 | dTemp /= 10.0; |
| 74 | } |
| 75 | auto append_info = (tpcds_append_information *)info; |
| 76 | append_info->appender.Append<double>(dTemp); |
| 77 | } |
| 78 | |