-
-
Notifications
You must be signed in to change notification settings - Fork 30
/
QueryPlanUserControl.cs
149 lines (118 loc) · 5.11 KB
/
QueryPlanUserControl.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using ExecutionPlanVisualizer.Helpers;
namespace ExecutionPlanVisualizer
{
public partial class QueryPlanUserControl : UserControl
{
private string planXml;
private List<MissingIndexDetails> indexes;
public QueryPlanUserControl()
{
InitializeComponent();
var assocQueryString = NativeMethods.AssocQueryString(NativeMethods.AssocStr.Executable, ".sqlplan");
if (string.IsNullOrEmpty(assocQueryString))
{
openPlanButton.Visible = false;
}
else
{
var fileDescription = FileVersionInfo.GetVersionInfo(assocQueryString).FileDescription;
openPlanButton.Text = $"Open with {fileDescription}";
}
}
public string PlanHtml { get; set; }
public string PlanXml { get; set; }
public List<MissingIndexDetails> Indexes { get; set; } = new List<MissingIndexDetails>();
internal DatabaseHelper DatabaseHelper { get; set; }
private void SavePlanButtonClick(object sender, EventArgs e)
{
if (savePlanFileDialog.ShowDialog() == DialogResult.OK)
{
File.WriteAllText(savePlanFileDialog.FileName, planXml);
planLocationLinkLabel.Text = savePlanFileDialog.FileName;
planSavedLabel.Visible = planLocationLinkLabel.Visible = true;
}
}
private void OpenPlanButtonClick(object sender, EventArgs e)
{
var tempFile = Path.ChangeExtension(Path.GetTempFileName(), "sqlplan");
File.WriteAllText(tempFile, planXml);
try
{
Process.Start(tempFile);
}
catch (Exception exception)
{
MessageBox.Show($"Cannot open execution plan. {exception.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void PlanLocationLinkLabelLinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start("explorer.exe", $"/select,\"{planLocationLinkLabel.Text}\"");
}
private void IndexesDataGridViewDataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
//http://stackoverflow.com/a/10049887/239438
for (int i = 0; i < indexesDataGridView.Columns.Count - 1; i++)
{
indexesDataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
indexesDataGridView.Columns[indexesDataGridView.Columns.Count - 2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
for (int i = 0; i < indexesDataGridView.Columns.Count; i++)
{
int width = indexesDataGridView.Columns[i].Width;
indexesDataGridView.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
indexesDataGridView.Columns[i].Width = width;
}
}
private async void IndexesDataGridViewCellContentClick(object sender, DataGridViewCellEventArgs e)
{
//http://stackoverflow.com/a/13687844/239438
if (!(indexesDataGridView.Columns[e.ColumnIndex] is DataGridViewButtonColumn) || e.RowIndex < 0)
{
return;
}
if (MessageBox.Show("Do you really want to create this index?", "Confirm", MessageBoxButtons.YesNo,
MessageBoxIcon.Warning) != DialogResult.Yes)
{
return;
}
var script = indexes[e.RowIndex].Script;
try
{
indexesDataGridView.Enabled = false;
progressBar.Visible = indexLabel.Visible = true;
await DatabaseHelper.CreateIndexAsync(script);
IndexCreated?.Invoke(sender, e);
}
catch (Exception exception)
{
MessageBox.Show($"Cannot create index. {exception.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
indexesDataGridView.Enabled = true;
progressBar.Visible = indexLabel.Visible = false;
}
public event EventHandler IndexCreated;
public void DisplayExecutionPlanDetails(string planXml, string planHtml, List<MissingIndexDetails> indexes)
{
this.planXml = planXml;
this.indexes = indexes;
webBrowser.DocumentText = planHtml;
if (this.indexes.Count > 0 && tabControl.TabPages.Count == 1)
{
tabControl.TabPages.Add(indexesTabPage);
}
if (this.indexes.Count == 0 && tabControl.TabPages.Count > 1)
{
tabControl.TabPages.Remove(indexesTabPage);
}
indexesTabPage.Text = $"{this.indexes.Count} Missing Index{(this.indexes.Count > 1 ? "es" : "")}";
indexesDataGridView.DataSource = this.indexes;
indexesDataGridView.ResetBindings();
}
}
}