From fcdca58617caf6a8c034a91588d6abb399be6b57 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 18 May 2021 00:06:37 +0100 Subject: Initial commit, still lots to do! --- lib/mysql_types.h | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 lib/mysql_types.h (limited to 'lib/mysql_types.h') diff --git a/lib/mysql_types.h b/lib/mysql_types.h new file mode 100644 index 0000000..ec578f7 --- /dev/null +++ b/lib/mysql_types.h @@ -0,0 +1,87 @@ +#ifndef MYGRATE_MYSQL_TYPES_H +#define MYGRATE_MYSQL_TYPES_H + +#include "bitset.h" +#include +#include +#include +#include +#include // IWYU pragma: keep +#include +#include +#include + +#include + +namespace MyGrate { + class RawDataReader; + namespace MySQL { + struct Date { + uint16_t year; + uint8_t month; + uint8_t day; + }; + struct Time { + uint8_t hour; + uint8_t minute; + uint8_t second; + }; + struct DateTime : public Date, public Time { + }; + using Blob = std::span; + + template struct Type; + +#define DEFINE_BASE_TYPE(ET, CT, MDS, SIGN) \ + template<> struct Type { \ + using C = CT; \ + constexpr static size_t md_bytes {MDS}; \ + static C read(RawDataReader & md, RawDataReader & data); \ + } +#define DEFINE_TYPE(ET, CT, MDS) DEFINE_BASE_TYPE(ET, CT, MDS, false) +#define DEFINE_ITYPE(ET, BCT, MDS) \ + DEFINE_BASE_TYPE(ET, BCT, MDS, false); \ + DEFINE_BASE_TYPE(ET, u##BCT, MDS, true) + + DEFINE_TYPE(MYSQL_TYPE_DECIMAL, double, 2); + DEFINE_ITYPE(MYSQL_TYPE_TINY, int8_t, 0); + DEFINE_ITYPE(MYSQL_TYPE_SHORT, int16_t, 0); + DEFINE_ITYPE(MYSQL_TYPE_LONG, int32_t, 0); + DEFINE_TYPE(MYSQL_TYPE_FLOAT, float, 1); + DEFINE_TYPE(MYSQL_TYPE_DOUBLE, double, 1); + DEFINE_TYPE(MYSQL_TYPE_NULL, std::nullptr_t, 0); + DEFINE_TYPE(MYSQL_TYPE_TIMESTAMP, timespec, 0); + DEFINE_TYPE(MYSQL_TYPE_TIMESTAMP2, timespec, 1); + DEFINE_ITYPE(MYSQL_TYPE_LONGLONG, int64_t, 0); + DEFINE_ITYPE(MYSQL_TYPE_INT24, int32_t, 0); + DEFINE_TYPE(MYSQL_TYPE_DATE, Date, 0); + DEFINE_TYPE(MYSQL_TYPE_TIME, Time, 0); + DEFINE_TYPE(MYSQL_TYPE_TIME2, Time, 0); + DEFINE_TYPE(MYSQL_TYPE_DATETIME, DateTime, 0); + DEFINE_TYPE(MYSQL_TYPE_DATETIME2, DateTime, 1); + DEFINE_TYPE(MYSQL_TYPE_YEAR, int16_t, 0); + DEFINE_TYPE(MYSQL_TYPE_NEWDATE, Date, 0); + DEFINE_TYPE(MYSQL_TYPE_VARCHAR, std::string_view, 2); + DEFINE_TYPE(MYSQL_TYPE_BIT, BitSet, 2); + DEFINE_TYPE(MYSQL_TYPE_NEWDECIMAL, double, 2); + DEFINE_TYPE(MYSQL_TYPE_ENUM, std::string_view, 0); + DEFINE_TYPE(MYSQL_TYPE_SET, std::string_view, 0); + DEFINE_TYPE(MYSQL_TYPE_TINY_BLOB, Blob, 0); + DEFINE_TYPE(MYSQL_TYPE_MEDIUM_BLOB, Blob, 0); + DEFINE_TYPE(MYSQL_TYPE_LONG_BLOB, Blob, 0); + DEFINE_TYPE(MYSQL_TYPE_BLOB, std::string_view, 1); + DEFINE_TYPE(MYSQL_TYPE_VAR_STRING, std::string_view, 2); + DEFINE_TYPE(MYSQL_TYPE_STRING, std::string_view, 2); + DEFINE_TYPE(MYSQL_TYPE_JSON, std::string_view, 2); + DEFINE_TYPE(MYSQL_TYPE_GEOMETRY, Blob, 1); + +#undef DEFINE_ITYPE +#undef DEFINE_USTYPE +#undef DEFINE_TYPE + + using FieldValue = std::variant; + } +} + +#endif -- cgit v1.2.3