Add projects support for Fabric DW (#24014)

* Update STS and add new platform

* Update vsix version

* Create Fabric DW project from database

* Fix target platform name

* Address comments

* Revert projects version to 1.3.0

* Update STS to 4.9.0.22

* PR comment
This commit is contained in:
Z Chen
2023-08-28 11:16:38 -07:00
committed by GitHub
parent 57d0fa8e79
commit 98c17b85e7
4 changed files with 39 additions and 9 deletions

View File

@@ -620,6 +620,7 @@ export function differentDbDifferentServerExampleUsage(server: string, db: strin
//#region Target platforms //#region Target platforms
export const targetPlatformToVersion: Map<string, string> = new Map<string, string>([ export const targetPlatformToVersion: Map<string, string> = new Map<string, string>([
// Note: the values here must match values from Microsoft.Data.Tools.Schema.SchemaModel.SqlPlatformNames
[SqlTargetPlatform.sqlServer2012, '110'], [SqlTargetPlatform.sqlServer2012, '110'],
[SqlTargetPlatform.sqlServer2014, '120'], [SqlTargetPlatform.sqlServer2014, '120'],
[SqlTargetPlatform.sqlServer2016, '130'], [SqlTargetPlatform.sqlServer2016, '130'],
@@ -627,7 +628,8 @@ export const targetPlatformToVersion: Map<string, string> = new Map<string, stri
[SqlTargetPlatform.sqlServer2019, '150'], [SqlTargetPlatform.sqlServer2019, '150'],
[SqlTargetPlatform.sqlServer2022, '160'], [SqlTargetPlatform.sqlServer2022, '160'],
[SqlTargetPlatform.sqlAzure, 'AzureV12'], [SqlTargetPlatform.sqlAzure, 'AzureV12'],
[SqlTargetPlatform.sqlDW, 'Dw'] [SqlTargetPlatform.sqlDW, 'Dw'],
[SqlTargetPlatform.sqlDwUnified, 'DwUnified']
]); ]);
export const onPremServerVersionToTargetPlatform: Map<number, SqlTargetPlatform> = new Map<number, SqlTargetPlatform>([ export const onPremServerVersionToTargetPlatform: Map<number, SqlTargetPlatform> = new Map<number, SqlTargetPlatform>([

View File

@@ -718,9 +718,10 @@ export async function fileContainsCreateTableStatement(fullPath: string, project
/** /**
* Gets target platform based on the server edition/version * Gets target platform based on the server edition/version
* @param serverInfo server information * @param serverInfo server information
* @param serverUrl optional server URL, only used to check if it's a known domain for Microsoft Fabric DW
* @returns target platform for the database project * @returns target platform for the database project
*/ */
export async function getTargetPlatformFromServerVersion(serverInfo: azdataType.ServerInfo | vscodeMssql.IServerInfo): Promise<SqlTargetPlatform | undefined> { export async function getTargetPlatformFromServerVersion(serverInfo: azdataType.ServerInfo | vscodeMssql.IServerInfo, serverUrl?: string): Promise<SqlTargetPlatform | undefined> {
const isCloud = serverInfo.isCloud; const isCloud = serverInfo.isCloud;
let targetPlatform; let targetPlatform;
@@ -728,9 +729,25 @@ export async function getTargetPlatformFromServerVersion(serverInfo: azdataType.
const engineEdition = serverInfo.engineEditionId; const engineEdition = serverInfo.engineEditionId;
const azdataApi = getAzdataApi(); const azdataApi = getAzdataApi();
if (azdataApi) { if (azdataApi) {
targetPlatform = engineEdition === azdataApi.DatabaseEngineEdition.SqlDataWarehouse ? SqlTargetPlatform.sqlDW : SqlTargetPlatform.sqlAzure; // TODO: Update this when Fabric DW gets its own engine edition
// https://github.com/microsoft/azuredatastudio/issues/24112
if (engineEdition === azdataApi.DatabaseEngineEdition.SqlOnDemand && isSqlDwUnifiedServer(serverUrl)) {
targetPlatform = SqlTargetPlatform.sqlDwUnified;
} else if (engineEdition === azdataApi.DatabaseEngineEdition.SqlDataWarehouse) {
targetPlatform = SqlTargetPlatform.sqlDW;
} else {
targetPlatform = SqlTargetPlatform.sqlAzure;
}
} else { } else {
targetPlatform = engineEdition === vscodeMssql.DatabaseEngineEdition.SqlDataWarehouse ? SqlTargetPlatform.sqlDW : SqlTargetPlatform.sqlAzure; // TODO: Update this when Fabric DW gets its own engine edition
// https://github.com/microsoft/azuredatastudio/issues/24112
if (engineEdition === vscodeMssql.DatabaseEngineEdition.SqlOnDemand && isSqlDwUnifiedServer(serverUrl)) {
targetPlatform = SqlTargetPlatform.sqlDwUnified;
} else if (engineEdition === vscodeMssql.DatabaseEngineEdition.SqlDataWarehouse) {
targetPlatform = SqlTargetPlatform.sqlDW;
} else {
targetPlatform = SqlTargetPlatform.sqlAzure;
}
} }
} else { } else {
const serverMajorVersion = serverInfo.serverMajorVersion; const serverMajorVersion = serverInfo.serverMajorVersion;
@@ -740,6 +757,16 @@ export async function getTargetPlatformFromServerVersion(serverInfo: azdataType.
return targetPlatform; return targetPlatform;
} }
/**
* Determines if a server name is a known domain for Microsoft Fabric DW. This is required because the engine edition for Fabric DW is the same as Serverless.
* @param server The server name to check
* @returns True if the server name matches a known domain for Microsoft Fabric DW, otherwise false
*/
export function isSqlDwUnifiedServer(server?: string): boolean | undefined {
const serverLowerCase = server?.toLowerCase();
return serverLowerCase?.includes("datawarehouse.pbidedicated.windows.net") || serverLowerCase?.includes("datawarehouse.fabric.microsoft.com");
}
/** /**
* Determines if a given character is a valid filename character * Determines if a given character is a valid filename character
* @param c Character to validate * @param c Character to validate

View File

@@ -1559,7 +1559,7 @@ export class ProjectsController {
if (utils.getAzdataApi()) { if (utils.getAzdataApi()) {
let createProjectFromDatabaseDialog = this.getCreateProjectFromDatabaseDialog(profile as azdataType.IConnectionProfile); let createProjectFromDatabaseDialog = this.getCreateProjectFromDatabaseDialog(profile as azdataType.IConnectionProfile);
createProjectFromDatabaseDialog.createProjectFromDatabaseCallback = async (model, connectionId) => await this.createProjectFromDatabaseCallback(model, connectionId); createProjectFromDatabaseDialog.createProjectFromDatabaseCallback = async (model, connectionId) => await this.createProjectFromDatabaseCallback(model, connectionId, (profile as azdataType.IConnectionProfile)?.serverName);
await createProjectFromDatabaseDialog.openDialog(); await createProjectFromDatabaseDialog.openDialog();
@@ -1575,7 +1575,7 @@ export class ProjectsController {
} }
const model = await createNewProjectFromDatabaseWithQuickpick(profile as mssqlVscode.IConnectionInfo); const model = await createNewProjectFromDatabaseWithQuickpick(profile as mssqlVscode.IConnectionInfo);
if (model) { if (model) {
await this.createProjectFromDatabaseCallback(model, profile as mssqlVscode.IConnectionInfo); await this.createProjectFromDatabaseCallback(model, profile as mssqlVscode.IConnectionInfo, (profile as mssqlVscode.IConnectionInfo)?.server);
} }
return undefined; return undefined;
} }
@@ -1586,7 +1586,7 @@ export class ProjectsController {
return new CreateProjectFromDatabaseDialog(profile); return new CreateProjectFromDatabaseDialog(profile);
} }
public async createProjectFromDatabaseCallback(model: ImportDataModel, connectionInfo?: string | mssqlVscode.IConnectionInfo) { public async createProjectFromDatabaseCallback(model: ImportDataModel, connectionInfo?: string | mssqlVscode.IConnectionInfo, serverName?: string) {
try { try {
const newProjFolderUri = model.filePath; const newProjFolderUri = model.filePath;
@@ -1601,7 +1601,7 @@ export class ProjectsController {
} }
if (serverInfo) { if (serverInfo) {
targetPlatform = await utils.getTargetPlatformFromServerVersion(serverInfo); targetPlatform = await utils.getTargetPlatformFromServerVersion(serverInfo, serverName);
} }
const newProjFilePath = await this.createNewProject({ const newProjFilePath = await this.createNewProject({

View File

@@ -321,7 +321,8 @@ declare module 'sqldbproj' {
sqlServer2022 = 'SQL Server 2022', sqlServer2022 = 'SQL Server 2022',
sqlAzure = 'Azure SQL Database', sqlAzure = 'Azure SQL Database',
sqlDW = 'Azure Synapse SQL Pool', sqlDW = 'Azure Synapse SQL Pool',
sqlEdge = 'Azure SQL Edge' sqlEdge = 'Azure SQL Edge',
sqlDwUnified = 'Synapse Data Warehouse in Microsoft Fabric'
} }
export interface ISqlConnectionProperties { export interface ISqlConnectionProperties {