Lightweight 0.1.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 SqlColumnTypeDefinitions
16{
17
18// clang-format off
19struct Bigint {};
20struct Binary { std::size_t size = 255; };
21struct Bool {};
22struct Char { std::size_t size = 1; };
23struct Date {};
24struct DateTime {};
25struct Decimal { std::size_t precision {}; std::size_t scale {}; };
26struct Guid {};
27struct Integer {};
28struct NChar { std::size_t size = 1; };
29struct NVarchar { std::size_t size = 255; };
30struct Real {};
31struct Smallint {};
32struct Text { std::size_t size {}; };
33struct Time {};
34struct Timestamp {};
35struct Tinyint {};
36struct VarBinary { std::size_t size = 255; };
37struct Varchar { std::size_t size = 255; };
38// clang-format on
39
40} // namespace SqlColumnTypeDefinitions
41
42using SqlColumnTypeDefinition = std::variant<SqlColumnTypeDefinitions::Bigint,
43 SqlColumnTypeDefinitions::Binary,
44 SqlColumnTypeDefinitions::Bool,
45 SqlColumnTypeDefinitions::Char,
46 SqlColumnTypeDefinitions::Date,
47 SqlColumnTypeDefinitions::DateTime,
48 SqlColumnTypeDefinitions::Decimal,
49 SqlColumnTypeDefinitions::Guid,
50 SqlColumnTypeDefinitions::Integer,
51 SqlColumnTypeDefinitions::NChar,
52 SqlColumnTypeDefinitions::NVarchar,
53 SqlColumnTypeDefinitions::Real,
54 SqlColumnTypeDefinitions::Tinyint,
55 SqlColumnTypeDefinitions::Smallint,
56 SqlColumnTypeDefinitions::Text,
57 SqlColumnTypeDefinitions::Time,
58 SqlColumnTypeDefinitions::Timestamp,
59 SqlColumnTypeDefinitions::VarBinary,
60 SqlColumnTypeDefinitions::Varchar>;
61
62/// Maps ODBC data type (with given @p size and @p precision) to SqlColumnTypeDefinition
63///
64/// @return SqlColumnTypeDefinition if the data type is supported, otherwise std::nullopt
65constexpr std::optional<SqlColumnTypeDefinition> MakeColumnTypeFromNative(int value, std::size_t size, std::size_t precision)
66{
67 // Maps ODBC data types to SqlColumnTypeDefinition
68 // See: https://learn.microsoft.com/en-us/sql/odbc/reference/appendixes/sql-data-types?view=sql-server-ver16
69 using namespace SqlColumnTypeDefinitions;
70 // clang-format off
71 switch (value)
72 {
73 case SQL_BIGINT: return Bigint {};
74 case SQL_BINARY: return Binary { size };
75 case SQL_BIT: return Bool {};
76 case SQL_CHAR: return Char { size };
77 case SQL_DATE: return Date {};
78 case SQL_DECIMAL: return Decimal { .precision = precision, .scale = size };
79 case SQL_DOUBLE: return Real {};
80 case SQL_FLOAT: return Real {};
81 case SQL_GUID: return Guid {};
82 case SQL_INTEGER: return Integer {};
83 case SQL_LONGVARBINARY: return VarBinary { size };
84 case SQL_LONGVARCHAR: return Varchar { size };
85 case SQL_NUMERIC: return Decimal { .precision = precision, .scale = size };
86 case SQL_REAL: return Real {};
87 case SQL_SMALLINT: return Smallint {};
88 case SQL_TIME: return Time {};
89 case SQL_TIMESTAMP: return DateTime {};
90 case SQL_TINYINT: return Tinyint {};
91 case SQL_TYPE_DATE: return Date {};
92 case SQL_TYPE_TIME: return Time {};
93 case SQL_TYPE_TIMESTAMP: return DateTime {};
94 case SQL_VARBINARY: return Binary { size };
95 case SQL_VARCHAR: return Varchar { size };
96 case SQL_WCHAR: return NChar { size };
97 case SQL_WLONGVARCHAR: return NVarchar { size };
98 case SQL_WVARCHAR: return NVarchar { size };
99 case SQL_UNKNOWN_TYPE: return std::nullopt;
100 default: return std::nullopt;
101 }
102 // clang-format on
103}