Lightweight 0.20250904.0
Loading...
Searching...
No Matches
SqlColumnTypeDefinitions.hpp
1// SPDX-License-Identifier: Apache-2.0
2
3#pragma once
4
5#if defined(_WIN32) || defined(_WIN64)
6 #include <Windows.h>
7#endif
8
9#include <optional>
10#include <variant>
11
12#include <sql.h>
13#include <sqlext.h>
14
15namespace Lightweight
16{
17
18namespace SqlColumnTypeDefinitions
19{
20
21 // clang-format off
22struct Bigint {};
23struct Binary { std::size_t size = 255; };
24struct Bool {};
25struct Char { std::size_t size = 1; };
26struct Date {};
27struct DateTime {};
28struct Decimal { std::size_t precision {}; std::size_t scale {}; };
29struct Guid {};
30struct Integer {};
31struct NChar { std::size_t size = 1; };
32struct NVarchar { std::size_t size = 255; };
33struct Real { std::size_t precision = {}; };
34struct Smallint {};
35struct Text { std::size_t size {}; };
36struct Time {};
37struct Timestamp {};
38struct Tinyint {};
39struct VarBinary { std::size_t size = 255; };
40struct Varchar { std::size_t size = 255; };
41 // clang-format on
42
43} // namespace SqlColumnTypeDefinitions
44
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>;
64
65/// Maps ODBC data type (with given @p size and @p precision) to SqlColumnTypeDefinition
66///
67/// @return SqlColumnTypeDefinition if the data type is supported, otherwise std::nullopt
68constexpr std::optional<SqlColumnTypeDefinition> MakeColumnTypeFromNative(int value, std::size_t size, std::size_t precision)
69{
70 // Maps ODBC data types to SqlColumnTypeDefinition
71 // See: https://learn.microsoft.com/en-us/sql/odbc/reference/appendixes/sql-data-types?view=sql-server-ver16
72 using namespace SqlColumnTypeDefinitions;
73 // clang-format off
74 switch (value)
75 {
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;
104 }
105 // clang-format on
106}
107
108} // namespace Lightweight