TrinityCore
FieldValueConverters.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef TRINITY_FIELD_VALUE_CONVERTERS_H
19#define TRINITY_FIELD_VALUE_CONVERTERS_H
20
21#include "FieldValueConverter.h"
22#include "StringConvert.h"
23
24// converts string value returned from query to type specified in column metadata
25template<typename DatabaseType>
27{
28public:
29 static DatabaseType GetDatabaseValue(char const* data, uint32 size)
30 {
31 return Trinity::StringTo<DatabaseType>({ data, size }).template value_or<DatabaseType>(0);
32 }
33
34 static char const* GetStringValue(char const* data)
35 {
36 return data;
37 }
38};
39
40// converts binary value returned from query to type specified in column metadata
41template<typename DatabaseType>
43{
44public:
45 static DatabaseType GetDatabaseValue(char const* data, uint32 /*size*/)
46 {
47 return *reinterpret_cast<DatabaseType const*>(data);
48 }
49
50 static char const* GetStringValue(char const* /*data*/)
51 {
52 return nullptr;
53 }
54};
55
56// converts column value from type specified in column metadata to type requested by Field::Get* function
57template<typename DatabaseType, template<typename...> typename ToDatabaseTypeConverter>
59{
60public:
61 template<typename T>
62 static T GetNumericValue(char const* data, uint32 size, QueryResultFieldMetadata const* meta, char const* func)
63 {
64 DatabaseType source = ToDatabaseTypeConverter<DatabaseType>::GetDatabaseValue(data, size);
65 T result = static_cast<T>(source);
66 if (static_cast<DatabaseType>(result) != source)
67 {
68 LogTruncation(func, meta);
69 return T();
70 }
71 return result;
72 }
73
74 uint8 GetUInt8(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<uint8>(data, size, meta, "Field::GetUInt8"); }
75 int8 GetInt8(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<int8>(data, size, meta, "Field::GetInt8"); }
76 uint16 GetUInt16(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<uint16>(data, size, meta, "Field::GetUInt16"); }
77 int16 GetInt16(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<int16>(data, size, meta, "Field::GetInt16"); }
78 uint32 GetUInt32(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<uint32>(data, size, meta, "Field::GetUInt32"); }
79 int32 GetInt32(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<int32>(data, size, meta, "Field::GetInt32"); }
80 uint64 GetUInt64(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<uint64>(data, size, meta, "Field::GetUInt64"); }
81 int64 GetInt64(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<int64>(data, size, meta, "Field::GetInt64"); }
82 float GetFloat(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<float>(data, size, meta, "Field::GetFloat"); }
83 double GetDouble(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<double>(data, size, meta, "Field::GetDouble"); }
84 char const* GetCString(char const* data, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override
85 {
86 char const* result = ToDatabaseTypeConverter<DatabaseType>::GetStringValue(data);
87 if (data && !result)
88 LogTruncation("Field::GetCString", meta);
89 return result;
90 }
91};
92
93template<>
95{
96public:
97 uint8 GetUInt8(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetUInt8", meta); return 0; }
98 int8 GetInt8(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetInt8", meta); return 0; }
99 uint16 GetUInt16(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetUInt16", meta); return 0; }
100 int16 GetInt16(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetInt16", meta); return 0; }
101 uint32 GetUInt32(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetUInt32", meta); return 0; }
102 int32 GetInt32(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetInt32", meta); return 0; }
103 uint64 GetUInt64(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetUInt64", meta); return 0; }
104 int64 GetInt64(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetInt64", meta); return 0; }
105 float GetFloat(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetFloat", meta); return 0.0f; }
106 double GetDouble(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetDouble", meta); return 0.0; }
107 char const* GetCString(char const* data, uint32 /*size*/, QueryResultFieldMetadata const* /*meta*/) const override { return data; }
108};
109
111
112#endif // TRINITY_FIELD_VALUE_CONVERTERS_H
uint8_t uint8
Definition: Define.h:144
int64_t int64
Definition: Define.h:137
int16_t int16
Definition: Define.h:139
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
static void LogTruncation(char const *getter, QueryResultFieldMetadata const *meta)
static char const * GetStringValue(char const *)
static DatabaseType GetDatabaseValue(char const *data, uint32)
static DatabaseType GetDatabaseValue(char const *data, uint32 size)
static char const * GetStringValue(char const *data)
int16 GetInt16(char const *, uint32, QueryResultFieldMetadata const *meta) const override
uint32 GetUInt32(char const *, uint32, QueryResultFieldMetadata const *meta) const override
double GetDouble(char const *, uint32, QueryResultFieldMetadata const *meta) const override
int8 GetInt8(char const *, uint32, QueryResultFieldMetadata const *meta) const override
uint8 GetUInt8(char const *, uint32, QueryResultFieldMetadata const *meta) const override
int64 GetInt64(char const *, uint32, QueryResultFieldMetadata const *meta) const override
float GetFloat(char const *, uint32, QueryResultFieldMetadata const *meta) const override
uint16 GetUInt16(char const *, uint32, QueryResultFieldMetadata const *meta) const override
char const * GetCString(char const *data, uint32, QueryResultFieldMetadata const *) const override
uint64 GetUInt64(char const *, uint32, QueryResultFieldMetadata const *meta) const override
int32 GetInt32(char const *, uint32, QueryResultFieldMetadata const *meta) const override
double GetDouble(char const *data, uint32 size, QueryResultFieldMetadata const *meta) const override
float GetFloat(char const *data, uint32 size, QueryResultFieldMetadata const *meta) const override
int64 GetInt64(char const *data, uint32 size, QueryResultFieldMetadata const *meta) const override
int32 GetInt32(char const *data, uint32 size, QueryResultFieldMetadata const *meta) const override
int16 GetInt16(char const *data, uint32 size, QueryResultFieldMetadata const *meta) const override
static T GetNumericValue(char const *data, uint32 size, QueryResultFieldMetadata const *meta, char const *func)
uint32 GetUInt32(char const *data, uint32 size, QueryResultFieldMetadata const *meta) const override
uint8 GetUInt8(char const *data, uint32 size, QueryResultFieldMetadata const *meta) const override
int8 GetInt8(char const *data, uint32 size, QueryResultFieldMetadata const *meta) const override
uint16 GetUInt16(char const *data, uint32 size, QueryResultFieldMetadata const *meta) const override
uint64 GetUInt64(char const *data, uint32 size, QueryResultFieldMetadata const *meta) const override
char const * GetCString(char const *data, uint32, QueryResultFieldMetadata const *meta) const override
constexpr std::size_t size()
Definition: UpdateField.h:796