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