From f60e0f24d2d17458d5bbb1eca338bfc021980574 Mon Sep 17 00:00:00 2001 From: Stefan Pranger Date: Fri, 2 Jul 2021 21:32:37 +0200 Subject: [PATCH] added stmtbuilder and split up source --- .../builder/InsertStatementBuilder.cpp | 45 +++++++++++++++++++ .../builder/InsertStatementBuilder.h | 23 ++++++++++ .../builder/SelectStatementBuilder.cpp | 32 +++++++++++++ .../builder/SelectStatementBuilder.h | 22 +++++++++ db/statements/builder/Statement.cpp | 7 ++- db/statements/builder/Statement.h | 3 ++ db/statements/builder/StatementBuilder.h | 45 +------------------ 7 files changed, 132 insertions(+), 45 deletions(-) create mode 100644 db/statements/builder/InsertStatementBuilder.cpp create mode 100644 db/statements/builder/InsertStatementBuilder.h create mode 100644 db/statements/builder/SelectStatementBuilder.cpp create mode 100644 db/statements/builder/SelectStatementBuilder.h diff --git a/db/statements/builder/InsertStatementBuilder.cpp b/db/statements/builder/InsertStatementBuilder.cpp new file mode 100644 index 0000000..5293050 --- /dev/null +++ b/db/statements/builder/InsertStatementBuilder.cpp @@ -0,0 +1,45 @@ +#include "InsertStatementBuilder.h" + +namespace db { + namespace statements { + namespace builder { + InsertStatementBuilder &InsertStatementBuilder::table(const std::string &table) { + m_statement.body += "INSERT INTO " + table + " "; + return *this; + } + + InsertStatementBuilder &InsertStatementBuilder::columns(const std::string &cols) { + m_statement.body += "(" + cols + ")\n"; + return *this; + } + + InsertStatementBuilder &InsertStatementBuilder::values() { + m_statement.body += " VALUES "; + return *this; + } + + InsertStatementBuilder &InsertStatementBuilder::row(const std::string &values) { + m_statement.body += " (" + values + "),\n"; + return *this; + } + + InsertStatementBuilder &InsertStatementBuilder::row(const std::vector &values) { + m_statement.body += " ("; + bool first = true; + for(auto const& v : values) { + if(first) { first = false; } else { m_statement.body += ","; } + m_statement.body += v; + } + m_statement.body += "),\n"; + return *this; + } + + InsertStatementBuilder &InsertStatementBuilder::close() { + m_statement.body.pop_back(); + m_statement.body.pop_back(); + m_statement.body += ";\n"; + return *this; + } + } + } +} diff --git a/db/statements/builder/InsertStatementBuilder.h b/db/statements/builder/InsertStatementBuilder.h new file mode 100644 index 0000000..4f4eadf --- /dev/null +++ b/db/statements/builder/InsertStatementBuilder.h @@ -0,0 +1,23 @@ +#pragma once + +#include "Statement.h" +#include "StatementBuilder.h" +#include +#include + +namespace db { + namespace statements { + namespace builder { + class InsertStatementBuilder : public StatementBuilder { + public: + explicit InsertStatementBuilder() : StatementBuilder() {} + InsertStatementBuilder &table(const std::string &table); + InsertStatementBuilder &columns(const std::string &cols); + InsertStatementBuilder &values(); + InsertStatementBuilder &row(const std::string &values); + InsertStatementBuilder &row(const std::vector &values); + InsertStatementBuilder &close(); + }; + } + } +} diff --git a/db/statements/builder/SelectStatementBuilder.cpp b/db/statements/builder/SelectStatementBuilder.cpp new file mode 100644 index 0000000..bfde400 --- /dev/null +++ b/db/statements/builder/SelectStatementBuilder.cpp @@ -0,0 +1,32 @@ +#include "SelectStatementBuilder.h" + +namespace db { + namespace statements { + namespace builder { + SelectStatementBuilder &SelectStatementBuilder::columns(const std::string &cols) { + m_statement.body += "SELECT " + cols; + return *this; + } + + SelectStatementBuilder &SelectStatementBuilder::from_table(const std::string &table) { + m_statement.body += " FROM " + table + " "; + return *this; + } + + SelectStatementBuilder &SelectStatementBuilder::inner_join(const std::string &table, const std::string &on) { + m_statement.body += " INNER JOIN " + table + " ON " + on; + return *this; + } + + SelectStatementBuilder &SelectStatementBuilder::where(const std::string &where) { + m_statement.body += " WHERE " + where; + return *this; + } + + SelectStatementBuilder &SelectStatementBuilder::close() { + m_statement.body += ";\n"; + return *this; + } + } + } +} diff --git a/db/statements/builder/SelectStatementBuilder.h b/db/statements/builder/SelectStatementBuilder.h new file mode 100644 index 0000000..f6819f5 --- /dev/null +++ b/db/statements/builder/SelectStatementBuilder.h @@ -0,0 +1,22 @@ +#pragma once + +#include "Statement.h" +#include "StatementBuilder.h" +#include +#include + +namespace db { + namespace statements { + namespace builder { + class SelectStatementBuilder : public StatementBuilder { + public: + explicit SelectStatementBuilder() : StatementBuilder() {} + SelectStatementBuilder &columns(const std::string &cols); + SelectStatementBuilder &where(const std::string &where); + SelectStatementBuilder &inner_join(const std::string &table, const std::string &on); + SelectStatementBuilder &from_table(const std::string &table); + SelectStatementBuilder &close(); + }; + } + } +} diff --git a/db/statements/builder/Statement.cpp b/db/statements/builder/Statement.cpp index cf21df4..edb8b69 100644 --- a/db/statements/builder/Statement.cpp +++ b/db/statements/builder/Statement.cpp @@ -1,15 +1,20 @@ #include "Statement.h" #include "StatementBuilder.h" +#include "InsertStatementBuilder.h" +#include "SelectStatementBuilder.h" namespace db { namespace statements { namespace builder { - class InsertStatementBuilder; InsertStatementBuilder Statement::insert() { return InsertStatementBuilder{}; } + SelectStatementBuilder Statement::select() { + return SelectStatementBuilder{}; + } + std::string Statement::str() const { return body + "\n"; } diff --git a/db/statements/builder/Statement.h b/db/statements/builder/Statement.h index 5fc0ccb..5287881 100644 --- a/db/statements/builder/Statement.h +++ b/db/statements/builder/Statement.h @@ -9,15 +9,18 @@ namespace db { namespace builder { class StatementBuilder; class InsertStatementBuilder; + class SelectStatementBuilder; class Statement { public: Statement() = default; friend class InsertStatementBuilder; + friend class SelectStatementBuilder; friend std::ostream &operator<<(std::ostream &os, const Statement &s); static InsertStatementBuilder insert(); + static SelectStatementBuilder select(); std::string str() const; private: diff --git a/db/statements/builder/StatementBuilder.h b/db/statements/builder/StatementBuilder.h index b8c78fd..569b805 100644 --- a/db/statements/builder/StatementBuilder.h +++ b/db/statements/builder/StatementBuilder.h @@ -7,6 +7,7 @@ namespace db { namespace statements { namespace builder { + class SelectStatementBuilder; class InsertStatementBuilder; class AbstractStatementBuilder { @@ -25,50 +26,6 @@ namespace db { StatementBuilder() : AbstractStatementBuilder{m_statement} { } }; - - class InsertStatementBuilder : public StatementBuilder { - public: - explicit InsertStatementBuilder() : StatementBuilder() { - } - - InsertStatementBuilder &table(const std::string &table) { - m_statement.body += "INSERT INTO " + table + " "; - return *this; - } - - InsertStatementBuilder &columns(const std::string &cols) { - m_statement.body += "(" + cols + ")\n"; - return *this; - } - - InsertStatementBuilder &values() { - m_statement.body += " VALUES "; - return *this; - } - - InsertStatementBuilder &row(const std::string &values) { - m_statement.body += " (" + values + "),\n"; - return *this; - } - - InsertStatementBuilder &row(const std::vector &values) { - m_statement.body += " ("; - bool first = true; - for(auto const& v : values) { - if(first) { first = false; } else { m_statement.body += ","; } - m_statement.body += v; - } - m_statement.body += "),\n"; - return *this; - } - - InsertStatementBuilder &close() { - m_statement.body.pop_back(); - m_statement.body.pop_back(); - m_statement.body += ";\n"; - return *this; - } - }; } } }