Azure Data Studio 扩展性 API
Azure Data Studio 提供了一个 API,扩展可以使用该 API 与 Azure Data Studio 的其他部分(例如对象资源管理器)进行交互。 这些 API 可从 src/sql/azdata.d.ts
文件中获得,如下所述。
连接管理
azdata.connection
顶级函数
getCurrentConnection(): Thenable<azdata.connection.Connection>
根据活动编辑器或对象资源管理器选择获取当前连接。getActiveConnections(): Thenable<azdata.connection.Connection[]>
获取用户的所有活动连接的列表。 如果没有此类连接,则返回一个空列表。getCredentials(connectionId: string): Thenable<{ [name: string]: string }>
获取一个字典,其中包含与连接关联的凭据。 如果不以字典的形式获取凭据,这些凭据将作为选项字典的一部分在azdata.connection.Connection
对象下返回,但会从该对象中去除。
Connection
options: { [name: string]: string }
连接选项字典providerName: string
连接提供程序的名称(例如“MSSQL”)connectionId: string
连接的唯一标识符
示例代码
> let connection = azdata.connection.getCurrentConnection();
connection: {
providerName: 'MSSQL',
connectionId: 'd97bb63a-466e-4ef0-ab6f-00cd44721dcc',
options: {
server: 'mairvine-sql-server',
user: 'sa',
authenticationType: 'sqlLogin',
...
},
...
}
> let credentials = azdata.connection.getCredentials(connection.connectionId);
credentials: {
password: 'abc123'
}
“对象资源管理器”
azdata.objectexplorer
顶级函数
getNode(connectionId: string, nodePath?: string): Thenable<azdata.objectexplorer.ObjectExplorerNode>
获取与给定连接和路径对应的对象资源管理器节点。 如果未给定路径,则返回给定连接的顶级节点。 如果给定路径上没有节点,则返回undefined
。 注意:对象的nodePath
由 SQL 工具服务后端生成,很难手动构造。 未来的 API 改进将允许根据你提供的有关节点的元数据来获取节点,例如名称、类型和架构。getActiveConnectionNodes(): Thenable<azdata.objectexplorer.ObjectExplorerNode>
获取所有活动的对象资源管理器连接节点。findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames: string[]): Thenable<azdata.objectexplorer.ObjectExplorerNode[]>
查找与给定元数据匹配的所有对象资源管理器节点。schema
、database
和parentObjectNames
参数在不适用时应为undefined
。parentObjectNames
是对象资源管理器中位于所需对象之上的非数据库父对象(从最高级别到最低级别)的列表。 例如,当使用连接 IDconnectionId
搜索属于表“schema1.table1”和数据库“database1”的列“column1”时,请调用findNodes(connectionId, 'Column', undefined, 'column1', 'database1', ['schema1.table1'])
。 另请参阅 Azure Data Studio 针对此 API 调用默认支持的类型的列表。
ObjectExplorerNode
connectionId: string
节点所在的连接的 IDnodePath: string
节点的路径,用于调用getNode
函数。nodeType: string
表示节点类型的字符串nodeSubType: string
表示节点子类型的字符串nodeStatus: string
表示节点状态的字符串label: string
对象资源管理器中显示的节点标签isLeaf: boolean
节点是否为叶节点,因此没有任何子级metadata: azdata.ObjectMetadata
描述此节点表示的对象的元数据errorMessage: string
节点处于错误状态时显示的消息isExpanded(): Thenable<boolean>
节点当前是否在对象资源管理器中展开setExpandedState(expandedState: vscode.TreeItemCollapsibleState): Thenable<void>
设置节点是展开还是折叠。 如果状态设置为“无”,则不会更改节点。setSelected(selected: boolean, clearOtherSelections?: boolean): Thenable<void>
设置是否选择了节点。 如果clearOtherSelections
为 true,则在进行新选择时清除所有其他选择。 如果为 false,则保留所有现有选择。 如果selected
为 true,则clearOtherSelections
默认为 true;如果selected
为 false,则默认为 false。getChildren(): Thenable<azdata.objectexplorer.ObjectExplorerNode[]>
获取此节点的所有子节点。 如果没有子节点,则返回一个空列表。getParent(): Thenable<azdata.objectexplorer.ObjectExplorerNode>
获取此节点的父节点。 如果没有父节点,则返回 undefined。
示例代码
private async interactWithOENode(selectedNode: azdata.objectexplorer.ObjectExplorerNode): Promise<void> {
let choices = ['Expand', 'Collapse', 'Select', 'Select (multi)', 'Deselect', 'Deselect (multi)'];
if (selectedNode.isLeaf) {
choices[0] += ' (is leaf)';
choices[1] += ' (is leaf)';
} else {
let expanded = await selectedNode.isExpanded();
if (expanded) {
choices[0] += ' (is expanded)';
} else {
choices[1] += ' (is collapsed)';
}
}
let parent = await selectedNode.getParent();
if (parent) {
choices.push('Get Parent');
}
let children = await selectedNode.getChildren();
children.forEach(child => choices.push(child.label));
let choice = await vscode.window.showQuickPick(choices);
let nextNode: azdata.objectexplorer.ObjectExplorerNode = undefined;
if (choice === choices[0]) {
selectedNode.setExpandedState(vscode.TreeItemCollapsibleState.Expanded);
} else if (choice === choices[1]) {
selectedNode.setExpandedState(vscode.TreeItemCollapsibleState.Collapsed);
} else if (choice === choices[2]) {
selectedNode.setSelected(true);
} else if (choice === choices[3]) {
selectedNode.setSelected(true, false);
} else if (choice === choices[4]) {
selectedNode.setSelected(false);
} else if (choice === choices[5]) {
selectedNode.setSelected(false, true);
} else if (choice === 'Get Parent') {
nextNode = parent;
} else {
let childNode = children.find(child => child.label === choice);
nextNode = childNode;
}
if (nextNode) {
let updatedNode = await azdata.objectexplorer.getNode(nextNode.connectionId, nextNode.nodePath);
this.interactWithOENode(updatedNode);
}
}
vscode.commands.registerCommand('mssql.objectexplorer.interact', () => {
azdata.objectexplorer.getActiveConnectionNodes().then(activeConnections => {
vscode.window.showQuickPick(activeConnections.map(connection => connection.label + ' ' + connection.connectionId)).then(selection => {
let selectedNode = activeConnections.find(connection => connection.label + ' ' + connection.connectionId === selection);
this.interactWithOENode(selectedNode);
});
});
});
建议的 API
我们添加了建议的 API,以允许扩展在对话框、向导和文档选项卡中显示自定义 UI 以及其他功能。 有关更多文档,请参阅建议的 API 类型文件,但请注意,这些 API 随时可能发生更改。 有关如何使用其中一些 API 的示例,请参阅“sqlservices”示例扩展。