Stefan Pranger
4 years ago
8 changed files with 208 additions and 0 deletions
-
9CMakeLists.txt
-
5db/db.h
-
0db/migrations/Migration.cpp
-
11db/migrations/Migration.h
-
25db/migrations/builder/AbstractTableBuilder.h
-
31db/migrations/builder/Table.cpp
-
36db/migrations/builder/Table.h
-
91db/migrations/builder/TableBuilder.h
@ -0,0 +1,11 @@ |
|||
#pragma once |
|||
|
|||
#include <db/db.h> |
|||
|
|||
namespace db { |
|||
namespace migrations { |
|||
class Migration { |
|||
|
|||
} |
|||
} |
|||
} |
@ -0,0 +1,25 @@ |
|||
/*#pragma once |
|||
#include "Table.h" |
|||
|
|||
|
|||
|
|||
namespace db { |
|||
namespace migrations { |
|||
namespace builder { |
|||
class CreateTableBuilder; |
|||
class AlterTableBuilder; |
|||
class DropTableBuilder; |
|||
|
|||
class AbstractTableBuilder { |
|||
protected: |
|||
Table &table; |
|||
explicit AbstractTableBuilder(Table &table) : table(table) {} |
|||
public: |
|||
operator Table() const |
|||
{ |
|||
return std::move(table); |
|||
}; |
|||
}; |
|||
} |
|||
} |
|||
}*/ |
@ -0,0 +1,31 @@ |
|||
#include "Table.h"
|
|||
#include "TableBuilder.h"
|
|||
|
|||
namespace db { |
|||
namespace migrations { |
|||
namespace builder { |
|||
class CreateTableBuilder; |
|||
|
|||
CreateTableBuilder Table::create(std::string table_name) { |
|||
return CreateTableBuilder{table_name}; |
|||
} |
|||
|
|||
AlterTableBuilder Table::alter(std::string table_name) { |
|||
return AlterTableBuilder{table_name}; |
|||
} |
|||
|
|||
DropTableBuilder Table::drop(std::string table_name) { |
|||
return DropTableBuilder{table_name}; |
|||
} |
|||
|
|||
std::string Table::str() const { |
|||
return header + "\n" + body + "\n"; |
|||
} |
|||
|
|||
std::ostream &operator<<(std::ostream &os, const Table &t) { |
|||
return os << t.header << std::endl |
|||
<< t.body << std::endl; |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,36 @@ |
|||
#pragma once |
|||
|
|||
#include <iostream> |
|||
#include <string> |
|||
#include <sstream> |
|||
|
|||
namespace db { |
|||
namespace migrations { |
|||
namespace builder { |
|||
class TableBuilder; |
|||
|
|||
class CreateTableBuilder; |
|||
class AlterTableBuilder; |
|||
class DropTableBuilder; |
|||
|
|||
class Table { |
|||
public: |
|||
Table() = default; |
|||
|
|||
friend class CreateTableBuilder; |
|||
friend class AlterTableBuilder; |
|||
friend class DropTableBuilder; |
|||
friend std::ostream &operator<<(std::ostream &os, const Table &t); |
|||
|
|||
static CreateTableBuilder create(const std::string table_name); |
|||
static AlterTableBuilder alter(const std::string table_name); |
|||
static DropTableBuilder drop(const std::string table_name); |
|||
|
|||
std::string str() const; |
|||
private: |
|||
std::string header; |
|||
std::string body; |
|||
}; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,91 @@ |
|||
#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 &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"; |
|||
} |
|||
}; |
|||
} |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue