public void RunDBLint(DatabaseLint dblint) { this.ExecutionStatus.FoundIssues = 0; this.ExecutionStatus.TablesAnalyzed = 0; this.ExecutionStatus.TotalTables = _viewModel.MetadataSelection.Schemas.Sum(s => (s.Include.HasValue && !s.Include.Value) ? 0 : s.Tables.Value.Count(t => t.Include)); this.ExecutionStatus.TotalWork = 100; var worker = new ExecuteWorker(new DBLintExecuter(this), dblint); worker.StartWork(); }
public ExecuteWorker(DBLintExecuter executer, DatabaseLint dblint) { _executer = executer; _dblint = dblint; }
private void Write(String dirName, DatabaseLint dblint) { this.scoring = new IScoringImpl(); this.scoring.CalculateScores(dblint); if (DBLint.Settings.IsNormalContext) { //Save run for incremental viewing //File name is a timestamp DateTime now = DateTime.Now; String fileName = String.Format("{0}{1}{2}{3}{4}{5}.xml", now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second); //Folder, i.e.: runs/dbname/ String folder = Settings.INCREMENTAL_FOLDER + "testtest"; // dblint.DatabaseModel.DatabaseName; String filePath = folder + "/" + fileName; if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } //Create run DBLint.IncrementalRuns.Run run = new IncrementalRuns.Run(dblint.DatabaseModel, dblint.IssueCollector, scoring.GetScores()); //Write run using (FileStream writer = new FileStream(filePath, FileMode.Create)) { DataContractSerializer ser = new DataContractSerializer(typeof(DBLint.IncrementalRuns.Run)); ser.WriteObject(writer, run); writer.Flush(); } } DirectoryInfo dir = new DirectoryInfo(dirName); int tableNameCounter = 1; foreach (Table table in dblint.DatabaseModel.Tables) { String tName = "table" + tableNameCounter.ToString(); this.tableNames.Add(table, tName); this.tableFiles.Add(table, "tables/" + tName + ".html"); tableNameCounter++; } this.dblint = dblint; this.formatter = new HTMLDescriptionFormatter(this.tableFiles); IssueCollector issues = dblint.IssueCollector; //Create result directory if it does not exist if (!dir.Exists) { dir.Create(); } VelocityContext context = new VelocityContext(); context.Put("db", dblint.DatabaseModel); context.Put("totalScore", this.scoring.GetScore()); context.Put("issuesTotal", issues.Count()); context.Put("rulesExecuted", this.getRulesExecuted()); context.Put("ruleTypes", this.getRuleTypes()); context.Put("formatter", this.formatter); context.Put("HTMLBuilder", this); context.Put("summaries", this.dblint.ExecutionSummary); context.Put("executionTime", this.formatTimeSpan(this.dblint.ExecutionSummary.ExecutionTime)); //Pagerank IProviderCollection providers = dblint.RuleController.ProviderCollection; var rank = providers.GetProvider <DBLint.Rules.SchemaProviders.ImportanceProvider>(); //List all tables var tables = (from t in dblint.DatabaseModel.Tables select new { Table = t, Name = t.TableName, IssueCount = issues.GetIssues(t).Count(), Score = this.scoring.GetScore(t), Importance = Math.Round(rank[t], 1) }).ToList(); context.Put("tables", tables); //Bottom tables var bottom = tables.OrderBy(t => t.Score).Take(5).ToList(); context.Put("bottomTables", bottom); int groupId = 0; //Used in the template to identify a group of issues //Group issues by name var issueGroups = (from i in issues group i by i.Name into g orderby g.First().Severity select new { Name = g.Key, Count = g.Count(), Issues = g, GroupID = ++groupId, Severity = g.First().Severity }).ToList(); context.Put("issueGroups", issueGroups); //Put issueGroups into severity groups var severityGroups = (from issueGroup in issueGroups group issueGroup by issueGroup.Severity into g orderby g.First().Severity select new { Severity = g.First().Severity, IssueGroups = g } ); context.Put("severityGroups", severityGroups); //Incremental runs list var diffs = new List <DBLint.IncrementalRuns.Diff>(); if (DBLint.Settings.IsNormalContext) { //Incremental runs try { var runs = DBLint.IncrementalRuns.Run.GetRuns(dblint.DatabaseModel.DatabaseName, 5).ToList(); for (int i = 1; i < runs.Count; i++) { var diff = new DBLint.IncrementalRuns.Diff(); diff.Compare(runs[i], runs[i - 1]); diffs.Add(diff); } } catch { } context.Put("diffs", diffs); } //Create template for the main html page Template template = Velocity.GetTemplate("mainpage.vm"); //Create outputstream for the main page TextWriter htmlOut = new StreamWriter(Path.Combine(dir.FullName, "mainpage.html")); //Write template template.Merge(context, htmlOut); htmlOut.Close(); //Write issue groups String issuePath = Path.Combine(dir.FullName, "issues"); if (!Directory.Exists(issuePath)) { Directory.CreateDirectory(issuePath); } Template issueGroupTemplate = Velocity.GetTemplate("issuegroup.vm"); formatter.PathPrefix = "../"; foreach (var g in issueGroups) { context.Put("groupIssues", g.Issues); TextWriter issueOut = new StreamWriter(Path.Combine(issuePath, g.GroupID.ToString() + ".html")); issueGroupTemplate.Merge(context, issueOut); issueOut.Close(); } if (DBLint.Settings.IsNormalContext) { //Write diffs/increments to files: String incPath = Path.Combine(dir.FullName, "increments"); if (!Directory.Exists(incPath)) { Directory.CreateDirectory(incPath); } Template incrementTemplate = Velocity.GetTemplate("increment.vm"); int diffId = 0; foreach (var diff in diffs) { diffId++; context.Put("diff", diff); TextWriter incOut = new StreamWriter(Path.Combine(incPath, diffId.ToString() + ".html")); incrementTemplate.Merge(context, incOut); incOut.Close(); } } formatter.PathPrefix = ""; writeTableViews(dirName); }
public static void WriteReport(String dirName, DatabaseLint dblint) { new HTMLBuilder().Write(dirName, dblint); }