Lightweight 0.20260303.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
12namespace Lightweight
13{
14
15/// @brief Query builder for building INSERT INTO ... queries.
16///
17/// @see SqlQueryBuilder
18/// @ingroup QueryBuilder
19class [[nodiscard]] SqlInsertQueryBuilder final
20{
21 public:
22 /// Constructs an INSERT query builder.
23 explicit SqlInsertQueryBuilder(SqlQueryFormatter const& formatter,
24 std::string tableName,
25 std::vector<SqlVariant>* inputBindings) noexcept;
26
27 /// Adds a single column to the INSERT query.
28 template <typename ColumnValue>
29 SqlInsertQueryBuilder& Set(std::string_view columnName, ColumnValue const& value);
30
31 /// Adds a single column to the INSERT query with the value being a string literal.
32 template <std::size_t N>
33 inline SqlInsertQueryBuilder& Set(std::string_view columnName, char const (&value)[N]);
34
35 /// Finalizes building the query as INSERT INTO ... query.
36 [[nodiscard]] inline std::string ToSql() const;
37
38 private:
39 SqlQueryFormatter const& m_formatter;
40 std::string m_tableName;
41 std::string m_fields;
42 std::string m_values;
43 std::vector<SqlVariant>* m_inputBindings;
44};
45
46inline LIGHTWEIGHT_FORCE_INLINE SqlInsertQueryBuilder::SqlInsertQueryBuilder(SqlQueryFormatter const& formatter,
47 std::string tableName,
48 std::vector<SqlVariant>* inputBindings) noexcept
49 :
50 m_formatter { formatter },
51 m_tableName { std::move(tableName) },
52 m_inputBindings { inputBindings }
53{
54}
55
56template <typename ColumnValue>
57SqlInsertQueryBuilder& SqlInsertQueryBuilder::Set(std::string_view columnName, ColumnValue const& value)
58{
59 using namespace std::string_view_literals;
60
61 if (!m_fields.empty())
62 m_fields += ", "sv;
63
64 m_fields += '"';
65 m_fields += columnName;
66 m_fields += '"';
67
68 if (!m_values.empty())
69 m_values += ", "sv;
70
71 if constexpr (std::is_same_v<ColumnValue, SqlNullType>)
72 m_values += "NULL"sv;
73 else if constexpr (std::is_same_v<ColumnValue, SqlWildcardType>)
74 m_values += '?';
75 else if (m_inputBindings)
76 {
77 m_values += '?';
78 m_inputBindings->emplace_back(value);
79 }
80 else if constexpr (std::is_same_v<ColumnValue, char>)
81 m_values += m_formatter.StringLiteral(value);
82 else if constexpr (std::is_arithmetic_v<ColumnValue>)
83 m_values += std::format("{}", value);
84 else if constexpr (std::is_convertible_v<ColumnValue, std::string>
85 || std::is_convertible_v<ColumnValue, std::string_view>
86 || std::is_convertible_v<ColumnValue, char const*>)
87 {
88 m_values += m_formatter.StringLiteral(value);
89 }
90 else
91 {
92 m_values += m_formatter.StringLiteral(std::format("{}", value));
93 }
94
95 return *this;
96}
97
98template <std::size_t N>
99inline SqlInsertQueryBuilder& SqlInsertQueryBuilder::Set(std::string_view columnName, char const (&value)[N])
100{
101 return Set(columnName, std::string_view { value, N - 1 });
102}
103
104inline std::string SqlInsertQueryBuilder::ToSql() const
105{
106 return m_formatter.Insert(m_tableName, m_fields, m_values);
107}
108
109} // namespace Lightweight
Query builder for building INSERT INTO ... queries.
Definition Insert.hpp:20
SqlInsertQueryBuilder(SqlQueryFormatter const &formatter, std::string tableName, std::vector< SqlVariant > *inputBindings) noexcept
Constructs an INSERT query builder.
Definition Insert.hpp:46
std::string ToSql() const
Finalizes building the query as INSERT INTO ... query.
Definition Insert.hpp:104
SqlInsertQueryBuilder & Set(std::string_view columnName, ColumnValue const &value)
Adds a single column to the INSERT query.
Definition Insert.hpp:57
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)