1#include <knowCore/Timestamp.h>
4#include <QJsonDocument>
8#include <knowCore/Array.h>
9#include <knowCore/BigNumber.h>
10#include <knowCore/Logging.h>
11#include <knowCore/Vector.h>
12#include "BinaryInterfaceTimeStamp_p.h"
14namespace kDB::Repository::DatabaseInterface::PostgreSQL::BinaryInterface
16 template<
typename _T_>
19 template<
typename _T_>
20 inline _T_ read(
const char* data,
int _size)
26 inline qint64 read<qint64>(
const char* data,
int _size)
28 Q_ASSERT(_size ==
sizeof(qint64));
29 qint32 h32 = *(qint32*)data;
30 qint32 l32 = *(qint32*)(data+4);
40 inline quint64 read<quint64>(
const char* data,
int _size)
42 Q_ASSERT(_size ==
sizeof(quint64));
43 return read<quint64>(data, _size);
46 inline qint32 read<qint32>(
const char* data,
int _size)
48 Q_ASSERT(_size ==
sizeof(qint32));
49 return ntohl(*(qint32*)data);
52 inline quint32 read<quint32>(
const char* data,
int _size)
54 Q_ASSERT(_size ==
sizeof(quint32));
55 return read<qint32>(data, _size);
58 inline qint16 read<qint16>(
const char* data,
int _size)
60 Q_ASSERT(_size ==
sizeof(qint16));
61 return ntohs(*(qint16*)data);
64 inline quint16 read<quint16>(
const char* data,
int _size)
66 Q_ASSERT(_size ==
sizeof(quint16));
67 return read<qint16>(data, _size);
70 inline char read<char>(
const char* data,
int _size)
72 Q_ASSERT(_size ==
sizeof(
char));
76 inline bool read<bool>(
const char* data,
int _size)
82 inline float read<float>(
const char* data,
int _size)
84 Q_ASSERT(_size ==
sizeof(
float));
85 union {
float f; qint32 i; } swap;
86 swap.i = read<qint32>(data, _size);
90 inline double read<double>(
const char* data,
int _size)
92 Q_ASSERT(_size ==
sizeof(
double));
93 union {
double f; qint64 i; } swap;
94 swap.i = read<qint64>(data, _size);
101 Q_ASSERT(_size ==
sizeof(qint64));
102 qint64 timestamp = read<qint64>(data, _size);
105 if(BinaryInterface::timestamp2tm(timestamp, &tt, &fsec, NULL) == 0)
107 return knowCore::Timestamp::from(QDateTime(QDate(tt.tm_year, tt.tm_mon, tt.tm_mday), QTime(tt.tm_hour, tt.tm_min, tt.tm_sec, fsec / 1000)));
114 inline QString read<QString>(
const char* data,
int _size)
116 return QString::fromUtf8(data, _size);
125 inline QByteArray read<QByteArray>(
const char* data,
int _size)
127 return QByteArray(data, _size);
134 quint16 ndigits = BinaryInterface::read<quint16>(data, 2); data += 2;
135 quint16 weight = BinaryInterface::read<quint16>(data, 2); data += 2;
136 quint16 sign = BinaryInterface::read<quint16>(data, 2); data += 2;
137 knowCore::BigNumber::Sign sign_bn;
141 sign_bn = knowCore::BigNumber::Sign::Negative;
144 sign_bn = knowCore::BigNumber::Sign::Positive;
147 sign_bn = knowCore::BigNumber::Sign::NegativeInfinite;
150 sign_bn = knowCore::BigNumber::Sign::PositiveInfinite;
153 sign_bn = knowCore::BigNumber::Sign::NaN;
156 qint16 dscale = BinaryInterface::read<quint16>(data, 2); data += 2;
158 for(
int i = 0; i < ndigits; ++i)
160 digits.append(BinaryInterface::read<quint16>(data, 2));
166 template<
typename _T_>
173 qint32 ndim = read<qint32>(data, 4); data += 4;
177 qint32 has_null = read<qint32>(data, 4); data += 4;
178 Oid type = read<Oid>(data, 4); data += 4;
186 for(
int i = 0; i < ndim; ++i)
188 qint32 dim = read<qint32>(data, 4); data += 4;
189 qint32 lbound = read<qint32>(data, 4); data += 4;
191 dimensions.append(dim);
197 r_data.reserve(total_dim);
199 for(
int i = 0; i < total_dim; ++i)
201 std::size_t s = read<qint32>(data, 4);;
203 r_data.append(read<_T_>(data, s));
209 template<
typename _T_>
212 static QList<_T_> do_read(
const char* _data,
int _size)
214 return read<knowCore::Array<_T_>>(_data, _size).toList().expectSuccess();
219 inline QJsonArray read<QJsonArray>(
const char* _data,
int _size)
223 qFatal(
"should not called");
226 inline QJsonObject read<QJsonObject>(
const char* _data,
int _size)
230 qFatal(
"should not called");
233 inline QJsonValue read<QJsonValue>(
const char* _data,
int _size)
235 QByteArray doc_data(_data, _size);
236 QJsonDocument doc = QJsonDocument::fromJson(doc_data);
237 if(doc.isEmpty() or doc.isNull())
241 return QJsonValue(QString::fromUtf8(doc_data));
245 }
else if(doc.isArray())
248 }
else if(doc.isObject())
256 template<
int _N_,
typename... T>
259 static void do_read(std::tuple<T...> *data,
const char* ptr)
262 quint32 s = read<quint32>(ptr, 4);
264 std::get<
sizeof...(T) - _N_>(*data) = read<std::remove_reference_t<
decltype(std::get<
sizeof...(T) - _N_>(*data))>>(ptr, s);
268 template<
typename... T>
271 static void do_read(std::tuple<T...> *data,
const char* ptr)
278 template<
typename... T>
283 void read(
const char* ptr)
285 quint32 f = BinaryInterface::read<quint32>(ptr, 4);
286 KNOWCORE_ASSERT(f ==
sizeof...(T));
291 std::tuple<T...> data;
295 template<
typename... T>
298 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:258
Definition BinaryInterface_read_p.h:17
Definition BinaryInterface_read_p.h:280