@@ -44,13 +44,12 @@ namespace
4444 return { std::move (first), std::move (second) };
4545 }
4646
47- std::vector<std::string> AllTables (std::string_view database, std::string_view schema)
47+ std::vector<std::string> AllTables (SqlStatement& stmt, std::string_view database, std::string_view schema)
4848 {
4949 auto const tableType = " TABLE" sv;
5050 (void ) database;
5151 (void ) schema;
5252
53- auto stmt = SqlStatement ();
5453 auto sqlResult = SQLTables (stmt.NativeHandle (),
5554 (SQLCHAR*) database.data (),
5655 (SQLSMALLINT) database.size (),
@@ -173,10 +172,9 @@ namespace
173172} // namespace
174173
175174// NOLINTNEXTLINE(readability-function-cognitive-complexity)
176- void ReadAllTables (std::string_view database, std::string_view schema, EventHandler& eventHandler)
175+ void ReadAllTables (SqlStatement& stmt, std::string_view database, std::string_view schema, EventHandler& eventHandler)
177176{
178- auto stmt = SqlStatement {};
179- auto const tableNames = AllTables (database, schema);
177+ auto const tableNames = AllTables (stmt, database, schema);
180178
181179 eventHandler.OnTables (tableNames);
182180
@@ -206,7 +204,7 @@ void ReadAllTables(std::string_view database, std::string_view schema, EventHand
206204 for (auto const & foreignKey: incomingForeignKeys)
207205 eventHandler.OnExternalForeignKey (foreignKey);
208206
209- auto columnStmt = SqlStatement () ;
207+ auto columnStmt = SqlStatement { stmt. Connection () } ;
210208 auto const sqlResult = SQLColumns (columnStmt.NativeHandle (),
211209 (SQLCHAR*) database.data (),
212210 (SQLSMALLINT) database.size (),
@@ -274,7 +272,6 @@ void ReadAllTables(std::string_view database, std::string_view schema, EventHand
274272
275273 // accumulated properties
276274 column.isPrimaryKey = std::ranges::contains (primaryKeys, column.name );
277- // column.isForeignKey = ...;
278275 column.isForeignKey = std::ranges::any_of (foreignKeys, [&column](ForeignKeyConstraint const & fk) {
279276 return std::ranges::contains (fk.foreignKey .columns , column.name );
280277 });
@@ -301,7 +298,10 @@ std::string ToLowerCase(std::string_view str)
301298 return result;
302299}
303300
304- TableList ReadAllTables (std::string_view database, std::string_view schema, ReadAllTablesCallback callback)
301+ TableList ReadAllTables (SqlStatement& stmt,
302+ std::string_view database,
303+ std::string_view schema,
304+ ReadAllTablesCallback callback)
305305{
306306 TableList tables;
307307 struct EventHandler : public SqlSchema ::EventHandler
@@ -353,7 +353,7 @@ TableList ReadAllTables(std::string_view database, std::string_view schema, Read
353353 tables.back ().externalForeignKeys .emplace_back (foreignKeyConstraint);
354354 }
355355 } eventHandler { tables, std::move (callback) };
356- ReadAllTables (database, schema, eventHandler);
356+ ReadAllTables (stmt, database, schema, eventHandler);
357357
358358 std::map<std::string, std::string> tableNameCaseMap;
359359 for (auto const & table: tables)
@@ -388,4 +388,43 @@ std::vector<ForeignKeyConstraint> AllForeignKeysFrom(SqlStatement& stmt, FullyQu
388388 return AllForeignKeys (stmt, FullyQualifiedTableName {}, table);
389389}
390390
391+ SqlCreateTablePlan MakeCreateTablePlan (Table const & tableDescription)
392+ {
393+ auto plan = SqlCreateTablePlan {}; // TODO(pr)
394+
395+ plan.tableName = tableDescription.name ;
396+
397+ for (auto const & columnDescription: tableDescription.columns )
398+ {
399+ auto columnDecl = SqlColumnDeclaration {
400+ .name = columnDescription.name ,
401+ .type = columnDescription.type ,
402+ .primaryKey = [&] {
403+ if (columnDescription.isAutoIncrement )
404+ return SqlPrimaryKeyType::AUTO_INCREMENT;
405+
406+ if (columnDescription.isPrimaryKey )
407+ return SqlPrimaryKeyType::MANUAL;
408+
409+ return SqlPrimaryKeyType::NONE;
410+ }(),
411+ };
412+
413+ plan.columns .emplace_back (std::move (columnDecl));
414+ }
415+ // TODO(pr) foreign keys
416+
417+ return plan;
418+ }
419+
420+ std::vector<SqlCreateTablePlan> MakeCreateTablePlan (TableList const & tableDescriptions)
421+ {
422+ auto result = std::vector<SqlCreateTablePlan>();
423+
424+ for (auto const & tableDescription: tableDescriptions)
425+ result.emplace_back (MakeCreateTablePlan (tableDescription));
426+
427+ return result;
428+ }
429+
391430} // namespace SqlSchema
0 commit comments