5#include "../SqlConnection.hpp"
6#include "../SqlQueryFormatter.hpp"
7#include "../SqlStatement.hpp"
9#include "BelongsTo.hpp"
34enum class SqlQueryExecutionMode : std::uint8_t
45template <
typename Record,
typename Derived, DataMapperOptions QueryOptions = {}>
53 std::vector<SqlVariant> _boundInputs;
57 LIGHTWEIGHT_FORCE_INLINE SqlSearchCondition& SearchCondition()
noexcept
59 return this->_query.searchCondition;
62 [[nodiscard]] LIGHTWEIGHT_FORCE_INLINE
SqlQueryFormatter const& Formatter()
const noexcept
82 return RunFinisher([
this] {
return ExistImpl(); });
88 return RunFinisher([
this] {
return CountImpl(); });
92 [[nodiscard]]
auto All()
94 return RunFinisher([
this] {
return AllImpl(); });
100 return RunFinisher([
this] {
return DeleteImpl(); });
115 template <auto Field>
116#if defined(LIGHTWEIGHT_CXX26_REFLECTION)
117 requires(is_aggregate_type(parent_of(
Field)))
119 requires std::is_member_object_pointer_v<
decltype(
Field)>
123 return RunFinisher([
this] {
return this->
template AllImpl<Field>(); });
139 template <
auto... ReferencedFields>
140 requires(
sizeof...(ReferencedFields) >= 2)
143 return RunFinisher([
this] {
return this->
template AllImpl<ReferencedFields...>(); });
149 return RunFinisher([
this] {
return FirstImpl(); });
157 template <auto Field>
158#if defined(LIGHTWEIGHT_CXX26_REFLECTION)
159 requires(is_aggregate_type(parent_of(
Field)))
161 requires std::is_member_object_pointer_v<
decltype(
Field)>
165 return RunFinisher([
this] {
return this->
template FirstImpl<Field>(); });
173 template <
auto... ReferencedFields>
174 requires(
sizeof...(ReferencedFields) >= 2)
177 return RunFinisher([
this] {
return this->
template FirstImpl<ReferencedFields...>(); });
183 return RunFinisher([
this, n] {
return FirstImpl(n); });
187 template <
auto... ReferencedFields>
190 return RunFinisher([
this, n] {
return this->
template FirstImpl<ReferencedFields...>(n); });
194 [[nodiscard]]
auto Range(
size_t offset,
size_t limit)
196 return RunFinisher([
this, offset, limit] {
return RangeImpl(offset, limit); });
200 template <
auto... ReferencedFields>
201 [[nodiscard]]
auto Range(
size_t offset,
size_t limit)
203 return RunFinisher([
this, offset, limit] {
return this->
template RangeImpl<ReferencedFields...>(offset, limit); });
218 template <
typename Finisher>
219 auto RunFinisher(Finisher finisher);
224 [[nodiscard]]
bool ExistImpl();
225 [[nodiscard]]
size_t CountImpl();
226 [[nodiscard]] std::vector<Record> AllImpl();
229 template <auto Field>
230#if defined(LIGHTWEIGHT_CXX26_REFLECTION)
231 requires(is_aggregate_type(parent_of(
Field)))
233 requires std::is_member_object_pointer_v<
decltype(
Field)>
235 [[nodiscard]]
auto AllImpl() -> std::vector<ReferencedFieldTypeOf<Field>>;
237 template <
auto... ReferencedFields>
238 requires(
sizeof...(ReferencedFields) >= 2)
239 [[nodiscard]]
auto AllImpl() -> std::vector<Record>;
241 [[nodiscard]] std::optional<Record> FirstImpl();
243 template <auto Field>
244#if defined(LIGHTWEIGHT_CXX26_REFLECTION)
245 requires(is_aggregate_type(parent_of(
Field)))
247 requires std::is_member_object_pointer_v<
decltype(
Field)>
249 [[nodiscard]]
auto FirstImpl() -> std::optional<ReferencedFieldTypeOf<Field>>;
251 template <
auto... ReferencedFields>
252 requires(
sizeof...(ReferencedFields) >= 2)
253 [[nodiscard]]
auto FirstImpl() -> std::optional<Record>;
255 [[nodiscard]] std::vector<Record> FirstImpl(
size_t n);
257 template <
auto... ReferencedFields>
258 [[nodiscard]] std::vector<Record> FirstImpl(
size_t n);
260 [[nodiscard]] std::vector<Record> RangeImpl(
size_t offset,
size_t limit);
262 template <
auto... ReferencedFields>
263 [[nodiscard]] std::vector<Record> RangeImpl(
size_t offset,
size_t limit);
273template <
typename Record,
274 DataMapperOptions QueryOptions,
275 SqlQueryExecutionMode Execution = SqlQueryExecutionMode::Synchronous>
286 static constexpr SqlQueryExecutionMode QueryExecution = Execution;
290 dm, std::move(fields)
295 static void ReadResults(SqlServerType sqlServerType,
SqlResultCursor reader, std::vector<Record>* records);
296 static void ReadResult(SqlServerType sqlServerType,
SqlResultCursor reader, std::optional<Record>* optionalRecord);
304template <
typename FirstRecord,
typename SecondRecord, DataMapperOptions QueryOptions, SqlQueryExecutionMode Execution>
307 std::tuple<FirstRecord, SecondRecord>,
308 SqlAllFieldsQueryBuilder<std::tuple<FirstRecord, SecondRecord>, QueryOptions, Execution>,
312 using RecordType = std::tuple<FirstRecord, SecondRecord>;
319 static constexpr SqlQueryExecutionMode QueryExecution = Execution;
324 QueryOptions> { dm, std::move(fields) }
328 static void ReadResults(SqlServerType sqlServerType, SqlResultCursor reader, std::vector<RecordType>* records);
Main API for mapping records to and from the database using high level C++ syntax.
Represents a query builder that retrieves all fields of a record.
auto All()
Executes a SELECT query and returns all records found for the specified field, only having the specif...
auto All()
Executes a SELECT query and returns all records found for the specified field.
auto Count()
Executes a SELECT COUNT query and returns the number of records found.
auto Delete()
Executes a DELETE query.
auto Range(size_t offset, size_t limit)
Executes a SELECT query for a range of records and returns them.
auto Range(size_t offset, size_t limit)
Executes a SELECT query for a range of records with only the specified fields populated.
auto First()
Executes the query to get a single scalar value from the first record found.
auto First(size_t n)
Executes a SELECT query for the first n records with only the specified fields populated.
auto First()
Executes a SELECT query for the first record found and returns it.
auto All()
Executes a SELECT query and returns all records found.
auto First(size_t n)
Executes a SELECT query for the first n records found and returns them.
auto First()
Executes a SELECT query for the first record found and returns it with only the specified fields popu...
API for reading an SQL query result set.
bool loadRelations
Whether to automatically load relations when querying records.
Represents a single column in a table.