3#include <knowCore/Timestamp.h>
6#include <QJsonDocument>
10#include "BinaryInterfaceTimeStamp_p.h"
12#include <knowCore/Array.h>
13#include <knowCore/BigNumber.h>
14#include <knowCore/Vector.h>
16namespace kDB::Repository::DatabaseInterface::PostgreSQL::BinaryInterface
18 template<
typename _T_>
21 template<
typename _T_>
22 inline _T_ read(
const char* data,
int _size)
28 inline qint64 read<qint64>(
const char* data,
int _size)
30 clog_assert(_size ==
sizeof(qint64));
31 qint32 h32 = *(qint32*)data;
32 qint32 l32 = *(qint32*)(data + 4);
42 inline quint64 read<quint64>(
const char* data,
int _size)
44 clog_assert(_size ==
sizeof(quint64));
45 return read<qint64>(data, _size);
48 inline qint32 read<qint32>(
const char* data,
int _size)
50 clog_assert(_size ==
sizeof(qint32));
51 return ntohl(*(qint32*)data);
54 inline quint32 read<quint32>(
const char* data,
int _size)
56 clog_assert(_size ==
sizeof(quint32));
57 return read<qint32>(data, _size);
60 inline qint16 read<qint16>(
const char* data,
int _size)
62 clog_assert(_size ==
sizeof(qint16));
63 return ntohs(*(qint16*)data);
66 inline quint16 read<quint16>(
const char* data,
int _size)
68 clog_assert(_size ==
sizeof(quint16));
69 return read<qint16>(data, _size);
72 inline char read<char>(
const char* data,
int _size)
74 clog_assert(_size ==
sizeof(
char));
78 inline bool read<bool>(
const char* data,
int _size)
80 clog_assert(_size == 1);
84 inline float read<float>(
const char* data,
int _size)
86 clog_assert(_size ==
sizeof(
float));
92 swap.i = read<qint32>(data, _size);
96 inline double read<double>(
const char* data,
int _size)
98 clog_assert(_size ==
sizeof(
double));
104 swap.i = read<qint64>(data, _size);
111 clog_assert(_size ==
sizeof(qint64));
112 qint64 timestamp = read<qint64>(data, _size);
115 if(BinaryInterface::timestamp2tm(timestamp, &tt, &fsec, NULL) == 0)
117 return knowCore::Timestamp::from(
118 QDateTime(QDate(tt.tm_year, tt.tm_mon, tt.tm_mday),
119 QTime(tt.tm_hour, tt.tm_min, tt.tm_sec, fsec / 1000)));
128 inline QString read<QString>(
const char* data,
int _size)
130 return QString::fromUtf8(data, _size);
139 inline QByteArray read<QByteArray>(
const char* data,
int _size)
141 return QByteArray(data, _size);
148 quint16 ndigits = BinaryInterface::read<quint16>(data, 2);
150 quint16 weight = BinaryInterface::read<quint16>(data, 2);
152 quint16 sign = BinaryInterface::read<quint16>(data, 2);
154 knowCore::BigNumber::Sign sign_bn;
158 sign_bn = knowCore::BigNumber::Sign::Negative;
161 sign_bn = knowCore::BigNumber::Sign::Positive;
164 sign_bn = knowCore::BigNumber::Sign::NegativeInfinite;
167 sign_bn = knowCore::BigNumber::Sign::PositiveInfinite;
170 sign_bn = knowCore::BigNumber::Sign::NaN;
173 qint16 dscale = BinaryInterface::read<quint16>(data, 2);
176 digits.reserve(ndigits);
177 for(
int i = 0; i < ndigits; ++i)
179 digits.append(BinaryInterface::read<quint16>(data, 2));
185 template<
typename _T_>
192 qint32 ndim = read<qint32>(data, 4);
198 qint32 has_null = read<qint32>(data, 4);
200 Oid type = read<Oid>(data, 4);
209 for(
int i = 0; i < ndim; ++i)
211 qint32 dim = read<qint32>(data, 4);
213 qint32 lbound = read<qint32>(data, 4);
216 dimensions.append(dim);
222 r_data.reserve(total_dim);
224 for(
int i = 0; i < total_dim; ++i)
226 std::size_t s = read<qint32>(data, 4);
229 r_data.append(read<_T_>(data, s));
235 template<
typename _T_>
238 static QList<_T_> do_read(
const char* _data,
int _size)
240 return read<knowCore::Array<_T_>>(_data, _size).toList().expect_success();
245 inline QJsonArray read<QJsonArray>(
const char* _data,
int _size)
249 qFatal(
"should not called");
252 inline QJsonObject read<QJsonObject>(
const char* _data,
int _size)
256 qFatal(
"should not called");
259 inline QJsonValue read<QJsonValue>(
const char* _data,
int _size)
261 QByteArray doc_data(_data, _size);
262 QJsonDocument doc = QJsonDocument::fromJson(doc_data);
263 if(doc.isEmpty() or doc.isNull())
267 return QJsonValue(QString::fromUtf8(doc_data));
274 else if(doc.isArray())
278 else if(doc.isObject())
286 template<
int _N_,
typename... T>
289 static void do_read(std::tuple<T...>* data,
const char* ptr)
292 quint32 s = read<quint32>(ptr, 4);
294 std::get<
sizeof...(T) - _N_>(*data)
295 = read<std::remove_reference_t<
decltype(std::get<
sizeof...(T) - _N_>(*data))>>(ptr, s);
299 template<
typename... T>
302 static void do_read(std::tuple<T...>* data,
const char* ptr)
309 template<
typename... T>
314 void read(
const char* ptr)
316 quint32 f = BinaryInterface::read<quint32>(ptr, 4);
317 clog_assert(f ==
sizeof...(T));
322 std::tuple<T...> data;
325 template<
typename... T>
328 static std::tuple<T...> do_read(
const char* data,
int )
Class that can contains large numeric value.
Definition BigNumber.h:51
Definition Timestamp.h:39
Definition BinaryInterface_read_p.h:288
Definition BinaryInterface_read_p.h:19
Definition BinaryInterface_read_p.h:311