Lightweight 0.20250627.0
Loading...
Searching...
No Matches
Insert.hpp
1// SPDX-License-Identifier: Apache-2.0
2
3#pragma once
4
5#include "Core.hpp"
6
7#include <cassert>
8#include <string>
9#include <string_view>
10#include <vector>
11
12/// @brief Query builder for building INSERT INTO ... queries.
13///
14/// @see SqlQueryBuilder
15/// @ingroup QueryBuilder
16class [[nodiscard]] SqlInsertQueryBuilder final
17{
18 public:
19 explicit SqlInsertQueryBuilder(SqlQueryFormatter const& formatter,
20 std::string tableName,
21 std::vector<SqlVariant>* inputBindings) noexcept;
22
23 // Adds a single column to the INSERT query.
24 template <typename ColumnValue>
25 SqlInsertQueryBuilder& Set(std::string_view columnName, ColumnValue const& value);
26
27 // Adds a single column to the INSERT query with the value being a string literal.
28 template <std::size_t N>
29 inline SqlInsertQueryBuilder& Set(std::string_view columnName, char const (&value)[N]);
30
31 // Adds a single column to the INSERT query with the value being a MFC like CString.
32 inline SqlInsertQueryBuilder& Set(std::string_view columnName, MFCStringLike auto const* value);
33
34 // Finalizes building the query as INSERT INTO ... query.
35 [[nodiscard]] LIGHTWEIGHT_API std::string ToSql() const;
36
37 private:
38 SqlQueryFormatter const& m_formatter;
39 std::string m_tableName;
40 std::string m_fields;
41 std::string m_values;
42 std::vector<SqlVariant>* m_inputBindings;
43};
44
45inline LIGHTWEIGHT_FORCE_INLINE SqlInsertQueryBuilder::SqlInsertQueryBuilder(SqlQueryFormatter const& formatter,
46 std::string tableName,
47 std::vector<SqlVariant>* inputBindings) noexcept
48 :
49 m_formatter { formatter },
50 m_tableName { std::move(tableName) },
51 m_inputBindings { inputBindings }
52{
53}
54
55template <typename ColumnValue>
56SqlInsertQueryBuilder& SqlInsertQueryBuilder::Set(std::string_view columnName, ColumnValue const& value)
57{
58 using namespace std::string_view_literals;
59
60 if (!m_fields.empty())
61 m_fields += ", "sv;
62
63 m_fields += '"';
64 m_fields += columnName;
65 m_fields += '"';
66
67 if (!m_values.empty())
68 m_values += ", "sv;
69
70 if constexpr (std::is_same_v<ColumnValue, SqlNullType>)
71 m_values += "NULL"sv;
72 else if constexpr (std::is_same_v<ColumnValue, SqlWildcardType>)
73 m_values += '?';
74 else if (m_inputBindings)
75 {
76 m_values += '?';
77 m_inputBindings->emplace_back(value);
78 }
79 else if constexpr (std::is_same_v<ColumnValue, char>)
80 m_values += m_formatter.StringLiteral(value);
81 else if constexpr (std::is_arithmetic_v<ColumnValue>)
82 m_values += std::format("{}", value);
83 else if constexpr (std::is_convertible_v<ColumnValue, std::string>
84 || std::is_convertible_v<ColumnValue, std::string_view>
85 || std::is_convertible_v<ColumnValue, char const*>)
86 {
87 m_values += m_formatter.StringLiteral(value);
88 }
89 else
90 {
91 m_values += m_formatter.StringLiteral(std::format("{}", value));
92 }
93
94 return *this;
95}
96
97template <std::size_t N>
98inline SqlInsertQueryBuilder& SqlInsertQueryBuilder::Set(std::string_view columnName, char const (&value)[N])
99{
100 return Set(columnName, std::string_view { value, N - 1 });
101}
102
103inline SqlInsertQueryBuilder& SqlInsertQueryBuilder::Set(std::string_view columnName, MFCStringLike auto const* value)
104{
105 return Set(columnName, std::string_view { value->GetString(), value->GetLength() });
106}
107
108inline std::string SqlInsertQueryBuilder::ToSql() const
109{
110 return m_formatter.Insert(m_tableName, m_fields, m_values);
111}
Query builder for building INSERT INTO ... queries.
Definition Insert.hpp:17
API to format SQL queries for different SQL dialects.
virtual std::string StringLiteral(std::string_view value) const noexcept=0
Converts a string value to a string literal.
virtual std::string Insert(std::string_view intoTable, std::string_view fields, std::string_view values) const =0
LIGHTWEIGHT_API std::vector< std::string > ToSql(SqlQueryFormatter const &formatter, SqlMigrationPlanElement const &element)