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.
101 lines
3.2 KiB
101 lines
3.2 KiB
#pragma once
|
|
|
|
#include "Table.h"
|
|
#include <string>
|
|
|
|
namespace db {
|
|
namespace migrations {
|
|
namespace builder {
|
|
class CreateTableBuilder;
|
|
class AlterTableBuilder;
|
|
class DropTableBuilder;
|
|
|
|
class AbstractTableBuilder {
|
|
protected:
|
|
Table &m_table;
|
|
explicit AbstractTableBuilder(Table &table) : m_table(table) {}
|
|
public:
|
|
operator Table() const {
|
|
return std::move(m_table);
|
|
}
|
|
};
|
|
|
|
class TableBuilder : public AbstractTableBuilder {
|
|
public:
|
|
Table m_table;
|
|
TableBuilder() : AbstractTableBuilder{m_table} {
|
|
}
|
|
};
|
|
|
|
class CreateTableBuilder : public TableBuilder {
|
|
public:
|
|
bool is_primary_set = false;
|
|
|
|
explicit CreateTableBuilder(const std::string &table_name) : TableBuilder() {
|
|
m_table.header += "CREATE TABLE IF NOT EXISTS " + table_name + " (";
|
|
}
|
|
|
|
CreateTableBuilder &null(const std::string &i, const std::string &opts = "") {
|
|
m_table.body += "\t" + i + " NULL " + opts + ",\n";
|
|
return *this;
|
|
}
|
|
|
|
CreateTableBuilder &integer(const std::string &i, const std::string &opts = "") {
|
|
m_table.body += "\t" + i + " INTEGER " + opts + ",\n";
|
|
return *this;
|
|
}
|
|
|
|
CreateTableBuilder &real(const std::string &i, const std::string &opts = "") {
|
|
m_table.body += "\t" + i + " REAL " + opts + ",\n";
|
|
return *this;
|
|
}
|
|
|
|
CreateTableBuilder &text(const std::string &i, const std::string &opts = "") {
|
|
m_table.body += "\t" + i + " TEXT " + opts + ",\n";
|
|
return *this;
|
|
}
|
|
|
|
CreateTableBuilder &blob(const std::string &i, const std::string &opts = "") {
|
|
m_table.body += "\t" + i + " BLOB " + opts + ",\n";
|
|
return *this;
|
|
}
|
|
|
|
CreateTableBuilder &fk(const std::string &key, const std::string &reference_table, const std::string &foreign_key, const std::string &opts = "") {
|
|
m_table.body += "\tFOREIGN KEY (" + key + ") REFERENCES " + reference_table + "(" + foreign_key + ")" + opts + ",\n";
|
|
return *this;
|
|
}
|
|
|
|
CreateTableBuilder &constraint(const std::string &name, const std::string &opts) {
|
|
m_table.body += "\tCONSTRAINT " + name + " UNIQUE (" + opts + "),\n";
|
|
return *this;
|
|
}
|
|
|
|
CreateTableBuilder &close() {
|
|
m_table.body.pop_back();
|
|
m_table.body.pop_back();
|
|
m_table.body += ");\n";
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
class AlterTableBuilder : public TableBuilder {
|
|
public:
|
|
explicit AlterTableBuilder(std::string table_name) : TableBuilder() {
|
|
m_table.header = "ALTER TABLE " + table_name;
|
|
}
|
|
|
|
AlterTableBuilder &rename_column(const std::string &column_old, const std::string &column_new) {
|
|
m_table.body += "RENAME COLUMN " + column_old + " TO " + column_new + ";\n";
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
class DropTableBuilder : public TableBuilder {
|
|
public:
|
|
explicit DropTableBuilder(std::string table_name) : TableBuilder() {
|
|
m_table.header = "DROP TABLE IF EXISTS " + table_name + ";\n";
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|