public IEnumerable <CommandGroup> AlterGenerators(IMetadata other, IComparerContext context) { return(FilterSystemFlagUser(GeneratorsByName.Values) .Where(g => other.MetadataGenerators.GeneratorsByName.TryGetValue(g.GeneratorName, out var otherGenerator) && g != otherGenerator) .Select(g => new CommandGroup().Append(g.Alter(Metadata, other, context))) .Where(x => !x.IsEmpty)); }
protected ComparerBase(T referenceType, T newType, IComparerContext comparerContext, ResultContext resultContext, string name) { _referenceType = referenceType; _newType = newType; _comparerContext = comparerContext; _comparerResult = _comparerContext.CreateComparerResult(resultContext, name); }
protected IEnumerable <Command> HandleCommentNested <TNested, TEquatable>( IEnumerable <TNested> nesteds, IDictionary <TEquatable, TNested> otherNesteds, Func <TNested, TEquatable> equatableFactory, IEnumerable <Identifier> parentNames, string objectTypeName, Func <TNested, IEnumerable <Identifier> > nestedNameFactory, IComparerContext context) where TNested : IHasDescription { foreach (var nested in nesteds) { var key = equatableFactory(nested); otherNesteds.TryGetValue(key, out var other); var comment = SqlHelper.CreateComment( objectTypeName, parentNames.Concat(nestedNameFactory(nested)), nested.Description, other?.Description); if (comment != null) { yield return(new Command().Append(comment)); } } }
protected override bool CanCreateRevoke(UserPrivilege privilege, IComparerContext context) { ITypeObjectNameKey primitiveType; if (privilege.ObjectType.IsRelation || privilege.ObjectType.IsView) { primitiveType = privilege.Relation; } else if (privilege.ObjectType.IsProcedure) { primitiveType = privilege.Procedure; } else if (privilege.ObjectType.IsPackage) { primitiveType = privilege.Package; } else if (privilege.ObjectType.IsUDF) { primitiveType = privilege.Function; } else if (privilege.ObjectType.IsException) { primitiveType = privilege.DbException; } else if (privilege.ObjectType.IsGenerator) { primitiveType = privilege.Generator; } else { return(true); } return(!context.DroppedObjects.Contains(primitiveType.TypeObjectNameKey)); }
public IEnumerable <CommandGroup> AlterRoles(IMetadata other, IComparerContext context) { return(FilterSystemFlagUser(Roles.Values) .Where(r => other.MetadataRoles.Roles.TryGetValue(r.RoleName, out var otherRole) && r != otherRole) .Select(r => new CommandGroup().Append(r.Alter(Metadata, other, context))) .Where(x => !x.IsEmpty)); }
public IEnumerable <CommandGroup> AlterCharacterSets(IMetadata other, IComparerContext context) { return(CharacterSetsById.Values .Where(ch => other.MetadataCharacterSets.CharacterSetsById.TryGetValue(ch.CharacterSetId, out var otherCharacterSet) && ch != otherCharacterSet) .Select(ch => new CommandGroup().Append(ch.Alter(Metadata, other, context))) .Where(x => !x.IsEmpty)); }
protected override bool CanCreateRevoke(UserPrivilege privilege, IComparerContext context) { ITypeObjectNameKey primitiveType; switch (privilege.ObjectType) { case ObjectType.RELATION: case ObjectType.VIEW: primitiveType = privilege.Relation; break; case ObjectType.PROCEDURE: primitiveType = privilege.Procedure; break; case ObjectType.PACKAGE: primitiveType = privilege.Package; break; case ObjectType.UDF: primitiveType = !(privilege.Function?.IsLegacy ?? true) ? privilege.Function : null; break; default: primitiveType = null; break; } return(primitiveType == null || !context.DroppedObjects.Contains(primitiveType.TypeObjectNameKey)); }
public IEnumerable <CommandGroup> AlterExceptions(IMetadata other, IComparerContext context) { return(FilterSystemFlagUser(ExceptionsByName.Values) .Where(e => other.MetadataExceptions.ExceptionsByName.TryGetValue(e.ExceptionName, out var otherException) && e != otherException) .Select(e => new CommandGroup().Append(e.Alter(Metadata, other, context))) .Where(x => !x.IsEmpty)); }
public Comparer(ScriptBuilder scriptBuilder, IComparerContext comparerContext, IMetadata sourceMetadata, IMetadata targetMetadata) { ScriptBuilder = scriptBuilder ?? throw new ArgumentNullException(nameof(scriptBuilder)); ComparerContext = comparerContext ?? throw new ArgumentNullException(nameof(comparerContext)); SourceMetadata = sourceMetadata ?? throw new ArgumentNullException(nameof(sourceMetadata)); TargetMetadata = targetMetadata ?? throw new ArgumentNullException(nameof(targetMetadata)); }
private ApiComparer(Assembly referenceVersion, Assembly newVersion, Action<string> logInfo, Action<string> logDetail, Stream htmlOutput, Stream xmlOutput, IList<string> ignoredElements) { _referenceVersion = referenceVersion; _newVersion = newVersion; _htmlOutput = htmlOutput; _xmlOutput = xmlOutput; _comparerContext = new ComparerContext(logInfo, logDetail, ignoredElements); }
private ApiComparer(Assembly referenceVersion, Assembly newVersion, Action <string> logInfo, Action <string> logDetail, Stream htmlOutput, Stream xmlOutput, ComparerConfiguration configuration) { _referenceVersion = referenceVersion; _newVersion = newVersion; _htmlOutput = htmlOutput; _xmlOutput = xmlOutput; _comparerContext = new ComparerContext(logInfo, logDetail, configuration); }
private ApiChecker(Assembly referenceVersion, Assembly newVersion, Action <string> logInfo, Action <string> logDetail, Stream htmlOutput, Stream xmlOutput, IList <string> ignoredElements) { _referenceVersion = referenceVersion; _newVersion = newVersion; _htmlOutput = htmlOutput; _xmlOutput = xmlOutput; _comparerContext = new ComparerContext(logInfo, logDetail, ignoredElements); }
protected override Command CreateRevoke(UserPrivilege privilege, IComparerContext context) { Command command; switch (privilege.Privilege) { case Privilege.USAGE: { // Syntax: // REVOKE USAGE ON < object type > < name > FROM < grantee list > [< granted by clause >] // <object type> ::= {DOMAIN | EXCEPTION | GENERATOR | SEQUENCE | CHARACTER SET | COLLATION} if (!privilege.IsSystemGeneratedObject) { command = new Command(); command.Append($"REVOKE USAGE ON {privilege.ObjectType.ToDescription()} {privilege.ObjectName.AsSqlIndentifier()} FROM {privilege.User.AsSqlIndentifier()}"); // see \src\dsql\parse.y line 840 (release 3.0.2) // only EXECEPTION, GENERATOR is parsed for the moment, but not clearly in the documentation // reported if (privilege.ObjectType != ObjectType.EXCEPTION && privilege.ObjectType != ObjectType.GENERATOR) { command = null; } } else { command = null; } break; } case Privilege.CREATE: case Privilege.ALTER: case Privilege.DROP: { // Syntax: // REVOKE[GRANT OPTION FOR] CREATE < object - type > // FROM[USER | ROLE] < user - name > | < role - name >; // REVOKE[GRANT OPTION FOR] ALTER ANY<object-type > // FROM[USER | ROLE] < user - name > | < role - name >; // REVOKE[GRANT OPTION FOR] DROP ANY<object-type > // FROM[USER | ROLE] < user - name > | < role - name >; command = new Command(); command.Append( privilege.Privilege == Privilege.CREATE ? $"REVOKE {privilege.Privilege.ToDescription()} {privilege.ObjectType.ToDescription()} FROM {privilege.UserType.ToDescription()} {privilege.User}" : $"REVOKE {privilege.Privilege.ToDescription()} ANY {privilege.ObjectType.ToDescription()} FROM {privilege.UserType.ToDescription()} {privilege.User}"); break; } default: command = base.CreateRevoke(privilege, context); break; } return(command); }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { var result = new CommandGroup().Append(HandleComment(Domains, other.MetadataFields.Domains, x => x.FieldName, "DOMAIN", x => new[] { x.FieldName }, context)); if (!result.IsEmpty) { yield return(result); } }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { var result = new CommandGroup().Append(HandleComment(Roles, other.MetadataRoles.Roles, x => x.RoleName, "ROLE", x => new[] { x.RoleName }, context)); if (!result.IsEmpty) { yield return(result); } }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { var result = new CommandGroup().Append(HandleComment(TriggersByName, other.MetadataTriggers.TriggersByName, x => x.TriggerName, "TRIGGER", x => new[] { x.TriggerName }, context)); if (!result.IsEmpty) { yield return(result); } }
// even triggers on tables to be dropped need to be explicitly dropped because of possible cyclic dependencies between triggers private IEnumerable <Command> DropTriggersNotExistingInSource(IMetadata other, IComparerContext context) { var triggers = FilterSystemFlagUser(other.MetadataTriggers.TriggersByName.Values) .Where(t => !TriggersByName.ContainsKey(t.TriggerName)) .OrderBy(t => t.RelationName) .ThenBy(t => t.TriggerName); return(triggers.SelectMany(t => t.Drop(Metadata, other, context))); }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { var result = new CommandGroup().Append(HandleComment(CollationsByName, other.MetadataCollations.CollationsByName, x => x.CollationName, "COLLATION", x => new[] { x.CollationName }, context)); if (!result.IsEmpty) { yield return(result); } }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { var result = new CommandGroup().Append(HandleComment(CharacterSetsByName, other.MetadataCharacterSets.CharacterSetsByName, x => x.CharacterSetName, "CHARACTER SET", x => new[] { x.CharacterSetName }, context)); if (!result.IsEmpty) { yield return(result); } }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { var result = new CommandGroup().Append(HandleComment(ProceduresByName, other.MetadataProcedures.ProceduresByName, x => x.ProcedureName, "PROCEDURE", x => new[] { x.ProcedureName }, context, x => HandleCommentNested(x.ProcedureParameters.OrderBy(y => y.ParameterNumber), other.MetadataProcedures.ProcedureParameters, (a, b) => new ProcedureParameterKey(a, b), x.ProcedureName, y => y.ParameterName, "PARAMETER", y => new[] { y.ParameterName }, context))); if (!result.IsEmpty) { yield return(result); } }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { var result = new CommandGroup().Append(HandleComment(FunctionsByName, other.MetadataFunctions.FunctionsByName, x => x.FunctionNameKey, "EXTERNAL FUNCTION", x => new[] { x.FunctionName }, context)); if (!result.IsEmpty) { yield return(result); } }
public IEnumerable <CommandGroup> DropPackages(IMetadata other, IComparerContext context) { var complete = FilterCompletePackagesToBeDropped(other) .Select(package => new CommandGroup().Append(WrapActionWithEmptyBody(package.Drop)(Metadata, other, context))); var bodies = FilterPackagesBodiesToBeDropped(other) .Select(package => new CommandGroup().Append(package.Drop(Metadata, other, context))); return(bodies.Concat(complete)); }
public IEnumerable <CommandGroup> AlterPackagesBodies(IMetadata other, IComparerContext context) { return(FilterPackagesBodiesToBeAltered(other) .Where(package => package.ValidBodyFlag) .Select(package => new CommandGroup() // force header re-sync header as "sometimes" the body fails with signature mismatch (CORE-6250) .Append(WrapActionWithEmptyBody(package.Alter)(Metadata, other, context)) .Append(package.Alter(Metadata, other, context)))); }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { var result = new CommandGroup().Append(HandleComment(PackagesByName, other.MetadataPackages.PackagesByName, x => x.PackageName, "PACKAGE", x => new[] { x.PackageName }, context)); if (!result.IsEmpty) { yield return(result); } }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { var result = new CommandGroup().Append(HandleComment(Indices, other.MetadataIndices.Indices, x => x.IndexName, "INDEX", x => new[] { x.IndexName }, context, primitivesFilter: x => x.IsUserCreatedIndex)); if (!result.IsEmpty) { yield return(result); } }
protected virtual Command CreateRevoke(UserPrivilege privilege, IComparerContext context) { var command = new Command(); command.Append( privilege.Privilege == Privilege.Member ? $"REVOKE {privilege.ObjectName.AsSqlIndentifier()} FROM {privilege.User.AsSqlIndentifier()}" : $"REVOKE {CreatePrivilegeName(privilege)} ON {privilege.ObjectType.ToSqlObject()} {privilege.ObjectName.AsSqlIndentifier()} FROM {CreateToObjectName(privilege)}"); return(command); }
public IEnumerable <CommandGroup> DropIndices(IMetadata other, IComparerContext context) { var result = new CommandGroup(); result.Append(SelectIndicesHelper(IndicesToBeDroppedPredicate, other.MetadataIndices, Metadata, context).SelectMany(i => i.Drop(Metadata, other, context))); if (!result.IsEmpty) { yield return(result); } }
public IEnumerable <CommandGroup> AlterDomains(IMetadata other, IComparerContext context) { return(FilterSystemFlagUser(Domains.Values) .Where(d => other.MetadataFields.Domains.TryGetValue(d.FieldName, out var otherDomain) && d != otherDomain) .Select(d => new CommandGroup() .Append(Metadata.MetadataConstraints.DropConstraintsForDependenciesHelper(s => s.RelationField.FieldSource == d.FieldName, other, context)) .Append(Metadata.MetadataIndices.DropIndicesForDependenciesHelper(s => s.RelationField.FieldSource == d.FieldName, other, context)) .Append(d.Alter(Metadata, other, context))) .Where(x => !x.IsEmpty)); }
public IEnumerable <CommandGroup> HandleTriggers(IMetadata other, IComparerContext context) { var result = new CommandGroup() .Append(DropTriggersNotExistingInSource(other, context)) .Append(CreateOrAlterTriggers(other, context)); if (!result.IsEmpty) { yield return(result); } }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { var batch = new CommandGroup() .Append(HandleComment(GeneratorsByName, other.MetadataGenerators.GeneratorsByName, x => x.GeneratorName, "SEQUENCE", x => new[] { x.GeneratorName }, context)); if (!batch.IsEmpty) { yield return(batch); } }
IEnumerable <CommandGroup> ISupportsComment.Handle(IMetadata other, IComparerContext context) { if (Description == null && other.MetadataDatabase.Description != null) { yield return(new CommandGroup().Append(new Command().Append("COMMENT ON DATABASE IS NULL"))); } else if (Description != null && Description != other.MetadataDatabase.Description) { yield return(new CommandGroup().Append(new Command().Append($"COMMENT ON DATABASE IS '{SqlHelper.DoubleSingleQuotes(Description)}'"))); } }