static void DiffCreateTable(CreateTableStatement nextTable, List <Statement> previous, StringBuilder preForeignKeySql, StringBuilder sql, StringBuilder postForeignKeySql) { var previousTable = previous.Where(p => p is CreateTableStatement).Cast <CreateTableStatement>().Where(n => n.TableName == nextTable.TableName).FirstOrDefault(); if (previousTable == null) { WriteCreateTablePostFk(nextTable, sql, postForeignKeySql); } else { // Generate changes for columns, indices and constraints CompareColumns(previousTable.Columns, nextTable.Columns, previousElement => { // Drop if (previousElement is TableColumn previousColumn) { WriteDropColumn(nextTable.TableName, previousColumn, sql); } else if (previousElement is TableConstraint previousConstraint) { WriteDropConstraint(nextTable.TableName, previousConstraint, preForeignKeySql); } else if (previousElement is TableKey previousKey) { WriteDropKey(nextTable.TableName, previousKey, sql); } else { throw new InvalidOperationException("Unhandled"); } }, nextElement => { // Add if (nextElement is TableColumn nextColumn) { WriteAddColumn(nextTable.TableName, nextColumn, sql); } else if (nextElement is TableConstraint nextConstraint) { WriteAddConstraint(nextTable.TableName, nextConstraint, postForeignKeySql); } else if (nextElement is TableKey nextKey) { WriteAddKey(nextTable.TableName, nextKey, sql); } else { throw new InvalidOperationException("Unhandled"); } }, (previousElement, nextElement) => { // Modify if (previousElement is TableColumn previousColumn && nextElement is TableColumn nextColumn) { // TODO: check if affects FK in separeate pass // TODO: non-destructive alter column if possible WriteDropColumn(nextTable.TableName, previousColumn, sql); WriteAddColumn(nextTable.TableName, nextColumn, sql); }
internal static void WriteCreateTable(CreateTableStatement nextTable, StringBuilder sql) { // Create new table with FKs sql.AppendLine($"CREATE TABLE `{nextTable.TableName}` ("); WriteColumns(nextTable.Columns, sql); sql.AppendLine(");"); sql.AppendLine(); }
private static void WriteCreateTablePostFk(CreateTableStatement nextTable, StringBuilder sql, StringBuilder postForeignKeySql) { // Create new table without FKs sql.AppendLine($"CREATE TABLE `{nextTable.TableName}` ("); var columnsNoFk = nextTable.Columns.Where(c => !(c is TableConstraint)).ToList(); WriteColumns(columnsNoFk, sql); sql.AppendLine(");"); sql.AppendLine(); // Put FKs in postForeignKeySql var nextConstraints = nextTable.Columns.Where(c => c is TableConstraint).Cast <TableConstraint>().ToList(); foreach (var constraint in nextConstraints) { WriteAddConstraint(nextTable.TableName, constraint, postForeignKeySql); } }