14#include <AUI/Autumn/Autumn.h>
15#include <AUI/Common/AString.h>
16#include <AUI/Common/AVariant.h>
17#include <AUI/Common/AVector.h>
18#include <AUI/Common/AMap.h>
19#include <AUI/Common/AStringVector.h>
20#include <AUI/Reflect/AField.h>
21#include <AUI/Data/ASqlDatabase.h>
22#include <AUI/Traits/parameter_pack.h>
24template<
typename ModelType>
30class API_AUI_DATA ASqlBuilder {
35 class API_AUI_DATA Statement {
37 ASqlBuilder& mBuilder;
40 Statement(ASqlBuilder& builder,
const AString& sql);
41 Statement(
const Statement&) =
delete;
43 virtual ~Statement() =
default;
58 class API_AUI_DATA Insert:
public Statement {
59 friend class ASqlBuilder;
62 bool mInsertDone =
false;
64 Insert(ASqlBuilder& builder,
const AString& sql);
68 Insert(
const Insert&) =
delete;
75 class API_AUI_DATA WhereStatement:
public Statement {
77 ~WhereStatement()
override =
default;
79 class API_AUI_DATA WhereExpr {
80 friend class WhereStatement;
86 WhereExpr() =
default;
87 explicit WhereExpr(
const AString& exprString);
89 static std::tuple<AString, AVector<AVariant>> unpack(
const WhereExpr& e) {
90 return std::make_tuple(e.mExprString, e.mWhereParams);
93 inline WhereExpr& operator>(
const AVariant& other) {
94 mExprString +=
" > ?";
95 mWhereParams << other;
98 inline WhereExpr& operator>=(
const AVariant& other) {
99 mExprString +=
" >= ?";
100 mWhereParams << other;
103 inline WhereExpr& operator<(
const AVariant& other) {
104 mExprString +=
" < ?";
105 mWhereParams << other;
108 inline WhereExpr& operator<=(
const AVariant& other) {
109 mExprString +=
" <= ?";
110 mWhereParams << other;
113 inline WhereExpr& operator==(
const AVariant& other) {
114 mExprString +=
" = ?";
115 mWhereParams << other;
118 inline WhereExpr& operator!=(
const AVariant& other) {
119 mExprString +=
" != ?";
120 mWhereParams << other;
124 inline WhereExpr& operator&&(
const WhereExpr& other) {
125 mExprString +=
" and " + other.mExprString;
126 mWhereParams.
insertAll(other.mWhereParams);
129 inline WhereExpr& operator||(
const WhereExpr& other) {
130 mExprString +=
" or " + other.mExprString;
131 mWhereParams.
insertAll(other.mWhereParams);
140 WhereStatement(ASqlBuilder& builder,
const AString& sql);
144 class API_AUI_DATA Select:
public WhereStatement {
145 friend class ASqlBuilder;
149 Select(ASqlBuilder& builder,
const AString& sql);
152 Select(
const Select&) =
delete;
153 ~Select()
override =
default;
170 template<
class Model>
172 auto idField = AField<ASqlModel<Model>>::make(&ASqlModel<Model>::id);
174 result.reserve(0x100);
178 auto dbResult = Autumn::get<ASqlDatabase>()->query(mSql, mWhereParams);
182 fields << AModelMeta<Model>::getFields().valueVector();
198 for (
auto& row : dbResult) {
200 idField->set(m, row->getValue(0));
201 for (
size_t columnIndex = 1; columnIndex < dbResult->getColumns().size(); ++columnIndex) {
202 fields[columnIndex - 1]->set(m, row->getValue(columnIndex));
204 result << std::move(m);
211 class API_AUI_DATA Update:
public WhereStatement {
212 friend class ASqlBuilder;
219 Update(
const Update&) =
delete;
227 void set(
const AString& key,
const AVariant& value) {
228 mValues[key] = value;
232 class API_AUI_DATA Delete:
public WhereStatement {
233 friend class ASqlBuilder;
237 Delete(ASqlBuilder& builder,
const AString& sql);
240 Delete(
const Delete&) =
delete;
249 ASqlBuilder(
const AString& tableName);
264 template<
typename... Args>
267 aui::parameter_pack::for_each([&](
const AString& s) {
269 }, std::forward<Args>(args)...);
286 template<
typename... Args>
289 aui::parameter_pack::for_each([&](
const AString& s) {
291 }, std::forward<Args>(args)...);
315 template<
typename Model>
317 Insert insertStatement =
insert(AModelMeta<Model>::getFields().keyVector());
320 for (std::pair<
AString,
_<AField<Model>>> field : AModelMeta<Model>::getFields()) {
321 row << field.second->get(model);
323 insertStatement.row(row);
324 return insertStatement.rowId();
332 template<
typename Model>
337 for (
const std::pair<
AString,
_<AField<Model>>>& field : AModelMeta<Model>::getFields()) {
338 if (field.first !=
"id")
339 updateStatement.set(field.first, field.second->get(model));
349 template<
typename Model>
A std::map with AUI extensions.
Definition AMap.h:218
Definition ASqlBuilder.h:232
Definition ASqlBuilder.h:58
Definition ASqlBuilder.h:144
AVector< Model > as()
Gets query result in ORM.
Definition ASqlBuilder.h:171
AVector< AVector< AVariant > > get()
Gets query result.
ASqlBuilder & also()
Does the another request to the same table.
Definition ASqlBuilder.h:53
Definition ASqlBuilder.h:211
Definition ASqlBuilder.h:79
Definition ASqlBuilder.h:30
Insert ins(Args &&... args)
Does the INSERT query to DB.
Definition ASqlBuilder.h:265
Select select(const AStringVector &columnNames={})
Does the SELECT query to DB.
void removeORM(const Model &model)
Removes ORM object.
Definition ASqlBuilder.h:350
Delete remove()
Does the DELETE query to DB.
Insert insert(const AStringVector &columnNames)
Does the INSERT query to DB.
void updateORM(const Model &model)
Updates ORM object.
Definition ASqlBuilder.h:333
Select sel(Args &&... args)
Does the SELECT query to DB.
Definition ASqlBuilder.h:287
Update update(const AMap< AString, AVariant > &data={})
Does the UPDATE query to DB.
id_t insertORM(const Model &model)
Inserts ORM object.
Definition ASqlBuilder.h:316
An AVector with string-related functions.
Definition AStringVector.h:22
Represents a Unicode character string.
Definition AString.h:38
void insertAll(const OtherContainer &c) noexcept
Inserts all values of the specified container to the end.
Definition AString.h:294
A std::vector with AUI extensions.
Definition AVector.h:39
An std::weak_ptr with AUI extensions.
Definition SharedPtrTypes.h:179
Defines a model that can be stored in an SQL database. Implements queries for this type to the databa...
Definition ASqlModel.h:26