aboutsummaryrefslogtreecommitdiff
path: root/src/server/database/Database/FieldValueConverters.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/database/Database/FieldValueConverters.h')
-rw-r--r--src/server/database/Database/FieldValueConverters.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/server/database/Database/FieldValueConverters.h b/src/server/database/Database/FieldValueConverters.h
new file mode 100644
index 00000000000..e050d8052ca
--- /dev/null
+++ b/src/server/database/Database/FieldValueConverters.h
@@ -0,0 +1,112 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TRINITY_FIELD_VALUE_CONVERTERS_H
+#define TRINITY_FIELD_VALUE_CONVERTERS_H
+
+#include "FieldValueConverter.h"
+#include "StringConvert.h"
+
+// converts string value returned from query to type specified in column metadata
+template<typename DatabaseType>
+class FromStringToDatabaseTypeConverter : public BaseDatabaseResultValueConverter
+{
+public:
+ static DatabaseType GetDatabaseValue(char const* data, uint32 size)
+ {
+ return Trinity::StringTo<DatabaseType>({ data, size }).template value_or<DatabaseType>(0);
+ }
+
+ static char const* GetStringValue(char const* data)
+ {
+ return data;
+ }
+};
+
+// converts binary value returned from query to type specified in column metadata
+template<typename DatabaseType>
+class FromBinaryToDatabaseTypeConverter : public BaseDatabaseResultValueConverter
+{
+public:
+ static DatabaseType GetDatabaseValue(char const* data, uint32 /*size*/)
+ {
+ return *reinterpret_cast<DatabaseType const*>(data);
+ }
+
+ static char const* GetStringValue(char const* /*data*/)
+ {
+ return nullptr;
+ }
+};
+
+// converts column value from type specified in column metadata to type requested by Field::Get* function
+template<typename DatabaseType, template<typename...> typename ToDatabaseTypeConverter>
+class PrimitiveResultValueConverter : public BaseDatabaseResultValueConverter
+{
+public:
+ template<typename T>
+ static T GetNumericValue(char const* data, uint32 size, QueryResultFieldMetadata const* meta, char const* func)
+ {
+ DatabaseType source = ToDatabaseTypeConverter<DatabaseType>::GetDatabaseValue(data, size);
+ T result = static_cast<T>(source);
+ if (static_cast<DatabaseType>(result) != source)
+ {
+ LogTruncation(func, meta);
+ return T();
+ }
+ return result;
+ }
+
+ uint8 GetUInt8(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<uint8>(data, size, meta, "Field::GetUInt8"); }
+ int8 GetInt8(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<int8>(data, size, meta, "Field::GetInt8"); }
+ uint16 GetUInt16(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<uint16>(data, size, meta, "Field::GetUInt16"); }
+ int16 GetInt16(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<int16>(data, size, meta, "Field::GetInt16"); }
+ uint32 GetUInt32(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<uint32>(data, size, meta, "Field::GetUInt32"); }
+ int32 GetInt32(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<int32>(data, size, meta, "Field::GetInt32"); }
+ uint64 GetUInt64(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<uint64>(data, size, meta, "Field::GetUInt64"); }
+ int64 GetInt64(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<int64>(data, size, meta, "Field::GetInt64"); }
+ float GetFloat(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<float>(data, size, meta, "Field::GetFloat"); }
+ double GetDouble(char const* data, uint32 size, QueryResultFieldMetadata const* meta) const override { return GetNumericValue<double>(data, size, meta, "Field::GetDouble"); }
+ char const* GetCString(char const* data, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override
+ {
+ char const* result = ToDatabaseTypeConverter<DatabaseType>::GetStringValue(data);
+ if (data && !result)
+ LogTruncation("Field::GetCString", meta);
+ return result;
+ }
+};
+
+template<>
+class PrimitiveResultValueConverter<char const*, std::void_t> : public BaseDatabaseResultValueConverter
+{
+public:
+ uint8 GetUInt8(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetUInt8", meta); return 0; }
+ int8 GetInt8(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetInt8", meta); return 0; }
+ uint16 GetUInt16(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetUInt16", meta); return 0; }
+ int16 GetInt16(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetInt16", meta); return 0; }
+ uint32 GetUInt32(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetUInt32", meta); return 0; }
+ int32 GetInt32(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetInt32", meta); return 0; }
+ uint64 GetUInt64(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetUInt64", meta); return 0; }
+ int64 GetInt64(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetInt64", meta); return 0; }
+ float GetFloat(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetFloat", meta); return 0.0f; }
+ double GetDouble(char const* /*data*/, uint32 /*size*/, QueryResultFieldMetadata const* meta) const override { LogTruncation("Field::GetDouble", meta); return 0.0; }
+ char const* GetCString(char const* data, uint32 /*size*/, QueryResultFieldMetadata const* /*meta*/) const override { return data; }
+};
+
+using StringResultValueConverter = PrimitiveResultValueConverter<char const*, std::void_t>;
+
+#endif // TRINITY_FIELD_VALUE_CONVERTERS_H