Qx v0.7.0.3
Qt Extensions Library
Loading...
Searching...
No Matches
qx-sqlstring.h
1#ifndef QX_SQLSTRING_H
2#define QX_SQLSTRING_H
3
4// Shared Lib Support
5#include "qx/sql/qx_sql_export.h"
6
7// Extra-component Includes
9
10using namespace Qt::StringLiterals;
11
12// Forwards
13class QUuid;
14namespace Qx
15{
16class SqlQuery;
17class SqlString;
18}
19
20namespace QxSql
21{
22inline Qx::SqlString operator""_sq(const char16_t* str, size_t size) noexcept;
23inline Qx::SqlString operator""_sqi(const char16_t* str, size_t size) noexcept;
24inline Qx::SqlString operator""_sqs(const char16_t* str, size_t size) noexcept;
25};
26
27namespace Qx
28{
29template<typename T>
30concept sql_string = std::same_as<T, SqlString>;
31
32template<typename T>
33concept sql_stringable = std::convertible_to<T, SqlString> || std::constructible_from<SqlString, T>;
34
35class QX_SQL_EXPORT SqlString
36{
37 friend SqlString QxSql::operator""_sq(const char16_t* str, size_t size) noexcept;
38 friend SqlString QxSql::operator""_sqi(const char16_t* str, size_t size) noexcept;
39 friend SqlString QxSql::operator""_sqs(const char16_t* str, size_t size) noexcept;
40 friend SqlString operator!(const SqlString& s);
41 friend SqlString operator&&(const SqlString& a, const SqlString& b);
42 friend SqlString operator||(const SqlString& a, const SqlString& b);
43 friend SqlString operator==(const SqlString& a, const SqlString& b);
44 friend SqlString operator!=(const SqlString& a, const SqlString& b);
45 friend SqlString operator<(const SqlString& a, const SqlString& b);
46 friend SqlString operator<=(const SqlString& a, const SqlString& b);
47 friend SqlString operator>(const SqlString& a, const SqlString& b);
48 friend SqlString operator>=(const SqlString& a, const SqlString& b);
49 friend SqlString operator+(const SqlString& a, const SqlString& b);
50 friend SqlString operator-(const SqlString& a, const SqlString& b);
51 friend SqlString operator*(const SqlString& a, const SqlString& b);
52 friend SqlString operator/(const SqlString& a, const SqlString& b);
53 friend SqlString operator^=(const SqlString& a, const SqlString& b);
54 friend SqlString operator==(const SqlString& a, const SqlQuery& b);
55 friend SqlString operator!=(const SqlString& a, const SqlQuery& b);
56 friend SqlString operator<(const SqlString& a, const SqlQuery& b);
57 friend SqlString operator<=(const SqlString& a, const SqlQuery& b);
58 friend SqlString operator>(const SqlString& a, const SqlQuery& b);
59 friend SqlString operator>=(const SqlString& a, const SqlQuery& b);
60 friend SqlString operator|=(const SqlString& a, const SqlString& b);
61 friend SqlString operator&=(const SqlString& a, const SqlString& b);
62
63//-Class Enums------------------------------------------------------------------------------------------------
64private:
65 enum Type { Default, Identifier, Literal };
66
67//-Instance Variables-----------------------------------------------------------------------------------------------
68private:
69 QString mStr;
70
71//-Constructor-------------------------------------------------------------------------------------------------
72private:
73 explicit SqlString(const char16_t* str, size_t size, Type type = Default);
74
75public:
76 explicit SqlString();
77 explicit SqlString(QString&& str); // Could possibly be implicit instead
78 explicit SqlString(const QString& str); // Could possibly be implicit instead
79
80 SqlString(bool b);
81 SqlString(const QUuid& id);
82
83 template<Qx::arithmetic N>
84 SqlString(N n) : mStr(QString::number(n)) {}
85
86 /* This is likely too broad, as it's better if we only allow a subquery to be inserted where it makes sense,
87 * though if we get stuck on how to enable use of a subquery somewhere, this can be enabled as a fallback, as
88 * the functions that explicitly take SqlQuery will be preferred over implicitly converting to SqlString anyway
89 */
90 //SqlString(const SqlQuery& q);
91
92//-Class Functions------------------------------------------------------------------------------------------------------
93public:
94 static SqlString makeRegular(const char16_t* str) noexcept;
95 static SqlString makeIdentifier(const char16_t* str) noexcept;
96 static SqlString makeLiteral(const char16_t* str) noexcept;
97
98//-Instance Functions------------------------------------------------------------------------------------------------------
99public:
100 QString toString() const;
101 bool isEmpty() const;
102
103//-Operators------------------------------------------------------------------------------------------------------
104public:
105 SqlString& operator+=(const SqlString& s) { mStr += s.mStr; return *this; }
106};
107
108//-Operators------------------------------------------------------------------------------------------------------
109// Standard
110inline SqlString operator!(const SqlString& s) { return SqlString(u"NOT "_s + s.mStr); }
111inline SqlString operator&&(const SqlString& a, const SqlString& b) { return SqlString(u"("_s + a.mStr + u" AND "_s + b.mStr + u")"_s); }
112inline SqlString operator||(const SqlString& a, const SqlString& b) { return SqlString(u"("_s + a.mStr + u" OR "_s + b.mStr + u")"_s); }
113inline SqlString operator==(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" = "_s + b.mStr); }
114inline SqlString operator!=(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" <> "_s + b.mStr); }
115inline SqlString operator<(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" < "_s + b.mStr); }
116inline SqlString operator<=(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" <= "_s + b.mStr); }
117inline SqlString operator>(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" > "_s + b.mStr); }
118inline SqlString operator>=(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" >= "_s + b.mStr); }
119inline SqlString operator+(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" + "_s + b.mStr); }
120inline SqlString operator-(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" - "_s + b.mStr); }
121inline SqlString operator*(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" * "_s + b.mStr); }
122inline SqlString operator/(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" / "_s + b.mStr); }
123// Sub for = since we cannot override operator=() sensibly
124inline SqlString operator^=(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" = "_s + b.mStr); }
125
126// Sub-query
127SqlString operator==(const SqlString& s, const SqlQuery& q);
128SqlString operator!=(const SqlString& s, const SqlQuery& q);
129SqlString operator<(const SqlString& s, const SqlQuery& q);
130SqlString operator<=(const SqlString& s, const SqlQuery& q);
131SqlString operator>(const SqlString& s, const SqlQuery& q);
132SqlString operator>=(const SqlString& s, const SqlQuery& q);
133
134// TODO: To minimize confusion we may want to get rid of these and make them methods, though the user would differ
135// Special (use of assignment operators for non-assignment here is because many operators are already used in SQL)
136// Concat (with space): Chosen cause + is taken and separating words with just a space is generally only use for
137// shorthand aliases and "or equal" kind of matches saying "this is an alias", like "otherwise known as"
138inline SqlString operator|=(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + u" "_s + b.mStr); }
139// Concat: Chosen cause + is taken
140inline SqlString operator&=(const SqlString& a, const SqlString& b) { return SqlString(a.mStr + b.mStr); }
141
142} // namespace Qx
143
144namespace QxSql
145{
146
147inline Qx::SqlString operator""_sq(const char16_t* str, size_t size) noexcept { return Qx::SqlString(str, size); }
148inline Qx::SqlString operator""_sqi(const char16_t* str, size_t size) noexcept { return Qx::SqlString(str, size, Qx::SqlString::Identifier); }
149inline Qx::SqlString operator""_sqs(const char16_t* str, size_t size) noexcept { return Qx::SqlString(str, size, Qx::SqlString::Literal); }
150
151inline Qx::SqlString sq(const QString& s) noexcept { return Qx::SqlString(s); }
152inline Qx::SqlString sqi(const QString& s) noexcept { return Qx::SqlString(u'"' + s + u'"'); }
153inline Qx::SqlString sqs(const QString& s) noexcept { return Qx::SqlString(u'\'' + s + u'\''); }
154}
155
156#endif // QX_SQLSTRING_H
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
SqlString & operator+=(const SqlString &s)
Definition qx-sqlstring.h:105
SqlString(N n)
Definition qx-sqlstring.h:84
Specifies that a type is the same as SqlString.
Definition qx-sqlstring.h:30
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
Qx::SqlString sqs(const QString &s) noexcept
Definition qx-sqlstring.h:153
Qx::SqlString sq(const QString &s) noexcept
Definition qx-sqlstring.h:151
Qx::SqlString sqi(const QString &s) noexcept
Definition qx-sqlstring.h:152
The Qx namespace is the main namespace through which all non-global functionality of the Qx library i...
Definition qx-abstracterror.cpp:13
SqlString operator&&(const SqlString &a, const SqlString &b)
Definition qx-sqlstring.h:111
SqlString operator*(const SqlString &a, const SqlString &b)
Definition qx-sqlstring.h:121
SqlString operator<=(const SqlString &s, const Qx::SqlQuery &q)
Definition qx-sqlstring.cpp:229
SqlString operator!(const SqlString &s)
Definition qx-sqlstring.h:110
SqlString operator<(const SqlString &s, const Qx::SqlQuery &q)
Definition qx-sqlstring.cpp:224
SqlString operator>=(const SqlString &s, const Qx::SqlQuery &q)
Definition qx-sqlstring.cpp:239
SqlString operator&=(const SqlString &a, const SqlString &b)
Definition qx-sqlstring.h:140
SqlString operator!=(const SqlString &s, const Qx::SqlQuery &q)
Definition qx-sqlstring.cpp:219
SqlString operator|=(const SqlString &a, const SqlString &b)
Definition qx-sqlstring.h:138
SqlString operator||(const SqlString &a, const SqlString &b)
Definition qx-sqlstring.h:112
SqlString operator+(const SqlString &a, const SqlString &b)
Definition qx-sqlstring.h:119
SqlString operator/(const SqlString &a, const SqlString &b)
Definition qx-sqlstring.h:122
SqlString operator>(const SqlString &s, const Qx::SqlQuery &q)
Definition qx-sqlstring.cpp:234
SqlString operator-(const SqlString &a, const SqlString &b)
Definition qx-sqlstring.h:120
SqlString operator^=(const SqlString &a, const SqlString &b)
Definition qx-sqlstring.h:124
SqlString operator==(const SqlString &s, const Qx::SqlQuery &q)
Definition qx-sqlstring.cpp:214
The qx-concepts header file provides a library of general purpose concepts as an extension of the sta...