コード例 #1
0
 public DatabasePresenter(IDatabaseView view, IRelationRepository repository)
 {
     _view                 = view;
     view.Presenter        = this;
     _repository           = repository;
     _repository.TableName = "customer";
 }
コード例 #2
0
        /// <summary>
        /// Analyses a database view. Reports messages when a view, or its related schema have reserved keyword names.
        /// </summary>
        /// <param name="view">A database view.</param>
        /// <returns>A set of linting messages used for reporting. An empty set indicates no issues discovered.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="view"/> is <c>null</c>.</exception>
        protected IEnumerable <IRuleMessage> AnalyseView(IDatabaseView view)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            var result = new List <IRuleMessage>();

            var viewNameIsKeyword = Dialect.IsReservedKeyword(view.Name.LocalName);

            if (viewNameIsKeyword)
            {
                var message = BuildViewMessage(view.Name);
                result.Add(message);
            }

            var keywordColumnNames = view.Columns
                                     .Select(c => c.Name.LocalName)
                                     .Where(Dialect.IsReservedKeyword);

            foreach (var kwColumnName in keywordColumnNames)
            {
                var message = BuildViewColumnMessage(view.Name, kwColumnName);
                result.Add(message);
            }

            return(result);
        }
コード例 #3
0
        public View Map(IDatabaseView view, ReferencedObjectTargets referencedObjectTargets)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }
            if (referencedObjectTargets == null)
            {
                throw new ArgumentNullException(nameof(referencedObjectTargets));
            }

            const string rootPath = "../";
            var          links    = referencedObjectTargets.GetReferencedObjectLinks(rootPath, view.Name, view.Definition);

            var viewColumns = view.Columns.ToList();
            var columns     = viewColumns.Select((vc, i) =>
                                                 new View.Column(
                                                     vc.Name?.LocalName ?? string.Empty,
                                                     i + 1,
                                                     vc.IsNullable,
                                                     vc.Type.Definition,
                                                     vc.DefaultValue
                                                     )).ToList();

            return(new View(
                       view.Name,
                       rootPath,
                       view.Definition,
                       columns,
                       links
                       ));
        }
コード例 #4
0
        /// <summary>
        /// Analyses a database view. Reports messages when a view has whitespace in its name or related schema.
        /// </summary>
        /// <param name="view">A set of database views.</param>
        /// <returns>A set of linting messages used for reporting. An empty set indicates no issues discovered.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="view"/> is <c>null</c>.</exception>
        protected IEnumerable <IRuleMessage> AnalyseView(IDatabaseView view)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            var result = new List <IRuleMessage>();

            var viewNameHasWs = HasWhiteSpace(view.Name.LocalName);

            if (viewNameHasWs)
            {
                var message = BuildViewMessage(view.Name);
                result.Add(message);
            }

            var whiteSpaceColumnNames = view.Columns
                                        .Select(c => c.Name.LocalName)
                                        .Where(HasWhiteSpace);

            foreach (var wsColumnName in whiteSpaceColumnNames)
            {
                var message = BuildViewColumnMessage(view.Name, wsColumnName);
                result.Add(message);
            }

            return(result);
        }
コード例 #5
0
        /// <summary>
        /// Analyses a database view. Reports messages when the view definitions is invalid.
        /// </summary>
        /// <param name="view">A database view.</param>
        /// <param name="cancellationToken">A cancellation token used to interrupt analysis.</param>
        /// <returns>A set of linting messages used for reporting. An empty set indicates no issues discovered.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="view"/> is <c>null</c>.</exception>
        protected Task <IEnumerable <IRuleMessage> > AnalyseViewAsync(IDatabaseView view, CancellationToken cancellationToken)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            return(AnalyseViewAsyncCore(view, cancellationToken));
        }
コード例 #6
0
        public Main.View Map(IDatabaseView view)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            var columnCount = view.Columns.UCount();

            return(new Main.View(view.Name, columnCount, view.IsMaterialized));
        }
コード例 #7
0
ファイル: MainWindow.xaml.cs プロジェクト: KMielnik/FakeDOORS
        public MainWindow(IDatabaseView databaseView, IUpdaterView updaterView, ISettingsView settingsView, AppSettings options)
        {
            InitializeComponent();

            this.databaseView           = databaseView;
            DatabaseViewControl.Content = databaseView;

            this.updaterView           = updaterView;
            UpdaterViewControl.Content = updaterView;

            this.settingsView           = settingsView;
            SettingsViewControl.Content = settingsView;

            this.settings = options;
        }
コード例 #8
0
        private static IEnumerable <AttributeListSyntax> BuildClassAttributes(IDatabaseView view, string className)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }
            if (className.IsNullOrWhiteSpace())
            {
                throw new ArgumentNullException(nameof(className));
            }

            var attributes = new List <AttributeListSyntax>();

            var schemaName = view.Name.Schema;

            if (!schemaName.IsNullOrWhiteSpace())
            {
                var schemaAttribute = AttributeList(
                    SingletonSeparatedList(
                        Attribute(
                            SyntaxUtilities.AttributeName(nameof(SchemaAttribute)),
                            AttributeArgumentList(
                                SingletonSeparatedList(
                                    AttributeArgument(
                                        LiteralExpression(
                                            SyntaxKind.StringLiteralExpression,
                                            Literal(schemaName))))))));
                attributes.Add(schemaAttribute);
            }

            if (className != view.Name.LocalName)
            {
                var aliasAttribute = AttributeList(
                    SingletonSeparatedList(
                        Attribute(
                            SyntaxUtilities.AttributeName(nameof(AliasAttribute)),
                            AttributeArgumentList(
                                SingletonSeparatedList(
                                    AttributeArgument(
                                        LiteralExpression(
                                            SyntaxKind.StringLiteralExpression,
                                            Literal(view.Name.LocalName))))))));
                attributes.Add(aliasAttribute);
            }

            return(attributes);
        }
コード例 #9
0
        private ClassDeclarationSyntax BuildClass(IDatabaseView view, Option <IDatabaseViewComments> comment)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            var className  = NameTranslator.ViewToClassName(view.Name);
            var properties = view.Columns
                             .Select(vc => BuildColumn(vc, comment, className))
                             .ToList();

            return(ClassDeclaration(className)
                   .AddModifiers(Token(SyntaxKind.PublicKeyword))
                   .WithLeadingTrivia(BuildViewComment(view.Name, comment))
                   .WithMembers(List <MemberDeclarationSyntax>(properties)));
        }
コード例 #10
0
        private async Task <IEnumerable <IRuleMessage> > AnalyseViewAsyncCore(IDatabaseView view, CancellationToken cancellationToken)
        {
            try
            {
                var simpleViewName = Identifier.CreateQualifiedIdentifier(view.Name.Schema, view.Name.LocalName);
                var quotedViewName = Connection.Dialect.QuoteName(simpleViewName);
                var query          = "select 1 as dummy from " + quotedViewName;
                await Connection.DbConnection.ExecuteScalarAsync <long>(query, cancellationToken).ConfigureAwait(false);

                return(Array.Empty <IRuleMessage>());
            }
            catch
            {
                var message = BuildMessage(view.Name);
                return(new[] { message });
            }
        }
コード例 #11
0
        /// <summary>
        /// Generates source code that enables interoperability with a given database view for Entity Framework Core.
        /// </summary>
        /// <param name="view">A database view.</param>
        /// <param name="comment">Comment information for the given view.</param>
        /// <returns>A string containing source code to interact with the view.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="view"/> is <c>null</c>.</exception>
        public override string Generate(IDatabaseView view, Option <IDatabaseViewComments> comment)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            var schemaNamespace = NameTranslator.SchemaToNamespace(view.Name);
            var viewNamespace   = !schemaNamespace.IsNullOrWhiteSpace()
                ? Namespace + "." + schemaNamespace
                : Namespace;

            var namespaces = new[]
            {
                "System.ComponentModel.DataAnnotations",
                "System.ComponentModel.DataAnnotations.Schema"
            }
            .Union(
                view.Columns
                .Select(c => c.Type.ClrType.Namespace)
                .Where(ns => ns != viewNamespace)
                )
            .Distinct()
            .OrderNamespaces()
            .ToList();

            var usingStatements = namespaces
                                  .Select(ns => ParseName(ns))
                                  .Select(UsingDirective)
                                  .ToList();
            var namespaceDeclaration = NamespaceDeclaration(ParseName(viewNamespace));
            var classDeclaration     = BuildClass(view, comment);

            var document = CompilationUnit()
                           .WithUsings(List(usingStatements))
                           .WithMembers(
                SingletonList <MemberDeclarationSyntax>(
                    namespaceDeclaration
                    .WithMembers(
                        SingletonList <MemberDeclarationSyntax>(classDeclaration))));

            using var workspace = new AdhocWorkspace();
            return(Formatter.Format(document, workspace).ToFullString());
        }
コード例 #12
0
        public IEnumerable <Columns.ViewColumn> Map(IDatabaseView view)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            var columns = view.Columns.ToList();

            return(columns.Select((c, i) =>
                                  new Columns.ViewColumn(
                                      view.Name,
                                      i + 1,
                                      c.Name.LocalName,
                                      c.Type.Definition,
                                      c.IsNullable
                                      )
                                  ).ToList());
        }
コード例 #13
0
        private PropertyDeclarationSyntax BuildViewDbSet(IDatabaseView view)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            var schemaNamespace    = NameTranslator.SchemaToNamespace(view.Name);
            var className          = NameTranslator.ViewToClassName(view.Name);
            var qualifiedClassName = !schemaNamespace.IsNullOrWhiteSpace()
                ? schemaNamespace + "." + className
                : className;
            var setName           = className.Pluralize();
            var qualifiedViewName = !view.Name.Schema.IsNullOrWhiteSpace()
                ? view.Name.Schema + "." + view.Name.LocalName
                : view.Name.LocalName;

            return(BuildDbSetProperty(qualifiedClassName, setName, qualifiedViewName, "view"));
        }
コード例 #14
0
        private InvocationExpressionSyntax BuildViewConfiguration(IDatabaseView view)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            var qualifiedClassName = GetQualifiedClassName(view.Name);
            var entity             = GetEntityBuilder(qualifiedClassName);

            var hasNoKey = InvocationExpression(
                MemberAccessExpression(
                    SyntaxKind.SimpleMemberAccessExpression,
                    entity,
                    IdentifierName(nameof(EntityTypeBuilder.HasNoKey))));

            var toViewArgs = new List <ArgumentSyntax>
            {
                Argument(
                    LiteralExpression(
                        SyntaxKind.StringLiteralExpression,
                        Literal(view.Name.LocalName)))
            };

            if (!view.Name.Schema.IsNullOrWhiteSpace())
            {
                var schemaArg = Argument(
                    LiteralExpression(
                        SyntaxKind.StringLiteralExpression,
                        Literal(view.Name.Schema)));
                toViewArgs.Add(schemaArg);
            }

            return(InvocationExpression(
                       MemberAccessExpression(
                           SyntaxKind.SimpleMemberAccessExpression,
                           hasNoKey,
                           IdentifierName(nameof(RelationalEntityTypeBuilderExtensions.ToView))))
                   .WithArgumentList(
                       ArgumentList(
                           SeparatedList(toViewArgs))));
        }
コード例 #15
0
        /// <summary>
        /// Gets a database column lookup.
        /// </summary>
        /// <param name="view">A database view.</param>
        /// <param name="identifierResolver">An identifier resolver.</param>
        /// <returns>A lookup keyed by column names, whose values are the associated columns.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="view"/> or <paramref name="identifierResolver"/> is <c>null</c>.</exception>
        public static IReadOnlyDictionary <Identifier, IDatabaseColumn> GetColumnLookup(this IDatabaseView view, IIdentifierResolutionStrategy identifierResolver)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }
            if (identifierResolver == null)
            {
                throw new ArgumentNullException(nameof(identifierResolver));
            }

            var lookup = GetColumnLookup(view);

            return(new IdentifierResolvingDictionary <IDatabaseColumn>(lookup, identifierResolver));
        }
コード例 #16
0
        /// <summary>
        /// Gets a database column lookup.
        /// </summary>
        /// <param name="view">A database view.</param>
        /// <returns>A lookup keyed by column names, whose values are the associated columns.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="view"/> is <c>null</c>.</exception>
        public static IReadOnlyDictionary <Identifier, IDatabaseColumn> GetColumnLookup(this IDatabaseView view)
        {
            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }

            var columns = view.Columns;
            var result  = new Dictionary <Identifier, IDatabaseColumn>(columns.Count);

            foreach (var column in columns)
            {
                if (column.Name != null)
                {
                    result[column.Name.LocalName] = column;
                }
            }

            return(result);
        }
コード例 #17
0
 public RoomPresenter(IDatabaseView view, IRelationRepository repository) : base(view, repository)
 {
     _view.RoomPresenter      = this;
     _repository.DataGridView = _view.RoomViewSection;
 }
コード例 #18
0
 public DatabasePresenter(IDatabaseView view, IRelationRepository repository)
 {
     _view       = view;
     _repository = repository;
 }
コード例 #19
0
 public override string Generate(IDatabaseView view, Option <IDatabaseViewComments> comment) => string.Empty;
コード例 #20
0
 /// <summary>
 /// Generates source code that enables interoperability with a given database view.
 /// </summary>
 /// <param name="view">A database view.</param>
 /// <param name="comment">Comment information for the given view.</param>
 /// <returns>A string containing source code to interact with the view.</returns>
 public abstract string Generate(IDatabaseView view, Option <IDatabaseViewComments> comment);