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));
 }
Example #2
0
 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));
    }
Example #5
0
 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));
 }
Example #6
0
 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));
        }
Example #8
0
 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));
 }
Example #9
0
 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));
 }
Example #10
0
 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);
 }
Example #11
0
 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);
 }
Example #12
0
 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);
        }
Example #14
0
    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);
        }
    }
Example #15
0
        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);
            }
        }
Example #16
0
        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);
            }
        }
Example #17
0
    // 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);
        }
    }
Example #19
0
    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);
        }
    }
Example #20
0
        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);
            }
        }
Example #21
0
        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);
            }
        }
Example #22
0
    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));
    }
Example #23
0
 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))));
 }
Example #24
0
    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);
        }
    }
Example #25
0
        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);
    }
Example #27
0
        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);
            }
        }
Example #28
0
 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));
 }
Example #29
0
        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);
        }
    }
Example #31
0
 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)}'")));
     }
 }