From 30ba54b78c9e5b33762ea377d9ae63277db5127e Mon Sep 17 00:00:00 2001 From: microleft Date: Mon, 12 Mar 2018 22:09:47 +0800 Subject: [PATCH] Show query result as HTML table (#30) * Show query result as HTML table * Show query result as HTML table * Extract one method for similar code --- src/common/utility.ts | 24 ++++++++-- src/extension.ts | 4 ++ src/sqlResultDocumentContentProvider.ts | 62 +++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 src/sqlResultDocumentContentProvider.ts diff --git a/src/common/utility.ts b/src/common/utility.ts index 10b0551..cb56c16 100644 --- a/src/common/utility.ts +++ b/src/common/utility.ts @@ -62,19 +62,21 @@ export class Utility { connection.query(sql, (err, rows) => { if (Array.isArray(rows)) { if (rows.some(((row) => Array.isArray(row)))) { - rows.forEach((row) => { + rows.forEach((row, index) => { if (Array.isArray(row)) { - OutputChannel.appendLine(asciitable(row)); + Utility.showQueryResult(row, "Results " + (index + 1)); } else { OutputChannel.appendLine(JSON.stringify(row)); } }); } else { - OutputChannel.appendLine(asciitable(rows)); + Utility.showQueryResult(rows, "Results"); } + } else { OutputChannel.appendLine(JSON.stringify(rows)); } + if (err) { OutputChannel.appendLine(err); AppInsightsClient.sendEvent("runQuery.end", { Result: "Fail", ErrorMessage: err }); @@ -101,6 +103,22 @@ export class Utility { return mysql.createConnection(newConnectionOptions); } + private static getPreviewUri(data) { + const uri = vscode.Uri.parse("sqlresult://mysql/data"); + + return uri.with({ query: data }); + } + + private static showQueryResult(data, title: string) { + vscode.commands.executeCommand( + "vscode.previewHtml", + Utility.getPreviewUri(JSON.stringify(data)), + vscode.ViewColumn.Two, + title).then(() => { }, (e) => { + OutputChannel.appendLine(e); + }); + } + private static async hasActiveConnection(): Promise { let count = 5; while (!Global.activeConnection && count > 0) { diff --git a/src/extension.ts b/src/extension.ts index 1410ff6..9f83ec6 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -7,10 +7,14 @@ import { DatabaseNode } from "./model/databaseNode"; import { INode } from "./model/INode"; import { TableNode } from "./model/tableNode"; import { MySQLTreeDataProvider } from "./mysqlTreeDataProvider"; +import { SqlResultDocumentContentProvider } from "./sqlResultDocumentContentProvider"; export function activate(context: vscode.ExtensionContext) { AppInsightsClient.sendEvent("loadExtension"); + const provider = new SqlResultDocumentContentProvider(context); + context.subscriptions.push(vscode.workspace.registerTextDocumentContentProvider("sqlresult", provider)); + const mysqlTreeDataProvider = new MySQLTreeDataProvider(context); context.subscriptions.push(vscode.window.registerTreeDataProvider("mysql", mysqlTreeDataProvider)); diff --git a/src/sqlResultDocumentContentProvider.ts b/src/sqlResultDocumentContentProvider.ts new file mode 100644 index 0000000..99a0fb0 --- /dev/null +++ b/src/sqlResultDocumentContentProvider.ts @@ -0,0 +1,62 @@ +import { ExtensionContext, TextDocumentContentProvider, Uri } from "vscode"; + +export class SqlResultDocumentContentProvider implements TextDocumentContentProvider { + + private _context: ExtensionContext; + + constructor(context: ExtensionContext) { + this._context = context; + } + + public provideTextDocumentContent(uri: Uri): Thenable { + + const self = this; + return new Promise((resolve, reject) => { + const head = [].concat( + "", + "", + "", + '', + "", + "", + "", + ).join("\n"); + + const body = self._render(JSON.parse(uri.query)); + + const tail = [ + "", + "", + ].join("\n"); + + resolve(head + body + tail); + }); + } + + private _render(rows) { + if (rows.length === 0) { + return "No data"; + } + + let head = ""; + for (const field in rows[0]) { + if (rows[0].hasOwnProperty(field)) { + head += "" + field + ""; + } + } + let body = "" + head + ""; + rows.forEach((row) => { + body += ""; + for (const field in row) { + if (row.hasOwnProperty(field)) { + body += ""; + } + } + + body += ""; + }); + + return body + "
" + row[field] + "
"; + } + +}