5#include <Lightweight/DataMapper/Field.hpp>
6#include <Lightweight/SqlSchema.hpp>
7#include <Lightweight/Utils.hpp>
13#include <unordered_set>
17namespace Lightweight::Tools
20using ColumnNameOverrides = std::map<SqlSchema::ColumnIdentifier, std::string>;
25 using UnicodeTextColumnOverrides = std::unordered_map<std::string , std::unordered_set<std::string >>;
29 std::vector<std::string> stripSuffixes = {
"_id",
"_nr" };
30 bool makeAliases =
false;
31 FormatType formatType = FormatType::camelCase;
32 PrimaryKey primaryKeyAssignment = PrimaryKey::ServerSideAutoIncrement;
33 ColumnNameOverrides columnNameOverrides;
34 bool forceUnicodeTextColumns =
false;
35 UnicodeTextColumnOverrides unicodeTextColumnOverrides;
36 bool suppressWarnings =
false;
37 size_t sqlFixedStringMaxSize = SqlOptimalMaxColumnSize;
42 bool generateInstantiations =
false;
44 std::string instantiationTargetName =
"LightweightEntities";
47 explicit CxxModelPrinter(Config config)
noexcept;
49 std::string ToString(std::string_view modelNamespace);
51 [[nodiscard]] std::string TableIncludes()
const;
53 [[nodiscard]] std::string AliasTableName(std::string_view name)
const;
55 [[nodiscard]] std::expected<void, std::string> PrintCumulativeHeaderFile(
56 std::filesystem::path
const& outputDirectory, std::filesystem::path
const& cumulativeHeaderFile);
58 void PrintToFiles(std::string_view modelNamespace, std::string_view outputDirectory);
60 std::string HeaderFileForTheTable(std::string_view modelNamespace, std::string
const& tableName);
62 [[nodiscard]] std::string Example(SqlSchema::Table
const& table)
const;
64 auto StripSuffix(std::string name) -> std::string;
66 static auto SanitizeName(std::string name) -> std::string;
68 static auto FormatTableName(std::string_view name) -> std::string;
70 static SqlSchema::ForeignKeyConstraint
const& GetForeignKey(
71 SqlSchema::Column
const& column, std::vector<SqlSchema::ForeignKeyConstraint>
const& foreignKeys);
73 static std::string MakeType(SqlSchema::Column
const& column,
74 std::string
const& tableName,
75 bool forceUnicodeTextColumn,
76 UnicodeTextColumnOverrides
const& unicodeTextColumnOverrides,
77 size_t sqlFixedStringMaxSize);
79 [[nodiscard]] std::optional<std::string> MapColumnNameOverride(SqlSchema::FullyQualifiedTableName
const& tableName,
80 std::string
const& columnName)
const;
82 void ResolveOrderAndPrintTable(std::vector<SqlSchema::Table>
const& tables);
84 void PrintTable(SqlSchema::Table
const& table);
90 void WriteInstantiationCMakeLists(std::string_view outputDirectory, std::vector<std::string> instantiationSources)
const;
94 std::stringstream text;
95 std::vector<std::string> requiredTables;
96 std::string structName;
97 std::vector<std::pair<std::string, std::string>> members;
102 [[nodiscard]]
static std::string RecordDescriptorFor(std::string_view modelNamespace, TableInfo
const& info);
106 [[nodiscard]]
static std::string ExternTemplateDeclarationFor(std::string_view modelNamespace, TableInfo
const& info);
109 [[nodiscard]]
static std::string InstantiationSourceFor(std::string_view modelNamespace,
110 std::string
const& headerFileName,
111 TableInfo
const& info);
113 std::map<std::string, TableInfo> _definitions;
115 std::map<SqlSchema::FullyQualifiedTableName, SqlSchema::ForeignKeyConstraint> _warningOnUnsupportedMultiKeyForeignKey;
116 size_t _numberOfColumnsListed = 0;
117 size_t _numberOfForeignKeysListed = 0;