diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index df0a9dd3f4..91d08e59bd 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -78,6 +78,7 @@ export const dataSourceDropdownTitle = localize('dataSourceDropdownTitle', "Data export const noDataSourcesText = localize('noDataSourcesText', "No data sources in this project"); export const loadProfileButtonText = localize('loadProfileButtonText', "Load Profile..."); export const profileWarningText = localize('profileWarningText', "⚠ Warning: Connection strings using AAD Authentication are not supported at this time"); +export const profileReadError = localize('profileReadError', "Could not load the profile file."); export const sqlCmdTableLabel = localize('sqlCmdTableLabel', "SQLCMD Variables"); export const sqlCmdVariableColumn = localize('sqlCmdVariableColumn', "Variable"); export const sqlCmdValueColumn = localize('sqlCmdValueColumn', "Value"); @@ -158,6 +159,7 @@ export const Version = 'Version'; export const PrivateAssets = 'PrivateAssets'; export const SqlCmdVariable = 'SqlCmdVariable'; export const DefaultValue = 'DefaultValue'; +export const Value = 'Value'; export const ArtifactReference = 'ArtifactReference'; export const SuppressMissingDependenciesErrors = 'SuppressMissingDependenciesErrors'; export const DatabaseVariableLiteralValue = 'DatabaseVariableLiteralValue'; diff --git a/extensions/sql-database-projects/src/common/utils.ts b/extensions/sql-database-projects/src/common/utils.ts index 2a8645cde6..b00c07dbae 100644 --- a/extensions/sql-database-projects/src/common/utils.ts +++ b/extensions/sql-database-projects/src/common/utils.ts @@ -127,12 +127,18 @@ export function convertSlashesForSqlProj(filePath: string): string { */ export function readSqlCmdVariables(xmlDoc: any): Record { let sqlCmdVariables: Record = {}; - for (let i = 0; i < xmlDoc.documentElement.getElementsByTagName(constants.SqlCmdVariable).length; i++) { + for (let i = 0; i < xmlDoc.documentElement.getElementsByTagName(constants.SqlCmdVariable)?.length; i++) { const sqlCmdVar = xmlDoc.documentElement.getElementsByTagName(constants.SqlCmdVariable)[i]; const varName = sqlCmdVar.getAttribute(constants.Include); - const varValue = sqlCmdVar.getElementsByTagName(constants.DefaultValue)[0].childNodes[0].nodeValue; - sqlCmdVariables[varName] = varValue; + if (sqlCmdVar.getElementsByTagName(constants.DefaultValue)[0] !== undefined) { + // project file path + sqlCmdVariables[varName] = sqlCmdVar.getElementsByTagName(constants.DefaultValue)[0].childNodes[0].nodeValue; + } + else { + // profile path + sqlCmdVariables[varName] = sqlCmdVar.getElementsByTagName(constants.Value)[0].childNodes[0].nodeValue; + } } return sqlCmdVariables; diff --git a/extensions/sql-database-projects/src/controllers/projectController.ts b/extensions/sql-database-projects/src/controllers/projectController.ts index 0261a7640d..70f6215e42 100644 --- a/extensions/sql-database-projects/src/controllers/projectController.ts +++ b/extensions/sql-database-projects/src/controllers/projectController.ts @@ -231,9 +231,15 @@ export class ProjectsController { } public async readPublishProfileCallback(profileUri: vscode.Uri): Promise { - const dacFxService = await this.getDaxFxService(); - const profile = await load(profileUri, dacFxService); - return profile; + try { + const dacFxService = await this.getDaxFxService(); + const profile = await load(profileUri, dacFxService); + return profile; + } + catch (e) { + vscode.window.showErrorMessage(constants.profileReadError); + throw e; + } } public async schemaCompare(treeNode: BaseProjectTreeItem): Promise { diff --git a/extensions/sql-database-projects/src/models/project.ts b/extensions/sql-database-projects/src/models/project.ts index 1a3e4f2949..93c41aabae 100644 --- a/extensions/sql-database-projects/src/models/project.ts +++ b/extensions/sql-database-projects/src/models/project.ts @@ -13,7 +13,6 @@ import * as os from 'os'; import { Uri } from 'vscode'; import { promises as fs } from 'fs'; import { DataSource } from './dataSources/dataSources'; -import { readSqlCmdVariables } from './publishProfile/publishProfile'; /** * Class representing a Project, and providing functions for operating on it @@ -81,7 +80,7 @@ export class Project { } // find all SQLCMD variables to include - this.sqlCmdVariables = readSqlCmdVariables(this.projFileXmlDoc); + this.sqlCmdVariables = utils.readSqlCmdVariables(this.projFileXmlDoc); // find all database references to include const references = this.projFileXmlDoc.documentElement.getElementsByTagName(constants.ArtifactReference); diff --git a/extensions/sql-database-projects/src/models/publishProfile/publishProfile.ts b/extensions/sql-database-projects/src/models/publishProfile/publishProfile.ts index 5ea17ab4b9..72a69fcc1b 100644 --- a/extensions/sql-database-projects/src/models/publishProfile/publishProfile.ts +++ b/extensions/sql-database-projects/src/models/publishProfile/publishProfile.ts @@ -41,7 +41,7 @@ export async function load(profileUri: Uri, dacfxService: mssql.IDacFxService): const optionsResult = await dacfxService.getOptionsFromProfile(profileUri.fsPath); // get all SQLCMD variables to include from the profile - const sqlCmdVariables = readSqlCmdVariables(profileXmlDoc); + const sqlCmdVariables = utils.readSqlCmdVariables(profileXmlDoc); return { databaseName: targetDbName, @@ -52,22 +52,6 @@ export async function load(profileUri: Uri, dacfxService: mssql.IDacFxService): }; } -/** - * Read SQLCMD variables from xmlDoc and return them - * @param xmlDoc xml doc to read SQLCMD variables from. Format must be the same that sqlproj and publish profiles use - */ -export function readSqlCmdVariables(xmlDoc: any): Record { - let sqlCmdVariables: Record = {}; - for (let i = 0; i < xmlDoc.documentElement.getElementsByTagName(constants.SqlCmdVariable)?.length; i++) { - const sqlCmdVar = xmlDoc.documentElement.getElementsByTagName(constants.SqlCmdVariable)[i]; - const varName = sqlCmdVar.getAttribute(constants.Include); - - const varValue = sqlCmdVar.getElementsByTagName(constants.DefaultValue)[0].childNodes[0].nodeValue; - sqlCmdVariables[varName] = varValue; - } - - return sqlCmdVariables; -} async function readConnectionString(xmlDoc: any): Promise<{ connectionId: string, connectionString: string }> { let targetConnectionString: string = ''; diff --git a/extensions/sql-database-projects/src/test/baselines/publishProfileIntegratedSecurityBaseline.publish.xml b/extensions/sql-database-projects/src/test/baselines/publishProfileIntegratedSecurityBaseline.publish.xml index e44e75f607..976ea7eb31 100644 --- a/extensions/sql-database-projects/src/test/baselines/publishProfileIntegratedSecurityBaseline.publish.xml +++ b/extensions/sql-database-projects/src/test/baselines/publishProfileIntegratedSecurityBaseline.publish.xml @@ -9,8 +9,7 @@ - MyProdDatabase - $(SqlCmdVar__1) + MyProdDatabase diff --git a/extensions/sql-database-projects/src/test/baselines/publishProfileSqlLoginBaseline.publish.xml b/extensions/sql-database-projects/src/test/baselines/publishProfileSqlLoginBaseline.publish.xml index 92b2c814ab..c0b81ceaa3 100644 --- a/extensions/sql-database-projects/src/test/baselines/publishProfileSqlLoginBaseline.publish.xml +++ b/extensions/sql-database-projects/src/test/baselines/publishProfileSqlLoginBaseline.publish.xml @@ -9,8 +9,7 @@ - MyProdDatabase - $(SqlCmdVar__1) + MyProdDatabase