Ejemplo n.º 1
0
        public FirebirdProcessor(
            [NotNull] FirebirdDbFactory factory,
            [NotNull] FirebirdGenerator generator,
            [NotNull] FirebirdQuoter quoter,
            [NotNull] ILogger <FirebirdProcessor> logger,
            [NotNull] IOptionsSnapshot <ProcessorOptions> options,
            [NotNull] IConnectionStringAccessor connectionStringAccessor,
            [NotNull] FirebirdOptions fbOptions)
            : base(() => factory.Factory, generator, logger, options.Value, connectionStringAccessor)
        {
            FBOptions            = fbOptions ?? throw new ArgumentNullException(nameof(fbOptions));
            _firebirdVersionFunc = new Lazy <Version>(GetFirebirdVersion);
            _quoter = quoter;
#pragma warning disable 618
            truncator = new FirebirdTruncator(FBOptions.TruncateLongNames, FBOptions.PackKeyNames);
#pragma warning restore 618
            ClearLocks();
            ClearDDLFollowers();
        }
Ejemplo n.º 2
0
 public void Setup()
 {
     Generator = new FirebirdGenerator(FirebirdOptions.StandardBehaviour());
 }
Ejemplo n.º 3
0
        public override void Process(Expressions.AlterColumnExpression expression)
        {
            truncator.Truncate(expression);
            CheckColumn(expression.TableName, expression.Column.Name);
            FirebirdSchemaProvider schema = new FirebirdSchemaProvider(this);
            FirebirdTableSchema    table  = schema.GetTableSchema(expression.TableName);
            ColumnDefinition       colDef = table.Definition.Columns.First(x => x.Name == quoter.ToFbObjectName(expression.Column.Name));

            //Change nullable constraint
            if (colDef.IsNullable != expression.Column.IsNullable)
            {
                PerformDBOperationExpression unSet = new PerformDBOperationExpression();
                unSet.Operation = (connection, transaction) =>
                {
                    string sql = (Generator as FirebirdGenerator).GenerateSetNull(colDef);
                    Announcer.Sql(sql);
                    using (var cmd = Factory.CreateCommand(sql, connection, transaction))
                    {
                        cmd.CommandTimeout = Options.Timeout;
                        cmd.ExecuteNonQuery();
                    }
                };
                FirebirdProcessedExpressionBase fbExpression = new FirebirdProcessedExpression <AlterColumnExpression>(expression, this);
                if (this.FBOptions.UndoEnabled)
                {
                    fbExpression.AddUndoExpression(unSet);
                }
                RegisterExpression(fbExpression);
                InternalProcess((Generator as FirebirdGenerator).GenerateSetNull(expression.Column));
            }

            //Change default value
            if (!FirebirdGenerator.DefaultValuesMatch(colDef, expression.Column))
            {
                IMigrationExpression defaultConstraint;
                IMigrationExpression unsetDefaultConstraint;
                if (expression.Column.DefaultValue is ColumnDefinition.UndefinedDefaultValue)
                {
                    defaultConstraint = new DeleteDefaultConstraintExpression()
                    {
                        SchemaName = expression.SchemaName,
                        TableName  = expression.TableName,
                        ColumnName = expression.Column.Name
                    };
                }
                else
                {
                    defaultConstraint = new AlterDefaultConstraintExpression()
                    {
                        ColumnName   = expression.Column.Name,
                        DefaultValue = expression.Column.DefaultValue,
                        TableName    = expression.TableName,
                        SchemaName   = expression.SchemaName
                    };
                }

                if (colDef.DefaultValue is ColumnDefinition.UndefinedDefaultValue)
                {
                    unsetDefaultConstraint = new DeleteDefaultConstraintExpression()
                    {
                        ColumnName = colDef.Name,
                        TableName  = expression.TableName,
                        SchemaName = expression.SchemaName
                    };
                }
                else
                {
                    unsetDefaultConstraint = new AlterDefaultConstraintExpression()
                    {
                        ColumnName   = colDef.Name,
                        DefaultValue = colDef.DefaultValue,
                        TableName    = expression.TableName,
                        SchemaName   = expression.SchemaName
                    };
                }

                FirebirdProcessedExpressionBase fbExpression = new FirebirdProcessedExpression(defaultConstraint, defaultConstraint.GetType(), this);
                if (this.FBOptions.UndoEnabled)
                {
                    fbExpression.AddUndoExpression(unsetDefaultConstraint);
                }
                RegisterExpression(fbExpression);
                if (defaultConstraint is DeleteDefaultConstraintExpression)
                {
                    InternalProcess(Generator.Generate(defaultConstraint as DeleteDefaultConstraintExpression));
                }
                else if (defaultConstraint is AlterDefaultConstraintExpression)
                {
                    InternalProcess(Generator.Generate(defaultConstraint as AlterDefaultConstraintExpression));
                }
                else
                {
                    throw new InvalidOperationException("No expression generated for alter default constraint");
                }
            }

            //Change type
            if (!FirebirdGenerator.ColumnTypesMatch(colDef, expression.Column))
            {
                PerformDBOperationExpression unSet = new PerformDBOperationExpression();
                unSet.Operation = (connection, transaction) =>
                {
                    string sql = (Generator as FirebirdGenerator).GenerateSetType(colDef);
                    Announcer.Sql(sql);
                    using (var cmd = Factory.CreateCommand(sql, connection, transaction))
                    {
                        cmd.CommandTimeout = Options.Timeout;
                        cmd.ExecuteNonQuery();
                    }
                };
                FirebirdProcessedExpressionBase fbExpression = new FirebirdProcessedExpression <AlterColumnExpression>(expression, this);
                if (this.FBOptions.UndoEnabled)
                {
                    fbExpression.AddUndoExpression(unSet);
                }
                RegisterExpression(fbExpression);
                InternalProcess((Generator as FirebirdGenerator).GenerateSetType(expression.Column));
            }

            bool identitySequenceExists;

            try
            {
                identitySequenceExists = SequenceExists(String.Empty, GetSequenceName(expression.TableName, expression.Column.Name));
            }
            catch (ArgumentException)
            {
                identitySequenceExists = false;
            }


            //Adjust identity generators
            if (expression.Column.IsIdentity)
            {
                if (!identitySequenceExists)
                {
                    CreateSequenceForIdentity(expression.TableName, expression.Column.Name);
                }
            }
            else
            {
                if (identitySequenceExists)
                {
                    DeleteSequenceForIdentity(expression.TableName, expression.Column.Name);
                }
            }
        }
Ejemplo n.º 4
0
        public override void Process(AlterColumnExpression expression)
        {
            Truncator.Truncate(expression);
            CheckColumn(expression.TableName, expression.Column.Name);
            FirebirdSchemaProvider schema = new FirebirdSchemaProvider(this, _quoter);
            FirebirdTableSchema    table  = schema.GetTableSchema(expression.TableName);
            ColumnDefinition       colDef = table.Definition.Columns.FirstOrDefault(x => x.Name == _quoter.ToFbObjectName(expression.Column.Name));

            var generator = (FirebirdGenerator)Generator;

            var tableName = expression.Column.TableName ?? expression.TableName;

            //Change nullable constraint
            if (colDef == null || colDef.IsNullable != expression.Column.IsNullable)
            {
                string nullConstraintCommand;
                if (IsFirebird3)
                {
                    nullConstraintCommand = generator.GenerateSetNull3(tableName, expression.Column);
                }
                else
                {
                    nullConstraintCommand = generator.GenerateSetNullPre3(tableName, expression.Column);
                }

                InternalProcess(nullConstraintCommand);
            }

            //Change default value
            if (colDef == null || !FirebirdGenerator.DefaultValuesMatch(colDef, expression.Column))
            {
                IMigrationExpression defaultConstraint;
                if (expression.Column.DefaultValue is ColumnDefinition.UndefinedDefaultValue)
                {
                    defaultConstraint = new DeleteDefaultConstraintExpression()
                    {
                        SchemaName = expression.SchemaName,
                        TableName  = expression.TableName,
                        ColumnName = expression.Column.Name
                    };
                }
                else
                {
                    defaultConstraint = new AlterDefaultConstraintExpression()
                    {
                        ColumnName   = expression.Column.Name,
                        DefaultValue = expression.Column.DefaultValue,
                        TableName    = expression.TableName,
                        SchemaName   = expression.SchemaName
                    };
                }

                if (defaultConstraint is DeleteDefaultConstraintExpression deleteDefaultConstraintExpression)
                {
                    InternalProcess(Generator.Generate(deleteDefaultConstraintExpression));
                }
                else
                {
                    InternalProcess(Generator.Generate((AlterDefaultConstraintExpression)defaultConstraint));
                }
            }

            //Change type
            if (colDef == null || !FirebirdGenerator.ColumnTypesMatch(colDef, expression.Column))
            {
                InternalProcess(generator.GenerateSetType(tableName, expression.Column));
            }

            bool identitySequenceExists;

            try
            {
                identitySequenceExists = SequenceExists(string.Empty, GetSequenceName(expression.TableName, expression.Column.Name));
            }
            catch (ArgumentException)
            {
                identitySequenceExists = false;
            }


            //Adjust identity generators
            if (expression.Column.IsIdentity)
            {
                if (!identitySequenceExists)
                {
                    CreateSequenceForIdentity(expression.TableName, expression.Column.Name);
                }
            }
            else
            {
                if (identitySequenceExists)
                {
                    DeleteSequenceForIdentity(expression.TableName, expression.Column.Name);
                }
            }
        }
 public FirebirdGeneratorTests()
 {
     generator = new FirebirdGenerator(FirebirdOptions.StandardBehaviour());
 }