Qx v0.7
Qt Extensions Library
Loading...
Searching...
No Matches
qx-sqlinlines.h
Go to the documentation of this file.
1#ifndef QX_SQLINLINES_H
2#define QX_SQLINLINES_H
3
4// Qt Includes
5#include <QString>
6
7// Intra-component Includes
9#include "qx/sql/qx-sqlstring.h"
10#include "qx/sql/__private/qx-sqlstring_helpers.h"
11
12// Extra-component Includes
14
15namespace QxSql
16{
17
18class Inline
19{
20 friend Qx::SqlString operator!(const Inline& i);
21 friend Qx::SqlString operator|=(const Inline& a, const Inline& b);
22 friend Qx::SqlString operator&=(const Inline& a, const Inline& b);
23//-Class Enums-------------------------------------------------------------
24public:
36
38//-Instance Variables-------------------------------------------------------------
39protected:
40 QString mStr;
41
42//-Constructor---------------------------------------------------------------------
43private:
44 // Prevents copy/move in all derived.
45 Inline(const Inline&) = delete;
46 Inline(Inline&&) = delete;
47 Inline& operator=(const Inline&) = delete;
48 Inline& operator=(Inline&&) = delete;
49
50protected:
51 inline explicit Inline() {}
52 inline explicit Inline(const QString& s) : mStr(s) {}
53
54//-Class-Functions------------------------------------------------------------
55protected:
56 inline static consteval bool enabled(Constructor set, Constructor flag)
57 {
58 return (static_cast<unsigned>(set) & static_cast<unsigned>(flag)) != 0;
59 }
61
62//-Operators----------------------------------------------------------------------
63public:
64 inline operator Qx::SqlString() const noexcept { return Qx::SqlString(mStr); }
65};
66
67template<Qx::CStringLiteral word, Inline::Constructor Cs>
68class ConcreteInline : public Inline
69{
70//-Constructor---------------------------------------------------------------------
71public:
72 // The extra qualification of the base class here for "enabled" is to workaround an ICE with GCC
73 inline explicit ConcreteInline() requires (Inline::enabled(Cs, Constructor::Default)) :
74 Inline(word.view())
75 {}
76
77 inline explicit ConcreteInline(const Qx::SqlString& s) requires (Inline::enabled(Cs, Constructor::SingleString)) :
78 Inline(word.view() + u" "_s + s.toString())
79 {}
80
81 template<Qx::sql_stringable First>
82 inline explicit ConcreteInline(First&& first) requires (Inline::enabled(Cs, Constructor::SingleStringable))
83 {
84 _QxPrivate::appendKeyword(mStr, word.view(), std::forward<First>(first));
85 }
86
87 template<Qx::sql_stringable First, Qx::sql_stringable ...Rest>
88 inline explicit ConcreteInline(First&& first, Rest&&... rest) requires (Inline::enabled(Cs, Constructor::MultiStringable))
89 {
90 _QxPrivate::appendKeyword(mStr, word.view(), std::forward<First>(first), std::forward<Rest>(rest)...);
91 }
92
93 // Doc here cause doxygen sucks
97 template<Qx::sql_stringable First, Qx::sql_stringable ...Rest>
98 inline explicit ConcreteInline(First&& first, Rest&&... rest) requires (Inline::enabled(Cs, Constructor::MultiStringableParen))
99 {
100 _QxPrivate::appendKeywordParen(mStr, word.view(), std::forward<First>(first), std::forward<Rest>(rest)...);
101 }
102
103 template <std::ranges::input_range R>
105 inline explicit ConcreteInline(const R& range) requires (Inline::enabled(Cs, Constructor::StringableRangeParen))
106 {
107 _QxPrivate::appendKeywordParen(mStr, word.view(), range);
108 }
109
110 inline explicit ConcreteInline(const Qx::SqlQuery& q) requires (Inline::enabled(Cs, Constructor::Query)) :
111 Inline(word.view() + u" ("_s + q.string() + u")"_s)
112 {}
113
114//-Operators----------------------------------------------------------------------
115public:
116 using Inline::operator Qx::SqlString;
117};
118
119//-Inline Words-------------------------------------------------------------------
123)>;
124
128)>;
129
133)>;
134
138)>;
139
142)>;
143
146)>;
147
150)>;
151
154)>;
155
158)>;
159
162)>;
163
166)>;
167
170)>;
171
174)>;
175
178)>;
179
183)>;
184
188)>;
189
193)>;
194
199)>;
200
201// TODO: If many operators end up here, make a separate implementation and these and the ones in qx-sqlstring.h can use
202//-Operators------------------------------------------------------------------------------------------------------
203// Standard
204inline Qx::SqlString operator!(const Inline& i) { return Qx::SqlString(u"NOT "_s + i.mStr); }
205
206// Special (see operator notes in qx-sqlstring.h)
207// Concat (with space):
208inline Qx::SqlString operator|=(const Inline& a, const Inline& b) { return Qx::SqlString(a.mStr + u" "_s + b.mStr); }
209// Concat: Chosen cause + is taken
210inline Qx::SqlString operator&=(const Inline& a, const Inline& b) { return Qx::SqlString(a.mStr + b.mStr); }
211
212}
213
214#endif // QX_SQLINLINES_H
The ConcreteInline class is used to implement each specific inline keyword.
Definition qx-sqlinlines.h:69
ConcreteInline(const Qx::SqlQuery &q)
Definition qx-sqlinlines.h:110
ConcreteInline()
Definition qx-sqlinlines.h:73
ConcreteInline(const Qx::SqlString &s)
Definition qx-sqlinlines.h:77
ConcreteInline(First &&first, Rest &&... rest)
Definition qx-sqlinlines.h:98
ConcreteInline(First &&first)
Definition qx-sqlinlines.h:82
ConcreteInline(First &&first, Rest &&... rest)
Definition qx-sqlinlines.h:88
ConcreteInline(const R &range)
Definition qx-sqlinlines.h:105
The Inline class is the base class from which all SQL inline keywords derive from.
Definition qx-sqlinlines.h:19
Constructor
Definition qx-sqlinlines.h:26
@ MultiStringableParen
Definition qx-sqlinlines.h:32
@ SingleStringable
Definition qx-sqlinlines.h:30
@ Default
Definition qx-sqlinlines.h:28
@ SingleString
Definition qx-sqlinlines.h:29
@ MultiStringable
Definition qx-sqlinlines.h:31
@ Query
Definition qx-sqlinlines.h:34
@ None
Definition qx-sqlinlines.h:27
@ StringableRangeParen
Definition qx-sqlinlines.h:33
SqlQuery is a base class from which all query types derive.
Definition qx-sqlquery.h:171
The SqlString class is a convenience class for more easily building SQL statements in a natural manne...
Definition qx-sqlstring.h:36
Specifies that a type can be converted to SqlString, or used to construct a SqlString.
Definition qx-sqlstring.h:33
The QxSql namespace contains several utilities that are specific to the SQL module and grouped togeth...
Definition qx-sqlconcepts.dox:10
ConcreteInline<"COUNT", Inline::Constructor( Inline::Constructor::SingleStringable)> COUNT
Definition qx-sqlinlines.h:148
ConcreteInline<"AS", Inline::Constructor( Inline::Constructor::Default| Inline::Constructor::SingleString)> AS
Definition qx-sqlinlines.h:135
ConcreteInline<"SUM", Inline::Constructor( Inline::Constructor::SingleStringable)> SUM
Definition qx-sqlinlines.h:152
ConcreteInline<"ANY", Inline::Constructor( Inline::Constructor::MultiStringable| Inline::Constructor::Query)> ANY
Definition qx-sqlinlines.h:120
ConcreteInline<"MIN", Inline::Constructor( Inline::Constructor::SingleStringable)> MIN
Definition qx-sqlinlines.h:156
ConcreteInline<"LIKE", Inline::Constructor( Inline::Constructor::Default| Inline::Constructor::SingleString)> LIKE
Definition qx-sqlinlines.h:180
ConcreteInline<"UNKNOWN", Inline::Constructor( Inline::Constructor::Default)> UNKNOWN
Definition qx-sqlinlines.h:144
ConcreteInline<"SOME", Inline::Constructor( Inline::Constructor::MultiStringable| Inline::Constructor::Query)> SOME
Definition qx-sqlinlines.h:125
Qx::SqlString operator|=(const Inline &a, const Inline &b)
Definition qx-sqlinlines.h:208
ConcreteInline<"ALL", Inline::Constructor( Inline::Constructor::MultiStringable| Inline::Constructor::Query)> ALL
Definition qx-sqlinlines.h:130
Qx::SqlString operator!(const Inline &i)
Definition qx-sqlinlines.h:204
ConcreteInline<"DESC", Inline::Constructor( Inline::Constructor::Default)> DESC
Definition qx-sqlinlines.h:176
ConcreteInline<"NUL", Inline::Constructor( Inline::Constructor::Default)> NUL
Definition qx-sqlinlines.h:140
ConcreteInline<"AVG", Inline::Constructor( Inline::Constructor::SingleStringable)> AVG
Definition qx-sqlinlines.h:164
ConcreteInline<"ESCAPE", Inline::Constructor( Inline::Constructor::Default| Inline::Constructor::SingleString)> ESCAPE
Definition qx-sqlinlines.h:190
Qx::SqlString operator&=(const Inline &a, const Inline &b)
Definition qx-sqlinlines.h:210
ConcreteInline<"MAX", Inline::Constructor( Inline::Constructor::SingleStringable)> MAX
Definition qx-sqlinlines.h:160
ConcreteInline<"DEFAULT", Inline::Constructor( Inline::Constructor::Default)> DEFAULT
Definition qx-sqlinlines.h:168
ConcreteInline<"IN", Inline::Constructor( Inline::Constructor::MultiStringableParen| Inline::Constructor::StringableRangeParen| Inline::Constructor::Query)> IN
Definition qx-sqlinlines.h:195
ConcreteInline<"ILIKE", Inline::Constructor( Inline::Constructor::Default| Inline::Constructor::SingleString)> ILIKE
Definition qx-sqlinlines.h:185
ConcreteInline<"ASC", Inline::Constructor( Inline::Constructor::Default)> ASC
Definition qx-sqlinlines.h:172
The qx-sql header file offers a straightforward interface for querying an SQL database.
The qx-typetraits header file provides a library of general purpose type-traits as an extension of th...