public void ShowDuplicateIndexes()
        {
            var statements = new StatementEnumerator().GetIndexes();

            var indexes = new Dictionary <string, List <CodeStatement <CreateIndexStatement> > >();

            foreach (var statement in statements)
            {
                var key = BuildKey(statement.Statement);

                if (indexes.ContainsKey(key))
                {
                    indexes[key].Add(statement);
                }
                else
                {
                    indexes[key] = new List <CodeStatement <CreateIndexStatement> > {
                        statement
                    };
                }
            }

            var dups = indexes.Where(p => p.Value.Count > 1);

            foreach (var d in dups)
            {
                OutputPane.WriteMessage("Duplicate Indexes Found: ");

                foreach (var statement in d.Value)
                {
                    OutputPane.WriteMessageWithLink(statement.FileName, statement.Line, "{0}",
                                                    ScriptDom.GenerateTSql(statement.Statement));
                }
            }

            if (dups == null || !dups.Any())
            {
                OutputPane.WriteMessage("No Duplicate Indexes Found.");
            }
        }
        public void ShowDuplicateIndexes()
        {
            var statements = new StatementEnumerator().GetIndexes();

            var indexes = new Dictionary<string, List<CodeStatement<CreateIndexStatement>>>();

            foreach (var statement in statements)
            {
                var key = BuildKey(statement.Statement);

                if (indexes.ContainsKey(key))
                {
                    indexes[key].Add(statement);
                }
                else
                {
                    indexes[key] = new List<CodeStatement<CreateIndexStatement>> {statement};
                }
            }
            
            var dups = indexes.Where(p => p.Value.Count > 1);
            foreach (var d in dups)
            {
                OutputPane.WriteMessage("Duplicate Indexes Found: ");

                foreach (var statement in d.Value)
                {
                    OutputPane.WriteMessageWithLink(statement.FileName, statement.Line, "{0}",
                        ScriptDom.GenerateTSql(statement.Statement));
                }
            }

            if (dups == null || !dups.Any())
            {
                OutputPane.WriteMessage("No Duplicate Indexes Found.");
            }
        }
        private void ShowCodeMap(object sender, RoutedEventArgs e)
        {
            try
            {
                CodeMap.Items.Clear();

                var store = CodeCoverageStore.Get;

                var projects = new ProjectEnumerator().Get(ProjectType.SSDT);
                foreach (var p in projects)
                {
                    var newItem = new TreeViewItem();
                    //newItem.Header = p.Name;

                    var statements = new StatementEnumerator().GetStatements(p);
                    var fileMap = new Dictionary<string, List<CodeStatement<TSqlStatement>>>();

                    foreach (var statement in statements)
                    {
                        if (!fileMap.ContainsKey(statement.FileName))
                        {
                            fileMap[statement.FileName] = new List<CodeStatement<TSqlStatement>>();
                        }

                        fileMap[statement.FileName].Add(statement);
                    }

                    double parentStatements = 0;
                    double parentCoveredStatements = 0;

                    foreach (var file in fileMap.Keys.OrderBy(pp => pp))
                    {
                        var map = fileMap[file];

                        var child = new TreeViewItem();
                        double childStatements = 0;
                        double childCoveredStatements = 0;

                        foreach (var sqlModule in map.Where(o => o.Statement.GetType() == typeof (CreateProcedureStatement)))
                        {
                            var name = (sqlModule.Statement as CreateProcedureStatement)?.ProcedureReference.Name.ToNameString();
                            parentStatements = AddChildItems(name, sqlModule, store, parentStatements, file, child, ref parentCoveredStatements, ref childStatements, ref childCoveredStatements);
                            store.AddStatementFileMap(name, sqlModule.FileName);
                        }

                        foreach (var sqlModule in map.Where(o => o.Statement.GetType() == typeof (CreateFunctionStatement)))
                        {
                            var name = (sqlModule.Statement as CreateFunctionStatement)?.Name.ToNameString();
                            parentStatements = AddChildItems(name, sqlModule, store, parentStatements, file, child, ref parentCoveredStatements, ref childStatements, ref childCoveredStatements);
                            store.AddStatementFileMap(name, sqlModule.FileName);
                        }

                        var childCoveragePercent = ((double) childCoveredStatements/(double) childStatements)*100;
                        var childLabel = new LabelWithProgressIndicator(string.Format("{0} - {1}% ({2} / {3})", new FileInfo(file).Name, childCoveragePercent, childCoveredStatements, childStatements), childCoveragePercent, file);
                        childLabel.Configure();
                        child.Header = childLabel;

                        if (child.Items.Count > 0)
                        {
                            newItem.Items.Add(child);
                        }

                    }

                    var parentLabel = new LabelWithProgressIndicator(string.Format("{0} - ({1} / {2})", p.Name, parentCoveredStatements, parentStatements), (parentCoveredStatements/parentStatements)*100.0);
                    parentLabel.Configure();
                    newItem.Header = parentLabel;

                    CodeMap.Items.Add(newItem);
                }
            }
            catch (Exception ex)
            {
                OutputPane.WriteMessageAndActivatePane("SSDTDevPack: Exception calling ShowCodeMap: {0}", ex);
            }
        }
Example #4
0
        private void ShowCodeMap(object sender, RoutedEventArgs e)
        {
            try
            {
                CodeMap.Items.Clear();

                var store = CodeCoverageStore.Get;

                var projects = new ProjectEnumerator().Get(ProjectType.SSDT);
                foreach (var p in projects)
                {
                    var newItem = new TreeViewItem();
                    //newItem.Header = p.Name;

                    var statements = new StatementEnumerator().GetStatements(p);
                    var fileMap    = new Dictionary <string, List <CodeStatement <TSqlStatement> > >();


                    foreach (var statement in statements)
                    {
                        if (!fileMap.ContainsKey(statement.FileName))
                        {
                            fileMap[statement.FileName] = new List <CodeStatement <TSqlStatement> >();
                        }

                        fileMap[statement.FileName].Add(statement);
                    }

                    double parentStatements        = 0;
                    double parentCoveredStatements = 0;

                    foreach (var file in fileMap.Keys.OrderBy(pp => pp))
                    {
                        var map = fileMap[file];

                        var    child                  = new TreeViewItem();
                        double childStatements        = 0;
                        double childCoveredStatements = 0;



                        foreach (var sqlModule in map.Where(o => o.Statement.GetType() == typeof(CreateProcedureStatement)))
                        {
                            var name = (sqlModule.Statement as CreateProcedureStatement)?.ProcedureReference.Name.ToNameString();
                            parentStatements = AddChildItems(name, sqlModule, store, parentStatements, file, child, ref parentCoveredStatements, ref childStatements, ref childCoveredStatements);
                            store.AddStatementFileMap(name, sqlModule.FileName);
                        }


                        foreach (var sqlModule in map.Where(o => o.Statement.GetType() == typeof(CreateFunctionStatement)))
                        {
                            var name = (sqlModule.Statement as CreateFunctionStatement)?.Name.ToNameString();
                            parentStatements = AddChildItems(name, sqlModule, store, parentStatements, file, child, ref parentCoveredStatements, ref childStatements, ref childCoveredStatements);
                            store.AddStatementFileMap(name, sqlModule.FileName);
                        }


                        var childCoveragePercent = ((double)childCoveredStatements / (double)childStatements) * 100;
                        var childLabel           = new LabelWithProgressIndicator(string.Format("{0} - {1}% ({2} / {3})", new FileInfo(file).Name, childCoveragePercent, childCoveredStatements, childStatements), childCoveragePercent, file);
                        childLabel.Configure();
                        child.Header = childLabel;


                        if (child.Items.Count > 0)
                        {
                            newItem.Items.Add(child);
                        }
                    }

                    var parentLabel = new LabelWithProgressIndicator(string.Format("{0} - ({1} / {2})", p.Name, parentCoveredStatements, parentStatements), (parentCoveredStatements / parentStatements) * 100.0);
                    parentLabel.Configure();
                    newItem.Header = parentLabel;

                    CodeMap.Items.Add(newItem);
                }
            }
            catch (Exception ex)
            {
                OutputPane.WriteMessageAndActivatePane("SSDTDevPack: Exception calling ShowCodeMap: {0}", ex);
            }
        }
        public void CorrectCaseAllTableNames()
        {
            var statements = new StatementEnumerator().GetStatements();

            var dacTables = new List <TableDescriptor>();

            foreach (var project in new ProjectEnumerator().Get(ProjectType.SSDT))
            {
                try
                {
                    var path = DacpacPath.Get(project);
                    dacTables.AddRange(new TableRepository(path).Get());
                }
                catch (Exception ex)
                {
                    OutputPane.WriteMessage("Error getting list of tables in project: {0}, error: {1}", project.Name, ex.Message);
                }
            }

            var alreadyChanged = new Dictionary <string, object>();


            foreach (var statement in statements.OrderByDescending(p => p.Statement.StartOffset))
            {
                var scriptTables = ScriptDom.GetTableList(statement.Statement).Where(p => p is NamedTableReference).Cast <NamedTableReference>().ToList();

                var rewriter     = new TableReferenceRewriter(statement.Script, scriptTables);
                var replacements = rewriter.GetReplacements(dacTables);


                var approvedReplacements = new List <Replacements>();

                foreach (var replacement in replacements)
                {
                    var key = string.Format("{0}:{1}:{2}", statement.FileName, replacement.OriginalOffset, replacement.OriginalLength);

                    if (alreadyChanged.ContainsKey(key))
                    {
                        continue;
                    }

                    approvedReplacements.Add(replacement);
                    alreadyChanged[key] = null;
                }

                if (approvedReplacements.Count > 0)
                {
                    var script = File.ReadAllText(statement.FileName);
                    OutputPane.WriteMessage("File: {0}", statement.FileName);
                    foreach (var replacement in approvedReplacements.OrderByDescending(p => p.OriginalOffset))
                    {
                        var from = script.Substring(replacement.OriginalOffset, replacement.OriginalLength);

                        var to = replacement.Replacement;
                        OutputPane.WriteMessageWithLink(statement.FileName, statement.Line, "\tChanging case of {0} to {1}", from, to);
                        script = script.Substring(0, replacement.OriginalOffset) + to + script.Substring(replacement.OriginalOffset + replacement.OriginalLength);
                    }

                    File.WriteAllText(statement.FileName, script);
                }
            }
        }
        public void CorrectCaseAllTableNames()
        {
            var statements = new StatementEnumerator().GetStatements();

            var dacTables = new List<TableDescriptor>();

            foreach (var project in new ProjectEnumerator().Get(ProjectType.SSDT))
            {
                try
                {
                    var path = DacpacPath.Get(project);
                    dacTables.AddRange(new TableRepository(path).Get());
                }
                catch (Exception ex)
                {
                    OutputPane.WriteMessage("Error getting list of tables in project: {0}, error: {1}", project.Name, ex.Message);
                }
            }

            var alreadyChanged = new Dictionary<string, object>();
            

            foreach (var statement in statements.OrderByDescending(p=>p.Statement.StartOffset))
            {
                var scriptTables = ScriptDom.GetTableList(statement.Statement).Where(p => p is NamedTableReference).Cast<NamedTableReference>().ToList();
                
                var rewriter = new TableReferenceRewriter(statement.Script, scriptTables);
                var replacements = rewriter.GetReplacements(dacTables);

                
                var approvedReplacements = new List<Replacements>();

                foreach (var replacement in replacements)
                {
                    var key = string.Format("{0}:{1}:{2}", statement.FileName, replacement.OriginalOffset, replacement.OriginalLength);

                    if (alreadyChanged.ContainsKey(key))
                        continue;

                    approvedReplacements.Add(replacement);
                    alreadyChanged[key] = null;
                }

                if (approvedReplacements.Count > 0)
                {
                    var script = File.ReadAllText(statement.FileName);
                    OutputPane.WriteMessage("File: {0}", statement.FileName);
                    foreach (var replacement in approvedReplacements.OrderByDescending(p => p.OriginalOffset))
                    {
                        var from = script.Substring(replacement.OriginalOffset, replacement.OriginalLength);
                       
                        var to = replacement.Replacement;
                        OutputPane.WriteMessageWithLink(statement.FileName, statement.Line, "\tChanging case of {0} to {1}", from, to);
                        script = script.Substring(0, replacement.OriginalOffset) + to + script.Substring(replacement.OriginalOffset + replacement.OriginalLength);
                        
                    }

                    File.WriteAllText(statement.FileName, script);
                }
            }
        }