4#include "../SqlQueryFormatter.hpp"
5#include "SQLiteFormatter.hpp"
7#include <reflection-cpp/reflection.hpp>
11class PostgreSqlFormatter final:
public SQLiteQueryFormatter
14 [[nodiscard]] std::string QueryLastInsertId(std::string_view )
const override
19 return std::format(
"SELECT lastval();");
22 [[nodiscard]] std::string BuildColumnDefinition(
SqlColumnDeclaration const& column)
const override
24 std::stringstream sqlQueryString;
26 sqlQueryString <<
'"' << column.
name <<
"\" ";
28 if (column.
primaryKey == SqlPrimaryKeyType::AUTO_INCREMENT)
29 sqlQueryString <<
"SERIAL";
31 sqlQueryString << ColumnType(column.
type);
34 sqlQueryString <<
" NOT NULL";
36 if (column.
primaryKey == SqlPrimaryKeyType::AUTO_INCREMENT)
37 sqlQueryString <<
" PRIMARY KEY";
39 sqlQueryString <<
" UNIQUE";
41 return sqlQueryString.str();
44 [[nodiscard]] std::string ColumnType(SqlColumnTypeDefinition
const& type)
const override
46 using namespace SqlColumnTypeDefinitions;
49 return std::visit(detail::overloaded {
50 [](Bigint
const&) -> std::string {
return "BIGINT"; },
51 [](Binary
const& type) -> std::string {
return std::format(
"BYTEA", type.size); },
52 [](Bool
const&) -> std::string {
return "BOOLEAN"; },
53 [](Char
const& type) -> std::string {
return std::format(
"CHAR({})", type.size); },
54 [](Date
const&) -> std::string {
return "DATE"; },
55 [](DateTime
const&) -> std::string {
return "TIMESTAMP"; },
56 [](Decimal
const& type) -> std::string {
57 return std::format(
"DECIMAL({}, {})", type.precision, type.scale);
59 [](Guid
const&) -> std::string {
return "UUID"; },
60 [](Integer
const&) -> std::string {
return "INTEGER"; },
61 [](NChar
const& type) -> std::string {
return std::format(
"CHAR({})", type.size); },
62 [](NVarchar
const& type) -> std::string {
return std::format(
"VARCHAR({})", type.size); },
63 [](Real
const&) -> std::string {
return "REAL"; },
64 [](Smallint
const&) -> std::string {
return "SMALLINT"; },
65 [](Text
const&) -> std::string {
return "TEXT"; },
66 [](Time
const&) -> std::string {
return "TIME"; },
67 [](Timestamp
const&) -> std::string {
return "TIMESTAMP"; },
69 [](Tinyint
const&) -> std::string {
return "SMALLINT"; },
70 [](VarBinary
const& ) -> std::string {
return std::format(
"BYTEA"); },
71 [](Varchar
const& type) -> std::string {
return std::format(
"VARCHAR({})", type.size); },
76 [[nodiscard]] StringList AlterTable(std::string_view tableName,
77 std::vector<SqlAlterTableCommand>
const& commands)
const override
79 std::stringstream sqlQueryString;
81 int currentCommand = 0;
84 if (currentCommand > 0)
85 sqlQueryString <<
'\n';
88 using namespace SqlAlterTableCommands;
89 sqlQueryString << std::visit(
91 [tableName](RenameTable
const& actualCommand) -> std::string {
92 return std::format(R
"(ALTER TABLE "{}" RENAME TO "{}";)", tableName, actualCommand.newTableName);
94 [tableName, this](AddColumn
const& actualCommand) -> std::string {
95 return std::format(R
"(ALTER TABLE "{}" ADD COLUMN "{}" {} {};)",
97 actualCommand.columnName,
98 ColumnType(actualCommand.columnType),
99 actualCommand.nullable == SqlNullable::NotNull ? "NOT NULL" :
"NULL");
101 [tableName,
this](AlterColumn
const& actualCommand) -> std::string {
103 R
"(ALTER TABLE "{0}" ALTER COLUMN "{1}" TYPE {2}, ALTER COLUMN "{1}" {3} NOT NULL;)",
105 actualCommand.columnName,
106 ColumnType(actualCommand.columnType),
107 actualCommand.nullable == SqlNullable::NotNull ? "SET" :
"DROP");
109 [tableName](RenameColumn
const& actualCommand) -> std::string {
110 return std::format(R
"(ALTER TABLE "{}" RENAME COLUMN "{}" TO "{}";)",
112 actualCommand.oldColumnName,
113 actualCommand.newColumnName);
115 [tableName](DropColumn const& actualCommand) -> std::string {
116 return std::format(R
"(ALTER TABLE "{}" DROP COLUMN "{}";)", tableName, actualCommand.columnName);
118 [tableName](AddIndex const& actualCommand) -> std::string {
119 using namespace std::string_view_literals;
120 auto const uniqueStr = actualCommand.unique ?
"UNIQUE "sv :
""sv;
121 return std::format(R
"(CREATE {2}INDEX "{0}_{1}_index" ON "{0}"("{1}");)",
123 actualCommand.columnName,
126 [tableName](DropIndex const& actualCommand) -> std::string {
127 return std::format(R
"(DROP INDEX "{0}_{1}_index";)", tableName, actualCommand.columnName);
129 [tableName](AddForeignKey const& actualCommand) -> std::string {
131 R
"(ALTER TABLE "{}" ADD {};)",
133 BuildForeignKeyConstraint(actualCommand.columnName, actualCommand.referencedColumn));
135 [tableName](DropForeignKey const& actualCommand) -> std::string {
136 return std::format(R
"(ALTER TABLE "{}" DROP CONSTRAINT "{}";)",
138 std::format("FK_{}", actualCommand.columnName));
144 return { sqlQueryString.str() };
std::variant< SqlAlterTableCommands::RenameTable, SqlAlterTableCommands::AddColumn, SqlAlterTableCommands::AlterColumn, SqlAlterTableCommands::AddIndex, SqlAlterTableCommands::RenameColumn, SqlAlterTableCommands::DropColumn, SqlAlterTableCommands::DropIndex, SqlAlterTableCommands::AddForeignKey, SqlAlterTableCommands::DropForeignKey > SqlAlterTableCommand
Represents a single SQL ALTER TABLE command.
Represents a SQL column declaration.
bool index
Indicates if the column is indexed.
SqlColumnTypeDefinition type
The type of the column.
bool required
Indicates if the column is required (non-nullable).
SqlPrimaryKeyType primaryKey
The primary key type of the column.
bool unique
Indicates if the column is unique.
std::string name
The name of the column.