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); } }
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); } } }