Skip to content

Commit 3ce6a77

Browse files
authored
feat(orm): Support unsigned integer types in MySQL ORM (#2429)
1 parent b00f38f commit 3ce6a77

File tree

3 files changed

+94
-1
lines changed

3 files changed

+94
-1
lines changed

orm_lib/inc/drogon/orm/DbTypes.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ enum FieldType
3333
MySqlNull,
3434
MySqlString,
3535
DrogonDefaultValue,
36+
MySqlUTiny,
37+
MySqlUShort,
38+
MySqlULong,
39+
MySqlULongLong,
3640
};
3741

3842
} // namespace internal

orm_lib/inc/drogon/orm/SqlBinder.h

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <string>
3737
#include <vector>
3838
#include <optional>
39+
#include <type_traits>
3940
#ifdef _WIN32
4041
#include <winsock2.h>
4142
#else // some Unix-like OS
@@ -414,7 +415,7 @@ class DROGON_EXPORT SqlBinder : public trantor::NonCopyable
414415
objs_.push_back(obj);
415416
parameters_.push_back((char *)obj.get());
416417
lengths_.push_back(0);
417-
formats_.push_back(getMysqlTypeBySize(sizeof(T)));
418+
formats_.push_back(getMysqlType<ParaType>());
418419
}
419420
else if (type_ == ClientType::Sqlite3)
420421
{
@@ -599,6 +600,78 @@ class DROGON_EXPORT SqlBinder : public trantor::NonCopyable
599600

600601
private:
601602
static int getMysqlTypeBySize(size_t size);
603+
604+
template <typename T>
605+
static int getMysqlType()
606+
{
607+
if constexpr (std::is_same_v<T, bool>)
608+
{
609+
return MySqlTiny;
610+
}
611+
else if constexpr (std::is_same_v<T, int8_t> ||
612+
std::is_same_v<T, signed char>)
613+
{
614+
return MySqlTiny;
615+
}
616+
else if constexpr (std::is_same_v<T, uint8_t> ||
617+
std::is_same_v<T, unsigned char>)
618+
{
619+
return MySqlUTiny;
620+
}
621+
else if constexpr (std::is_same_v<T, int16_t> ||
622+
std::is_same_v<T, short>)
623+
{
624+
return MySqlShort;
625+
}
626+
else if constexpr (std::is_same_v<T, uint16_t> ||
627+
std::is_same_v<T, unsigned short>)
628+
{
629+
return MySqlUShort;
630+
}
631+
else if constexpr (std::is_same_v<T, int32_t> ||
632+
(std::is_same_v<T, int> && sizeof(int) == 4) ||
633+
(std::is_same_v<T, long> && sizeof(long) == 4))
634+
{
635+
return MySqlLong;
636+
}
637+
else if constexpr (std::is_same_v<T, uint32_t> ||
638+
(std::is_same_v<T, unsigned int> &&
639+
sizeof(unsigned int) == 4) ||
640+
(std::is_same_v<T, unsigned long> &&
641+
sizeof(unsigned long) == 4))
642+
{
643+
return MySqlULong;
644+
}
645+
else if constexpr (std::is_same_v<T, int64_t> ||
646+
std::is_same_v<T, long long> ||
647+
(std::is_same_v<T, long> && sizeof(long) == 8))
648+
{
649+
return MySqlLongLong;
650+
}
651+
else if constexpr (std::is_same_v<T, uint64_t> ||
652+
std::is_same_v<T, unsigned long long> ||
653+
(std::is_same_v<T, unsigned long> &&
654+
sizeof(unsigned long) == 8))
655+
{
656+
return MySqlULongLong;
657+
}
658+
else if constexpr (std::is_same_v<T, char>)
659+
{
660+
if constexpr (std::is_signed_v<char>)
661+
{
662+
return MySqlTiny;
663+
}
664+
else
665+
{
666+
return MySqlUTiny;
667+
}
668+
}
669+
else
670+
{
671+
static_assert(sizeof(T) == 0, "Unsupported type for MySQL binding");
672+
}
673+
}
674+
602675
std::shared_ptr<std::string> sqlPtr_;
603676
const char *sqlViewPtr_;
604677
size_t sqlViewLength_;

orm_lib/src/mysql_impl/MysqlConnection.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,22 @@ void MysqlConnection::execSqlInLoop(
480480
sql_.append(
481481
std::to_string(*((int64_t *)parameters[i])));
482482
break;
483+
case internal::MySqlUTiny:
484+
sql_.append(
485+
std::to_string(*((unsigned char *)parameters[i])));
486+
break;
487+
case internal::MySqlUShort:
488+
sql_.append(
489+
std::to_string(*((unsigned short *)parameters[i])));
490+
break;
491+
case internal::MySqlULong:
492+
sql_.append(
493+
std::to_string(*((uint32_t *)parameters[i])));
494+
break;
495+
case internal::MySqlULongLong:
496+
sql_.append(
497+
std::to_string(*((uint64_t *)parameters[i])));
498+
break;
483499
case internal::MySqlNull:
484500
sql_.append("NULL");
485501
break;

0 commit comments

Comments
 (0)