You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.9 KiB
74 lines
1.9 KiB
#pragma once
|
|
|
|
#include "Statement.h"
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace db {
|
|
namespace statements {
|
|
namespace builder {
|
|
class InsertStatementBuilder;
|
|
|
|
class AbstractStatementBuilder {
|
|
protected:
|
|
Statement &m_statement;
|
|
explicit AbstractStatementBuilder(Statement &statement) : m_statement(statement) {}
|
|
public:
|
|
operator Statement() const {
|
|
return std::move(m_statement);
|
|
}
|
|
};
|
|
|
|
class StatementBuilder : public AbstractStatementBuilder {
|
|
public:
|
|
Statement m_statement;
|
|
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<std::string> &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;
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|