PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/MySqlBackup.NET/MySqlBackupTestApp/FormDatabaseInfo.cs

http://mysqlbackupnet.codeplex.com
C# | 484 lines | 396 code | 88 blank | 0 comment | 10 complexity | 9ab52415d700996559378f0ee08deade MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using MySql.Data.MySqlClient;
  9. namespace MySqlBackupTestApp
  10. {
  11. public partial class FormDatabaseInfo : Form
  12. {
  13. StringBuilder sb;
  14. MySqlServer myServer;
  15. MySqlDatabase myDatabase;
  16. MySqlCommand cmd;
  17. Timer timer1;
  18. BackgroundWorker bw;
  19. public FormDatabaseInfo()
  20. {
  21. timer1 = new Timer();
  22. timer1.Interval = 100;
  23. timer1.Tick += timer1_Tick;
  24. bw = new BackgroundWorker();
  25. bw.RunWorkerCompleted += bw_RunWorkerCompleted;
  26. bw.DoWork += bw_DoWork;
  27. InitializeComponent();
  28. }
  29. void bw_DoWork(object sender, DoWorkEventArgs e)
  30. {
  31. try
  32. {
  33. Start();
  34. }
  35. catch (Exception ex)
  36. {
  37. WriteError(ex.Message);
  38. }
  39. }
  40. void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  41. {
  42. webBrowser1.DocumentText = sb.ToString();
  43. }
  44. void Start()
  45. {
  46. sb = new StringBuilder();
  47. sb.AppendLine("<html><head><style>h1 { line-height:160%; font-size: 20pt; } h2 { line-height:160%; font-size: 14pt; } body { font-family: \"Segoe UI\", Arial; line-height: 150%; } table { border: 1px solid #5C5C5C; border-collapse: collapse; } td { font-size: 10pt; padding: 4px; border: 1px solid #5C5C5C; } .code { font-family: \"Courier New\"; font-size: 10pt; line-height:110%; } </style></head>");
  48. sb.AppendLine("<body>");
  49. using (MySqlConnection conn = new MySqlConnection(Program.ConnectionString))
  50. {
  51. try
  52. {
  53. conn.Open();
  54. cmd = new MySqlCommand();
  55. cmd.Connection = conn;
  56. myDatabase = new MySqlDatabase();
  57. myDatabase.GetDatabaseInfo(cmd, true);
  58. myServer = new MySqlServer();
  59. myServer.GetServerInfo(cmd);
  60. int stage = 1;
  61. while (stage < 13)
  62. {
  63. try
  64. {
  65. switch (stage)
  66. {
  67. case 1: LoadDatabase(); break;
  68. case 2: LoadUser(); break;
  69. case 3: LoadGlobalPrivilege(); break;
  70. case 4: LoadViewPrivilege(); break;
  71. case 5: LoadFunctionPrivilege(); break;
  72. case 6: LoadVariables(); break;
  73. case 7: LoadTables(); break;
  74. case 8: LoadFunctions(); break;
  75. case 9: LoadProcedures(); break;
  76. case 10: LoadTriggers(); break;
  77. case 11: LoadViews(); break;
  78. case 12: LoadEvents(); break;
  79. default: break;
  80. }
  81. }
  82. catch (Exception ex)
  83. {
  84. WriteError(ex.Message);
  85. }
  86. stage += 1;
  87. }
  88. conn.Close();
  89. }
  90. catch (Exception exCon)
  91. {
  92. WriteError(exCon.Message);
  93. }
  94. }
  95. sb.Append("</body>");
  96. sb.Append("</html>");
  97. }
  98. void LoadDatabase()
  99. {
  100. WriteHead1("Database");
  101. WriteCodeBlock(myDatabase.CreateDatabaseSQL);
  102. }
  103. void LoadUser()
  104. {
  105. WriteHead1("User");
  106. string sqlSelectCurrentUser = "SELECT current_user;";
  107. WriteCodeBlock(sqlSelectCurrentUser);
  108. WriteCodeBlock(myServer.CurrentUserClientHost);
  109. }
  110. void LoadGlobalPrivilege()
  111. {
  112. WriteHead2("Global Privileges");
  113. string curUser = "";
  114. if (myServer.CurrentUser != "root")
  115. curUser = myServer.CurrentUser;
  116. else
  117. WriteText("Current user is \"root\". All privileges are granted by default.");
  118. string sqlShowUserPrivilege = "SELECT * FROM mysql.db WHERE `user` = '" + curUser + "';";
  119. DataTable dt = QueryExpress.GetTable(cmd, sqlShowUserPrivilege);
  120. WriteCodeBlock(sqlShowUserPrivilege);
  121. WriteTable(dt);
  122. }
  123. void LoadViewPrivilege()
  124. {
  125. WriteHead2("Privileges of View");
  126. string sqlViewPrivilege =
  127. @"SELECT mv.host `Host`, mv.user `User`,
  128. CONCAT(mv.Db, '.', mv.Table_name) `Views`,
  129. REPLACE(mv.Table_priv, ',', ', ') AS `Privileges`
  130. FROM mysql.tables_priv mv
  131. WHERE mv.Db = '" + myDatabase.Name + @"'
  132. and mv.Table_name IN
  133. (SELECT DISTINCT v.table_name `views` FROM information_schema.views AS v)
  134. ORDER BY mv.Host, mv.User, mv.Db, mv.Table_name;";
  135. DataTable dtViewPrivilege = QueryExpress.GetTable(cmd, sqlViewPrivilege);
  136. WriteCodeBlock(sqlViewPrivilege);
  137. WriteTable(dtViewPrivilege);
  138. }
  139. void LoadProcedurePrivilege()
  140. {
  141. WriteHead2("Privileges of Procedure");
  142. string sqlProcedurePrivilege =
  143. @"SELECT mp.host `Host`, mp.user `User`,
  144. CONCAT(mp.Db, '.', mp.Routine_name) `Procedures`,
  145. REPLACE(mp.Proc_priv, ',', ', ') AS `Privileges`
  146. FROM mysql.procs_priv mp
  147. WHERE mp.Db = '" + myDatabase.Name + @"'
  148. and mp.Routine_type = 'PROCEDURE'
  149. ORDER BY mp.Host, mp.User, mp.Db, mp.Routine_name;";
  150. DataTable dt = QueryExpress.GetTable(cmd, sqlProcedurePrivilege);
  151. WriteCodeBlock(sqlProcedurePrivilege);
  152. WriteTable(dt);
  153. }
  154. void LoadFunctionPrivilege()
  155. {
  156. WriteHead2("Privileges of Function");
  157. string sqlPrivilegeFunction =
  158. @"SELECT mf.host `Host`, mf.user `User`,
  159. CONCAT(mf.Db, '.', mf.Routine_name) `Procedures`,
  160. REPLACE(mf.Proc_priv, ',', ', ') AS `Privileges`
  161. FROM mysql.procs_priv mf WHERE mf.Db = '" + myDatabase.Name + @"'
  162. and mf.Routine_type = 'FUNCTION'
  163. ORDER BY mf.Host, mf.User, mf.Db, mf.Routine_name;";
  164. DataTable dtPrivilegeFunction = QueryExpress.GetTable(cmd, sqlPrivilegeFunction);
  165. WriteCodeBlock(sqlPrivilegeFunction);
  166. WriteTable(dtPrivilegeFunction);
  167. }
  168. void LoadVariables()
  169. {
  170. WriteHead1("System Variables");
  171. string sqlShowVariables = "SHOW variables;";
  172. DataTable dtVariables = QueryExpress.GetTable(cmd, sqlShowVariables);
  173. WriteCodeBlock(sqlShowVariables);
  174. WriteTable(dtVariables);
  175. }
  176. void LoadTables()
  177. {
  178. WriteHead1("Tables");
  179. WriteText("Note: Value of \"Rows\" shown below is not accurate. It is a cache value, it is not up to date. For accurate total rows count, please see the following next table.");
  180. string sqlShowTableStatus = "SHOW TABLE STATUS;";
  181. DataTable dtTableStatus = QueryExpress.GetTable(cmd, sqlShowTableStatus);
  182. WriteCodeBlock(sqlShowTableStatus);
  183. WriteTable(dtTableStatus);
  184. WriteHead2("Actual Total Rows For Each Table");
  185. DataTable dtTotalRows = new DataTable();
  186. dtTotalRows.Columns.Add("Table");
  187. dtTotalRows.Columns.Add("Total Rows");
  188. foreach (MySqlTable table in myDatabase.Tables)
  189. {
  190. dtTotalRows.Rows.Add(table.Name, table.TotalRows);
  191. }
  192. WriteTable(dtTotalRows);
  193. foreach (MySqlTable table in myDatabase.Tables)
  194. {
  195. WriteHead2(table.Name);
  196. WriteCodeBlock(table.Columns.SqlShowFullColumns);
  197. DataTable dtColumns = QueryExpress.GetTable(cmd, table.Columns.SqlShowFullColumns);
  198. WriteTable(dtColumns);
  199. WriteText("Data Type in .NET Framework");
  200. DataTable dtDataType = new DataTable();
  201. dtDataType.Columns.Add("Column Name");
  202. dtDataType.Columns.Add("MySQL Data Type");
  203. dtDataType.Columns.Add(".NET Data Type");
  204. foreach (MySqlColumn myCol in table.Columns)
  205. {
  206. dtDataType.Rows.Add(myCol.Name, myCol.MySqlDataType, myCol.DataType.ToString());
  207. }
  208. WriteTable(dtDataType);
  209. WriteCodeBlock("SHOW CREATE TABLE `" + table.Name + "`;");
  210. WriteCodeBlock(table.CreateTableSqlWithoutAutoIncrement);
  211. }
  212. }
  213. void LoadFunctions()
  214. {
  215. WriteHead1("Functions");
  216. WriteCodeBlock(myDatabase.Functions.SqlShowFunctions);
  217. DataTable dtFunctionList = QueryExpress.GetTable(cmd, myDatabase.Functions.SqlShowFunctions);
  218. WriteTable(dtFunctionList);
  219. WriteCodeBlock("SHOW CREATE FUNCTION `<name>`;");
  220. if (!myDatabase.Functions.AllowAccess)
  221. WriteAccessDeniedErrMsg();
  222. foreach (MySqlFunction func in myDatabase.Functions)
  223. {
  224. WriteHead2(func.Name);
  225. WriteCodeBlock(func.CreateFunctionSQLWithoutDefiner);
  226. }
  227. }
  228. void LoadProcedures()
  229. {
  230. WriteHead1("Procedures");
  231. WriteCodeBlock(myDatabase.Procedures.SqlShowProcedures);
  232. DataTable dtProcedureList = QueryExpress.GetTable(cmd, myDatabase.Procedures.SqlShowProcedures);
  233. WriteTable(dtProcedureList);
  234. WriteCodeBlock("SHOW CREATE PROCEDURE `<name>`;");
  235. if (!myDatabase.Procedures.AllowAccess)
  236. WriteAccessDeniedErrMsg();
  237. foreach (MySqlProcedure proc in myDatabase.Procedures)
  238. {
  239. WriteHead2(proc.Name);
  240. WriteCodeBlock(proc.CreateProcedureSQLWithoutDefiner);
  241. }
  242. }
  243. void LoadTriggers()
  244. {
  245. WriteHead1("Triggers");
  246. WriteCodeBlock(myDatabase.Triggers.SqlShowTriggers);
  247. DataTable dtTriggerList = QueryExpress.GetTable(cmd, myDatabase.Triggers.SqlShowTriggers);
  248. WriteTable(dtTriggerList);
  249. WriteCodeBlock("SHOW CREATE TRIGGER `<name>`;");
  250. if (!myDatabase.Triggers.AllowAccess)
  251. WriteAccessDeniedErrMsg();
  252. foreach (MySqlTrigger trigger in myDatabase.Triggers)
  253. {
  254. WriteHead2(trigger.Name);
  255. WriteCodeBlock(trigger.CreateTriggerSQL);
  256. }
  257. }
  258. void LoadViews()
  259. {
  260. WriteHead1("Views");
  261. WriteCodeBlock(myDatabase.Views.SqlShowViewList);
  262. DataTable dtViewList = QueryExpress.GetTable(cmd, myDatabase.Views.SqlShowViewList);
  263. WriteTable(dtViewList);
  264. WriteCodeBlock("SHOW CREATE VIEW `<name>`;");
  265. if (!myDatabase.Views.AllowAccess)
  266. WriteAccessDeniedErrMsg();
  267. foreach (MySqlView myview in myDatabase.Views)
  268. {
  269. WriteHead2(myview.Name);
  270. WriteCodeBlock(myview.CreateViewSQL);
  271. }
  272. }
  273. void LoadEvents()
  274. {
  275. WriteHead1("Events");
  276. WriteCodeBlock(myDatabase.Events.SqlShowEvent);
  277. DataTable dtEventList = QueryExpress.GetTable(cmd, myDatabase.Events.SqlShowEvent);
  278. WriteTable(dtEventList);
  279. WriteCodeBlock("SHOW CREATE EVENT `<name>`;");
  280. if (!myDatabase.Events.AllowAccess)
  281. WriteAccessDeniedErrMsg();
  282. foreach (MySqlEvent myevent in myDatabase.Events)
  283. {
  284. WriteHead2(myevent.Name);
  285. WriteCodeBlock(myevent.CreateEventSql);
  286. }
  287. }
  288. void WriteHead1(string text)
  289. {
  290. sb.Append("<h1>");
  291. sb.Append(GetHtmlString(text.Trim()));
  292. sb.AppendLine("</h1>");
  293. sb.AppendLine("<hr />");
  294. }
  295. void WriteHead2(string text)
  296. {
  297. sb.Append("<h2>");
  298. sb.Append(GetHtmlString(text.Trim()));
  299. sb.AppendLine("</h2>");
  300. }
  301. void WriteText(string text)
  302. {
  303. sb.AppendLine("<p>");
  304. sb.AppendLine(GetHtmlString(text.Trim()));
  305. sb.AppendLine("</p>");
  306. }
  307. void WriteCodeBlock(string text)
  308. {
  309. sb.AppendLine("<span class=\"code\">");
  310. sb.AppendLine(GetHtmlString(text.Trim()));
  311. sb.AppendLine("</span>");
  312. sb.AppendLine("<br /><br />");
  313. }
  314. void WriteTable(DataTable dt)
  315. {
  316. sb.AppendFormat(HtmlExpress.ConvertDataTableToHtmlTable(dt));
  317. sb.AppendLine("<br />");
  318. }
  319. void WriteAccessDeniedErrMsg()
  320. {
  321. WriteError("Access denied for user " + myServer.CurrentUserClientHost);
  322. }
  323. void WriteError(string errMsg)
  324. {
  325. sb.AppendLine("<br />");
  326. sb.AppendLine("<div style=\"background-color: #FFE8E8; padding: 5px; border: 1px solid #FF0000;\">");
  327. sb.AppendLine("Error or Exception occured. Error message:<br />");
  328. sb.AppendLine(GetHtmlString(errMsg));
  329. sb.AppendLine("</div>");
  330. sb.AppendLine("<br />");
  331. }
  332. string GetHtmlString(string input)
  333. {
  334. input = input.Replace("\r\n", "^||||^").Replace("\n", "^||||^").Replace("\r", "^||||^");
  335. System.Text.StringBuilder sb2 = new System.Text.StringBuilder();
  336. foreach (char c in input)
  337. {
  338. switch (c)
  339. {
  340. case '&':
  341. sb2.AppendFormat("&amp;");
  342. break;
  343. case '"':
  344. sb2.AppendFormat("&quot;");
  345. break;
  346. case '\'':
  347. sb2.AppendFormat("&#39;");
  348. break;
  349. case '<':
  350. sb2.AppendFormat("&lt;");
  351. break;
  352. case '>':
  353. sb2.AppendFormat("&gt;");
  354. break;
  355. default:
  356. sb2.Append(c);
  357. break;
  358. }
  359. }
  360. return sb2.ToString().Replace("^||||^", "<br />");
  361. }
  362. private void timer1_Tick(object sender, EventArgs e)
  363. {
  364. timer1.Stop();
  365. webBrowser1.DocumentText = "<h1>Database info is loading...<br />Please wait...</h1>";
  366. bw.RunWorkerAsync();
  367. }
  368. private void FormDatabaseInfo_Load(object sender, EventArgs e)
  369. {
  370. timer1.Start();
  371. }
  372. private void btExport_Click(object sender, EventArgs e)
  373. {
  374. SaveFileDialog sf = new SaveFileDialog();
  375. sf.Filter = "HTML|*.html";
  376. sf.FileName = myDatabase.Name + ".html";
  377. if (DialogResult.OK == sf.ShowDialog())
  378. {
  379. System.IO.File.WriteAllText(sf.FileName, webBrowser1.DocumentText);
  380. }
  381. }
  382. private void btRefresh_Click(object sender, EventArgs e)
  383. {
  384. timer1.Start();
  385. }
  386. private void btPrint_Click(object sender, EventArgs e)
  387. {
  388. webBrowser1.ShowPrintPreviewDialog();
  389. }
  390. }
  391. }