diff --git a/src/api/IBMi.ts b/src/api/IBMi.ts index 5c18f7701..9ea525573 100644 --- a/src/api/IBMi.ts +++ b/src/api/IBMi.ts @@ -278,7 +278,7 @@ export default class IBMi { } } - const connectConfig: node_ssh.Config = { + const connectConfig: node_ssh.Config = { ...connectionObject, privateKeyPath: connectionObject.privateKeyPath ? Tools.resolvePath(connectionObject.privateKeyPath) : undefined, passphrase: connectionObject.privateKeyPath ? connectionObject.passphrase : undefined, @@ -1255,6 +1255,10 @@ export default class IBMi { return this.sqlJob?.id; } + public getSqlJobJDBCOptions() { + return this.sqlJob?.options; + } + /** * Generates path to a temp file on the IBM i * @param {string} key Key to the temp file to be re-used diff --git a/src/commands/actions.ts b/src/commands/actions.ts index 45499f2aa..b5b575e7e 100644 --- a/src/commands/actions.ts +++ b/src/commands/actions.ts @@ -1,5 +1,5 @@ import path from "path"; -import { commands, Disposable, env, l10n, TreeItem, Uri, window, WorkspaceFolder } from "vscode"; +import { commands, Disposable, l10n, TreeItem, Uri, window, WorkspaceFolder } from "vscode"; import IBMi from "../api/IBMi"; import { Tools } from "../api/Tools"; import Instance from "../Instance"; @@ -127,7 +127,7 @@ export function registerActionsCommands(instance: Instance): Disposable[] { ext: undefined }; - let inputPath: string | undefined + let inputPath: string | undefined const connection = instance.getConnection()!; //safe as action requires to be connected if (options.qualifiedObject) { @@ -137,7 +137,7 @@ export function registerActionsCommands(instance: Instance): Disposable[] { // Value collected from user input let initialPath = ``; - const editor = window.activeTextEditor; + const editor = window.activeTextEditor; if (editor && connection) { const config = connection.getConfig(); @@ -183,16 +183,5 @@ export function registerActionsCommands(instance: Instance): Disposable[] { } } }), - - commands.registerCommand(`code-for-ibmi.copyJobId`, async () => { - const connection = instance.getConnection(); - const sqlJobId = connection?.getSqlJobId(); - if (sqlJobId) { - await env.clipboard.writeText(sqlJobId); - window.showInformationMessage(`Job ID copied: ${sqlJobId}`); - } else { - window.showWarningMessage(`No job ID available`); - } - }), ] } \ No newline at end of file diff --git a/src/commands/connection.ts b/src/commands/connection.ts index 41838943d..3e5ab8e38 100644 --- a/src/commands/connection.ts +++ b/src/commands/connection.ts @@ -1,4 +1,4 @@ -import { commands, Disposable, ExtensionContext, window } from "vscode"; +import { commands, Disposable, ExtensionContext, window, env } from "vscode"; import { ConnectionResult } from "../api/IBMi"; import { setStoredPassword } from "../config/passwords"; import Instance from "../Instance"; @@ -30,5 +30,26 @@ export function registerConnectionCommands(context: ExtensionContext, instance: window.showErrorMessage(`Not currently connected to any system.`); } }), + commands.registerCommand(`code-for-ibmi.copyJobId`, async () => { + const connection = instance.getConnection(); + const sqlJobId = connection?.getSqlJobId(); + if (sqlJobId) { + await env.clipboard.writeText(sqlJobId); + window.showInformationMessage(`Job ID copied: ${sqlJobId}`); + } else { + window.showWarningMessage(`No job ID available`); + } + }), + commands.registerCommand(`code-for-ibmi.showIBMiJobInfo`, async () => { + const connection = instance.getConnection(); + if (connection) { + const job = await connection.getSqlJobId(); + if (job) { + await commands.executeCommand('vscode-ibmi-fs.wrkjob', job); + } else { + window.showErrorMessage(`Unable to retrieve current SQL job ID.`); + } + } + }), ] } \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index 33c1fed56..bb506e1c3 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -44,7 +44,7 @@ import { SettingsUI } from "./webviews/settings"; let temporaryPassword: string | undefined; export let getPassword: (connection: IBMi, prompt: string) => Promise; -export const setTemporaryPassword = (password:string) => temporaryPassword = password; +export const setTemporaryPassword = (password: string) => temporaryPassword = password; export const clearPassword = () => temporaryPassword = undefined; export async function activate(context: ExtensionContext): Promise { @@ -128,6 +128,7 @@ export async function activate(context: ExtensionContext): Promise commands.executeCommand("code-for-ibmi.refreshLibraryListView"); commands.executeCommand("code-for-ibmi.refreshIFSBrowser"); commands.executeCommand("code-for-ibmi.environment.refresh"); + commands.executeCommand("code-for-ibmi.updateJobInfoBar"); }); getPassword = async (connection, prompt) => { @@ -136,7 +137,7 @@ export async function activate(context: ExtensionContext): Promise if (password) { return password; } - + return temporaryPassword = await window.showInputBox({ password: true, prompt diff --git a/src/instantiate.ts b/src/instantiate.ts index c8d5738e4..281e461bf 100644 --- a/src/instantiate.ts +++ b/src/instantiate.ts @@ -30,6 +30,12 @@ connectedBarItem.command = { title: `Show connection settings` }; +const jobInfoBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 10); +jobInfoBarItem.command = { + command: `code-for-ibmi.copyJobId`, + title: `Copy job ID to clipboard` +}; + export async function safeDisconnect(): Promise { let doDisconnect = true; @@ -64,6 +70,7 @@ export async function loadAllofExtension(context: vscode.ExtensionContext) { context.subscriptions.push( connectedBarItem, disconnectBarItem, + jobInfoBarItem, ...registerConnectionCommands(context, instance), @@ -80,6 +87,8 @@ export async function loadAllofExtension(context: vscode.ExtensionContext) { ...registerPasswordCommands(context, instance), vscode.commands.registerCommand("code-for-ibmi.updateConnectedBar", updateConnectedBar), + + vscode.commands.registerCommand("code-for-ibmi.updateJobInfoBar", updateJobInfoBar), ); instance.subscribe(context, 'connected', 'Load status bars', onConnected); @@ -104,7 +113,7 @@ async function updateConnectedBar() { const remoteConnectionConfig = connection.getConfigFile(`settings`); const serverConfigOk = remoteConnectionConfig.getState() === `ok`; - let serverConfig: RemoteConfigFile|undefined; + let serverConfig: RemoteConfigFile | undefined; if (serverConfigOk) { serverConfig = await remoteConnectionConfig.get(); } @@ -115,9 +124,7 @@ async function updateConnectedBar() { const actionsMenuItem = systemReadOnly ? `` : `[$(file-binary) Actions](command:code-for-ibmi.environment.actions.focus)`; const debugRunning = await isDebugEngineRunning(); const connectedBarItemTooltips: String[] = systemReadOnly ? [`[System-wide read only](https://codefori.github.io/docs/settings/system/)`] : []; - const sqlJobId = connection.getSqlJobId(); - const sqlJobInfo = sqlJobId ? `[$(database) Job: ${sqlJobId}](command:code-for-ibmi.copyJobId)` : `$(database) Job: Not available`; - + connectedBarItemTooltips.push( `[$(settings-gear) Settings](command:code-for-ibmi.showAdditionalSettings)`, terminalMenuItem, @@ -126,8 +133,7 @@ async function updateConnectedBar() { debugPTFInstalled(connection) ? `[$(${debugRunning ? "bug" : "debug"}) Debugger ${((await getDebugServiceDetails(connection)).version)} (${debugRunning ? "on" : "off"})](command:ibmiDebugBrowser.focus)` : - `[$(debug) No debug PTF](https://codefori.github.io/docs/developing/debug/#required-ptfs)`, - sqlJobInfo + `[$(debug) No debug PTF](https://codefori.github.io/docs/developing/debug/#required-ptfs)` ); connectedBarItem.tooltip = new vscode.MarkdownString(connectedBarItemTooltips.join(`\n\n---\n\n`), true); connectedBarItem.tooltip.isTrusted = true; @@ -137,10 +143,34 @@ async function updateConnectedBar() { } } +async function updateJobInfoBar() { + const connection = instance.getConnection(); + if (connection && connection.sqlRunnerAvailable()) { + const sqlJobId = connection.getSqlJobId(); + const jdbcOptions = connection.getSqlJobJDBCOptions() || {}; + const jdbcInfo = [ + `Active JDBC connection options:`, + ``, + ...Object.entries(jdbcOptions).map(([key, value]) => `- ${key}: ${value}`) + ].join(`\n`); + + jobInfoBarItem.text = `$(server-environment) ${sqlJobId}`; + const jobInfoBarItemTooltips: String[] = []; + const sqlJobInfo = sqlJobId ? `[$(server-process) Job Info](command:code-for-ibmi.showIBMiJobInfo)` : ``; + jobInfoBarItemTooltips.push( + jdbcInfo, + sqlJobInfo, + ); + jobInfoBarItem.tooltip = new vscode.MarkdownString(jobInfoBarItemTooltips.join(`\n\n---\n\n`), true); + jobInfoBarItem.tooltip.isTrusted = true; + } +} + async function onConnected() { [ connectedBarItem, disconnectBarItem, + jobInfoBarItem, ].forEach(barItem => barItem.show()); } @@ -149,5 +179,6 @@ async function onDisconnected() { [ disconnectBarItem, connectedBarItem, + jobInfoBarItem, ].forEach(barItem => barItem.hide()) }