API de extensibilidad de Azure Data Studio
Azure Data Studio proporciona una API que las extensiones pueden usar para interactuar con otros elementos de Azure Data Studio, como el Explorador de objetos. Estas API están disponibles en el archivo src/sql/azdata.d.ts
y se describen a continuación.
Administración de las conexiones
azdata.connection
Funciones de nivel superior
getCurrentConnection(): Thenable<azdata.connection.Connection>
Obtiene la conexión actual en función del editor activo o de la selección del Explorador de objetos.getActiveConnections(): Thenable<azdata.connection.Connection[]>
Obtiene una lista de todas las conexiones del usuario que están activas. Devuelve una lista vacía si no hay ninguna conexión de este tipo.getCredentials(connectionId: string): Thenable<{ [name: string]: string }>
Obtiene un diccionario que contiene las credenciales asociadas a una conexión. De lo contrario, se devolverán como parte del diccionario de opciones en un objetoazdata.connection.Connection
, pero se eliminarán de ese objeto.
Connection
options: { [name: string]: string }
El diccionario de las opciones de conexiónproviderName: string
El nombre del proveedor de conexión (por ejemplo, "MSSQL")connectionId: string
El identificador único para la conexión
Código de ejemplo
> 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'
}
Explorador de objetos
azdata.objectexplorer
Funciones de nivel superior
getNode(connectionId: string, nodePath?: string): Thenable<azdata.objectexplorer.ObjectExplorerNode>
Obtiene un nodo del Explorador de objetos correspondiente a la conexión y ruta de acceso especificadas. Si no se especifica ninguna ruta de acceso, devuelve el nodo de nivel superior para la conexión especificada. Si no hay ningún nodo en la ruta de acceso especificada, devuelveundefined
. Nota: ElnodePath
de un objeto se genera mediante el back-end del servicio de herramientas de SQL y es difícil de construir a mano. Las futuras mejoras de la API permitirán obtener nodos basados en los metadatos que se proporcionen sobre el nodo, como el nombre, el tipo y el esquema.getActiveConnectionNodes(): Thenable<azdata.objectexplorer.ObjectExplorerNode>
Obtiene todos los nodos de conexión del Explorador de objetos activos.findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames: string[]): Thenable<azdata.objectexplorer.ObjectExplorerNode[]>
Busca todos los nodos del Explorador de objetos que coinciden con los metadatos especificados. Los argumentosschema
,database
yparentObjectNames
deben serundefined
cuando no son aplicables.parentObjectNames
es una lista de objetos primarios que no son de base de datos, del nivel más alto al más bajo en el Explorador de objetos, en el que se encuentra el objeto deseado. Por ejemplo, al buscar una columna "column1" que pertenezca a una tabla "schema1.table1" y la base de datos "database1" con el identificador de conexiónconnectionId
, llame afindNodes(connectionId, 'Column', undefined, 'column1', 'database1', ['schema1.table1'])
. Consulte también la lista de tipos que Azure Data Studio admite de forma predeterminada para esta llamada API.
ObjectExplorerNode
connectionId: string
El identificador de la conexión en la que existe el nodonodePath: string
La ruta de acceso del nodo, tal y como se usa para una llamada a la funcióngetNode
nodeType: string
Una cadena que representa el tipo de nodonodeSubType: string
Una cadena que representa el subtipo de nodonodeStatus: string
Una cadena que representa el estado del nodolabel: string
La etiqueta del nodo tal y como aparece en el Explorador de objetosisLeaf: boolean
Si el nodo es un nodo hoja y, por tanto, no tiene ningún elemento secundariometadata: azdata.ObjectMetadata
Metadatos que describen el objeto representado por este nodoerrorMessage: string
Mensaje que se muestra si el nodo está en un estado de errorisExpanded(): Thenable<boolean>
Si el nodo está expandido actualmente en el Explorador de objetossetExpandedState(expandedState: vscode.TreeItemCollapsibleState): Thenable<void>
Establece si el nodo está expandido o contraído. Si el estado se establece en Ninguno, no se cambiará el nodo.setSelected(selected: boolean, clearOtherSelections?: boolean): Thenable<void>
Establece si el nodo está seleccionado. SiclearOtherSelections
es true, borre las demás selecciones al crear la nueva selección. Si es false, deje las selecciones existentes.clearOtherSelections
tiene como valor predeterminado true cuandoselected
es true y false cuandoselected
es false.getChildren(): Thenable<azdata.objectexplorer.ObjectExplorerNode[]>
Obtiene todos los nodos secundarios de este nodo. Devuelve una lista vacía si no hay elementos secundarios.getParent(): Thenable<azdata.objectexplorer.ObjectExplorerNode>
Obtiene el nodo primario de este nodo. Devuelve undefined si no hay ningún primario.
Código de ejemplo
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 propuestas
Hemos agregado API propuestas para permitir que las extensiones muestren la interfaz de usuario personalizada en los cuadros de diálogo, los asistentes y las pestañas de documentos, entre otras funcionalidades. Consulte el archivo de tipos de API propuestas para obtener más documentación, aunque tenga en cuenta que estas API están sujetas a cambios en cualquier momento. Puede encontrar ejemplos de cómo usar algunas de estas API en la extensión de ejemplo "sqlservices".