1010
1111#include " datatype.hpp"
1212
13+ #include < algorithm>
14+ #include < cstring>
1315#include < iostream>
16+ #include < iterator>
1417
1518template <unsigned Precision>
1619class ColumnDateTime64 : public clickhouse ::ColumnDateTime64 {
@@ -23,6 +26,19 @@ class ColumnDateTime64 : public clickhouse::ColumnDateTime64 {
2326
2427namespace Getters {
2528
29+ static inline in6_addr toIn6 (const Nemea::IpAddress& addr) noexcept
30+ {
31+ in6_addr out {};
32+ if (addr.isIpv4 ()) {
33+ static constexpr uint8_t v4map_prefix[12 ] = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0xff , 0xff };
34+ std::memcpy (out.s6_addr , v4map_prefix, 12 );
35+ std::memcpy (out.s6_addr + 12 , &addr.ip .bytes [8 ], 4 );
36+ } else {
37+ std::memcpy (&out, &addr.ip , sizeof (out));
38+ }
39+ return out;
40+ }
41+
2642template <typename Value>
2743static Value getValue (Nemea::UnirecRecordView& record, ur_field_id_t fieldID)
2844{
@@ -36,7 +52,7 @@ static std::vector<Value> getValueArr(Nemea::UnirecRecordView& record, ur_field_
3652 Nemea::UnirecArray<Value> const arr = record.getFieldAsUnirecArray <Value>(fieldID);
3753 std::vector<Value> result;
3854 result.reserve (arr.size ());
39- std::copy (arr.begin (), arr.end (), std::back_inserter ( result) );
55+ std::for_each (arr.begin (), arr.end (), [&]( const Value& value) { result. push_back (value); } );
4056 return result;
4157}
4258
@@ -54,7 +70,7 @@ static std::vector<uint8_t> getBytes(Nemea::UnirecRecordView& record, ur_field_i
5470static in6_addr getIp (Nemea::UnirecRecordView& record, ur_field_id_t fieldID)
5571{
5672 Nemea::IpAddress addr = record.getFieldAsType <Nemea::IpAddress>(fieldID);
57- return *((in6_addr*) & addr. ip );
73+ return toIn6 ( addr);
5874}
5975
6076static std::vector<in6_addr> getIpArr (Nemea::UnirecRecordView& record, ur_field_id_t fieldID)
@@ -67,9 +83,7 @@ static std::vector<in6_addr> getIpArr(Nemea::UnirecRecordView& record, ur_field_
6783 addrArr.begin (),
6884 addrArr.end (),
6985 std::back_inserter (result),
70- [](const Nemea::IpAddress& value) -> in6_addr {
71- return *reinterpret_cast <const in6_addr*>(&value.ip );
72- });
86+ [](const Nemea::IpAddress& value) -> in6_addr { return toIn6 (value); });
7387 return result;
7488}
7589
0 commit comments