Skip to content

Commit 95f87da

Browse files
committed
Preapred delete query
1 parent ebb24e6 commit 95f87da

File tree

3 files changed

+118
-7
lines changed

3 files changed

+118
-7
lines changed

src/tests/test_delete.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**********************************************************************************
2+
* MIT License
3+
*
4+
* Copyright (c) 2025-2026 Evgenii Sopov <mrseakg@gmail.com>
5+
*
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
*
13+
* The above copyright notice and this permission notice shall be included in
14+
*all copies or substantial portions of the Software.
15+
*
16+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+
* SOFTWARE.
23+
*
24+
* Official Source Code: https://github.com/wsjcpp/wsjcpp-sql-builder
25+
*
26+
***********************************************************************************/
27+
28+
#include <iostream>
29+
#include <wsjcpp_sql_builder.h>
30+
31+
int main() {
32+
WsjcppSqlBuilder builder;
33+
builder.deleteFrom("table4")
34+
.where()
35+
.equal("col1", "1")
36+
.or_()
37+
.notEqual("col2", "2")
38+
.or_()
39+
.subCondition()
40+
.equal("c3", "4")
41+
// .and_() // be default must be added and
42+
.equal("col2", "5")
43+
.finishSubCondition()
44+
.or_()
45+
.lessThen("col4", 111)
46+
;
47+
48+
if (builder.hasErrors()) {
49+
std::cerr << "Select builder has some errors" << std::endl;
50+
return -1;
51+
}
52+
std::string sqlQuery = builder.sql();
53+
std::string sqlQueryExpected = "DELETE FROM table4 WHERE col1 = '1' OR col2 <> '2' OR (c3 = '4' AND col2 = '5') OR col4 < 111";
54+
if (sqlQuery != sqlQueryExpected) {
55+
std::cerr
56+
<< "Expected:" << std::endl
57+
<< " {" << sqlQueryExpected << "}" << std::endl
58+
<< ", but got:" << std::endl
59+
<< " {" << sqlQuery << "}" << std::endl
60+
;
61+
return -1;
62+
}
63+
64+
return 0;
65+
}

src/wsjcpp_sql_builder.cpp

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ std::string WsjcppSqlInsert::sql() {
317317
// WsjcppSqlUpdate
318318

319319
WsjcppSqlUpdate::WsjcppSqlUpdate(const std::string &tableName, WsjcppSqlBuilder *builder)
320-
: WsjcppSqlQuery(WsjcppSqlQueryType::INSERT, builder, tableName) {
320+
: WsjcppSqlQuery(WsjcppSqlQueryType::UPDATE, builder, tableName) {
321321

322322
}
323323

@@ -377,6 +377,31 @@ std::string WsjcppSqlUpdate::sql() {
377377
};
378378

379379

380+
// ---------------------------------------------------------------------
381+
// WsjcppSqlDelete
382+
383+
WsjcppSqlDelete::WsjcppSqlDelete(const std::string &tableName, WsjcppSqlBuilder *builder)
384+
: WsjcppSqlQuery(WsjcppSqlQueryType::DELETE, builder, tableName) {
385+
386+
}
387+
388+
WsjcppSqlWhere<WsjcppSqlDelete> &WsjcppSqlDelete::where() {
389+
if (!m_where) {
390+
m_where = std::make_shared<WsjcppSqlWhere<WsjcppSqlDelete>>(nullptr, builderRawPtr(), this);
391+
}
392+
return *(m_where.get());
393+
}
394+
395+
std::string WsjcppSqlDelete::sql() {
396+
std::string ret = "DELETE FROM " + tableName();
397+
398+
if (m_where) {
399+
ret += " WHERE " + m_where->sql();
400+
}
401+
402+
return ret;
403+
};
404+
380405
// ---------------------------------------------------------------------
381406
// WsjcppSqlBuilder
382407

@@ -414,11 +439,19 @@ WsjcppSqlUpdate &WsjcppSqlBuilder::findUpdateOrCreate(const std::string &tableNa
414439
return update(tableName);
415440
}
416441

417-
// WsjcppSqlBuilder &WsjcppSqlBuilder::makeDelete(const std::string &tableName) {
418-
// m_tableName = tableName;
419-
// m_nSqlType = WsjcppSqlQueryType::DELETE;
420-
// return *this;
421-
// }
442+
WsjcppSqlDelete &WsjcppSqlBuilder::deleteFrom(const std::string &tableName) {
443+
m_queries.push_back(std::make_shared<WsjcppSqlDelete>(tableName, this));
444+
return *(WsjcppSqlDelete *)(m_queries[m_queries.size() -1].get());
445+
}
446+
447+
WsjcppSqlDelete &WsjcppSqlBuilder::findDeleteOrCreate(const std::string &tableName) {
448+
for (auto query : m_queries) {
449+
if (query->sqlType() == WsjcppSqlQueryType::DELETE && query->tableName() == tableName) {
450+
return *(WsjcppSqlDelete *)(query.get());
451+
}
452+
}
453+
return deleteFrom(tableName);
454+
}
422455

423456
bool WsjcppSqlBuilder::hasErrors() {
424457
return m_errors.size() > 0;

src/wsjcpp_sql_builder.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,18 @@ class WsjcppSqlUpdate : public WsjcppSqlQuery {
276276
std::map<std::string, std::string> m_values;
277277
};
278278

279+
class WsjcppSqlDelete : public WsjcppSqlQuery {
280+
public:
281+
WsjcppSqlDelete(const std::string &tableName, WsjcppSqlBuilder *builder);
282+
283+
WsjcppSqlWhere<WsjcppSqlDelete> &where();
284+
285+
virtual std::string sql() override;
286+
287+
private:
288+
std::shared_ptr<WsjcppSqlWhere<WsjcppSqlDelete>> m_where;
289+
};
290+
279291
class WsjcppSqlBuilder {
280292
public:
281293
// TODO begin / end transaction can be added here
@@ -285,7 +297,8 @@ class WsjcppSqlBuilder {
285297
WsjcppSqlInsert &findInsertOrCreate(const std::string &tableName);
286298
WsjcppSqlUpdate &update(const std::string &tableName);
287299
WsjcppSqlUpdate &findUpdateOrCreate(const std::string &tableName);
288-
// WsjcppSqlBuilder &deleteFrom(const std::string &sSqlTable);
300+
WsjcppSqlDelete &deleteFrom(const std::string &sSqlTable);
301+
WsjcppSqlDelete &findDeleteOrCreate(const std::string &tableName);
289302

290303
bool hasErrors();
291304
std::string sql();

0 commit comments

Comments
 (0)