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(); }
public void Setup() { Generator = new FirebirdGenerator(FirebirdOptions.StandardBehaviour()); }
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); } } }
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()); }