5#include <Lightweight/DataMapper/Field.hpp>
6#include <Lightweight/SqlSchema.hpp>
7#include <Lightweight/Utils.hpp>
14#include <unordered_set>
18namespace Lightweight::Tools
21using ColumnNameOverrides = std::map<SqlSchema::ColumnIdentifier, std::string>;
26 using UnicodeTextColumnOverrides = std::unordered_map<std::string , std::unordered_set<std::string >>;
30 std::vector<std::string> stripSuffixes = {
"_id",
"_nr" };
31 bool makeAliases =
false;
32 FormatType formatType = FormatType::camelCase;
33 PrimaryKey primaryKeyAssignment = PrimaryKey::ServerSideAutoIncrement;
34 ColumnNameOverrides columnNameOverrides;
35 bool forceUnicodeTextColumns =
false;
36 UnicodeTextColumnOverrides unicodeTextColumnOverrides;
37 bool suppressWarnings =
false;
38 size_t sqlFixedStringMaxSize = SqlOptimalMaxColumnSize;
43 bool generateInstantiations =
false;
45 std::string instantiationTargetName =
"LightweightEntities";
48 explicit CxxModelPrinter(Config config)
noexcept;
50 std::string ToString(std::string_view modelNamespace);
52 [[nodiscard]] std::string TableIncludes()
const;
54 [[nodiscard]] std::string AliasTableName(std::string_view name)
const;
56 [[nodiscard]] std::expected<void, std::string> PrintCumulativeHeaderFile(
57 std::filesystem::path
const& outputDirectory, std::filesystem::path
const& cumulativeHeaderFile);
59 void PrintToFiles(std::string_view modelNamespace, std::string_view outputDirectory);
61 std::string HeaderFileForTheTable(std::string_view modelNamespace, std::string
const& tableName);
63 [[nodiscard]] std::string Example(SqlSchema::Table
const& table)
const;
65 auto StripSuffix(std::string name) -> std::string;
67 static auto SanitizeName(std::string name) -> std::string;
69 static auto FormatTableName(std::string_view name) -> std::string;
71 static SqlSchema::ForeignKeyConstraint
const& GetForeignKey(
72 SqlSchema::Column
const& column, std::vector<SqlSchema::ForeignKeyConstraint>
const& foreignKeys);
74 static std::string MakeType(SqlSchema::Column
const& column,
75 std::string
const& tableName,
76 bool forceUnicodeTextColumn,
77 UnicodeTextColumnOverrides
const& unicodeTextColumnOverrides,
78 size_t sqlFixedStringMaxSize);
91 [[nodiscard]]
static std::string MakeDecimalPrecisionNote(SqlSchema::Column
const& column);
93 [[nodiscard]] std::optional<std::string> MapColumnNameOverride(SqlSchema::FullyQualifiedTableName
const& tableName,
94 std::string
const& columnName)
const;
96 void ResolveOrderAndPrintTable(std::vector<SqlSchema::Table>
const& tables);
98 void PrintTable(SqlSchema::Table
const& table);
104 void WriteInstantiationCMakeLists(std::string_view outputDirectory, std::vector<std::string> instantiationSources)
const;
108 std::stringstream text;
112 std::set<std::string> requiredTables;
113 std::string structName;
114 std::vector<std::pair<std::string, std::string>> members;
119 [[nodiscard]]
static std::string RecordDescriptorFor(std::string_view modelNamespace, TableInfo
const& info);
123 [[nodiscard]]
static std::string ExternTemplateDeclarationFor(std::string_view modelNamespace, TableInfo
const& info);
126 [[nodiscard]]
static std::string InstantiationSourceFor(std::string_view modelNamespace,
127 std::string
const& headerFileName,
128 TableInfo
const& info);
130 std::map<std::string, TableInfo> _definitions;
132 std::map<SqlSchema::FullyQualifiedTableName, SqlSchema::ForeignKeyConstraint> _warningOnUnsupportedMultiKeyForeignKey;
133 size_t _numberOfColumnsListed = 0;
134 size_t _numberOfForeignKeysListed = 0;