5#if defined(_WIN32) || defined(_WIN64)
18namespace SqlColumnTypeDefinitions
23struct Binary { std::size_t size = 255; };
25struct Char { std::size_t size = 1; };
28struct Decimal { std::size_t precision {}; std::size_t scale {}; };
31struct NChar { std::size_t size = 1; };
32struct NVarchar { std::size_t size = 255; };
33struct Real { std::size_t precision = {}; };
35struct Text { std::size_t size {}; };
39struct VarBinary { std::size_t size = 255; };
40struct Varchar { std::size_t size = 255; };
45using SqlColumnTypeDefinition = std::variant<SqlColumnTypeDefinitions::Bigint,
46 SqlColumnTypeDefinitions::Binary,
47 SqlColumnTypeDefinitions::Bool,
48 SqlColumnTypeDefinitions::Char,
49 SqlColumnTypeDefinitions::Date,
50 SqlColumnTypeDefinitions::DateTime,
51 SqlColumnTypeDefinitions::Decimal,
52 SqlColumnTypeDefinitions::Guid,
53 SqlColumnTypeDefinitions::Integer,
54 SqlColumnTypeDefinitions::NChar,
55 SqlColumnTypeDefinitions::NVarchar,
56 SqlColumnTypeDefinitions::Real,
57 SqlColumnTypeDefinitions::Tinyint,
58 SqlColumnTypeDefinitions::Smallint,
59 SqlColumnTypeDefinitions::Text,
60 SqlColumnTypeDefinitions::Time,
61 SqlColumnTypeDefinitions::Timestamp,
62 SqlColumnTypeDefinitions::VarBinary,
63 SqlColumnTypeDefinitions::Varchar>;
68constexpr std::optional<SqlColumnTypeDefinition> MakeColumnTypeFromNative(
int value, std::size_t size, std::size_t precision)
72 using namespace SqlColumnTypeDefinitions;
76 case SQL_BIGINT:
return Bigint {};
77 case SQL_BINARY:
return Binary { size };
78 case SQL_BIT:
return Bool {};
79 case SQL_CHAR:
return Char { size };
80 case SQL_DATE:
return Date {};
81 case SQL_DECIMAL:
return Decimal { .precision = precision, .scale = size };
82 case SQL_DOUBLE:
return Real { .precision = 53 };
83 case SQL_FLOAT:
return Real { . precision = precision };
84 case SQL_GUID:
return Guid {};
85 case SQL_INTEGER:
return Integer {};
86 case SQL_LONGVARBINARY:
return VarBinary { size };
87 case SQL_LONGVARCHAR:
return Varchar { size };
88 case SQL_NUMERIC:
return Decimal { .precision = precision, .scale = size };
89 case SQL_REAL:
return Real { .precision = 24 };
90 case SQL_SMALLINT:
return Smallint {};
91 case SQL_TIME:
return Time {};
92 case SQL_TIMESTAMP:
return DateTime {};
93 case SQL_TINYINT:
return Tinyint {};
94 case SQL_TYPE_DATE:
return Date {};
95 case SQL_TYPE_TIME:
return Time {};
96 case SQL_TYPE_TIMESTAMP:
return DateTime {};
97 case SQL_VARBINARY:
return Binary { size };
98 case SQL_VARCHAR:
return Varchar { size };
99 case SQL_WCHAR:
return NChar { size };
100 case SQL_WLONGVARCHAR:
return NVarchar { size };
101 case SQL_WVARCHAR:
return NVarchar { size };
102 case SQL_UNKNOWN_TYPE:
return std::nullopt;
103 default:
return std::nullopt;