コード例 #1
0
ファイル: DatabaseDiff.cs プロジェクト: andersnm/MySqlDiff
        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);
                    }
コード例 #2
0
ファイル: DatabaseDiff.cs プロジェクト: andersnm/MySqlDiff
 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();
 }
コード例 #3
0
ファイル: DatabaseDiff.cs プロジェクト: andersnm/MySqlDiff
        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);
            }
        }