Lightweight 0.20250904.0
Loading...
Searching...
No Matches
CxxModelPrinter.hpp
1// SPDX-License-Identifier: Apache-2.0
2
3#pragma once
4
5#include <Lightweight/DataMapper/Field.hpp>
6#include <Lightweight/SqlSchema.hpp>
7#include <Lightweight/Utils.hpp>
8
9#include <expected>
10#include <filesystem>
11#include <map>
12#include <string>
13#include <unordered_set>
14
15namespace Lightweight::Tools
16{
17
18using ColumnNameOverrides = std::map<SqlSchema::FullyQualifiedTableColumn, std::string>;
19
20class CxxModelPrinter
21{
22 public:
23 using UnicodeTextColumnOverrides = std::unordered_map<std::string /*table*/, std::unordered_set<std::string /*column*/>>;
24
25 struct Config
26 {
27 std::vector<std::string> stripSuffixes = { "_id", "_nr" };
28 bool makeAliases = false;
29 FormatType formatType = FormatType::camelCase;
30 PrimaryKey primaryKeyAssignment = PrimaryKey::ServerSideAutoIncrement;
31 ColumnNameOverrides columnNameOverrides;
32 bool forceUnicodeTextColumns = false;
33 UnicodeTextColumnOverrides unicodeTextColumnOverrides;
34 bool suppressWarnings = false;
35 size_t sqlFixedStringMaxSize = SqlOptimalMaxColumnSize;
36 };
37
38 explicit CxxModelPrinter(Config config) noexcept;
39
40 std::string ToString(std::string_view modelNamespace);
41
42 std::string TableIncludes() const;
43
44 std::string AliasTableName(std::string_view name) const;
45
46 [[nodiscard]] std::expected<void, std::string> PrintCumulativeHeaderFile(
47 std::filesystem::path const& outputDirectory, std::filesystem::path const& cumulativeHeaderFile);
48
49 void PrintToFiles(std::string_view modelNamespace, std::string_view outputDirectory);
50
51 std::string HeaderFileForTheTable(std::string_view modelNamespace, std::string const& tableName);
52
53 std::string Example(SqlSchema::Table const& table) const;
54
55 auto StripSuffix(std::string name) -> std::string;
56
57 static auto SanitizeName(std::string name) -> std::string;
58
59 static auto FormatTableName(std::string_view name) -> std::string;
60
61 static SqlSchema::ForeignKeyConstraint const& GetForeignKey(
62 SqlSchema::Column const& column, std::vector<SqlSchema::ForeignKeyConstraint> const& foreignKeys);
63
64 static std::string MakeType(SqlSchema::Column const& column,
65 std::string const& tableName,
66 bool forceUnicodeTextColumn,
67 UnicodeTextColumnOverrides const& unicodeTextColumnOverrides,
68 size_t sqlFixedStringMaxSize);
69
70 std::optional<std::string> MapColumnNameOverride(SqlSchema::FullyQualifiedTableName const& tableName,
71 std::string const& columnName) const;
72
73 void ResolveOrderAndPrintTable(std::vector<SqlSchema::Table> const& tables);
74
75 void PrintTable(SqlSchema::Table const& table);
76
77 void PrintReport();
78
79 private:
80 struct TableInfo
81 {
82 std::stringstream text;
83 std::vector<std::string> requiredTables;
84 };
85
86 std::map<std::string, TableInfo> _definitions;
87 Config _config;
88 std::map<SqlSchema::FullyQualifiedTableName, SqlSchema::ForeignKeyConstraint> _warningOnUnsupportedMultiKeyForeignKey;
89 size_t _numberOfColumnsListed = 0;
90 size_t _numberOfForeignKeysListed = 0;
91};
92
93} // namespace Lightweight::Tools