From 2fd10a3bd16265168e347ab34d1745d0da232bb8 Mon Sep 17 00:00:00 2001 From: Bartosz Ratajczyk Date: Tue, 20 Feb 2018 06:59:27 +0100 Subject: [PATCH] Added support for SSIS 2017 --- .gitattributes | 63 + .gitignore | 242 + SSISUnit/Packages/PackageRef.cs | 724 ++- SSISUnit_SQL2017.sln | 273 + .../SsisUnit.TestComponents.2017.csproj | 100 + .../SsisUnitDestination.cs | 450 +- SsisUnit.Tests/App.config | 12 +- .../Commands/PropertyCommandTest.cs | 292 +- SsisUnit.Tests/SsisUnit2017.Tests.csproj | 184 + .../TestPackages/PropertyTest2017.dtsx | 1431 ++++ SsisUnit/Commands/ComponentInputCommand.cs | 294 +- SsisUnit/Commands/ComponentOutputCommand.cs | 214 +- SsisUnit/ConnectionRef.cs | 338 +- SsisUnit/DataCompareCommand.cs | 846 +-- SsisUnit/Dataset.cs | 493 +- SsisUnit/Helper.cs | 1226 ++-- SsisUnit/ParameterCommand.cs | 374 +- SsisUnit/Properties/AssemblyInfo.cs | 93 +- SsisUnit/SSISUnit.2017.csproj | 203 + SsisUnit/SqlCommand.cs | 507 +- SsisUnit/SsisTestSuite.cs | 1560 ++--- SsisUnit/Test.cs | 1382 ++-- SsisUnit/app.Designer.cs | 96 +- SsisUnit/app.config | 64 +- SsisUnit/ssisUnit.Designer.cs | 88 +- SsisUnitDesign/SsisUnit.Design_SQL2017.csproj | 151 + .../SsisUnit.TestRunner.2017.csproj | 127 + SsisUnitTestRunner/app.config | 12 +- .../Properties/Resources.Designer.cs | 126 +- .../Properties/Settings.Designer.cs | 52 +- SsisUnitTestRunnerUI/TestBuilder.cs | 730 +-- SsisUnitTestRunnerUI/app.config | 10 +- .../ssisUnitTestRunnerUI.2017.csproj | 207 + ssisUnit2012Setup/ssisUnit2017Setup.isl | 5779 +++++++++++++++++ ssisUnit2012Setup/ssisUnit2017Setup.isproj | 57 + ssisUnitTestDb/ssisUnitTestDb.jfm | Bin 0 -> 16384 bytes 36 files changed, 13840 insertions(+), 4960 deletions(-) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 SSISUnit_SQL2017.sln create mode 100644 SsisUnit.TestComponents/SsisUnit.TestComponents.2017.csproj create mode 100644 SsisUnit.Tests/SsisUnit2017.Tests.csproj create mode 100644 SsisUnit.Tests/TestPackages/PropertyTest2017.dtsx create mode 100644 SsisUnit/SSISUnit.2017.csproj create mode 100644 SsisUnitDesign/SsisUnit.Design_SQL2017.csproj create mode 100644 SsisUnitTestRunner/SsisUnit.TestRunner.2017.csproj create mode 100644 SsisUnitTestRunnerUI/ssisUnitTestRunnerUI.2017.csproj create mode 100644 ssisUnit2012Setup/ssisUnit2017Setup.isl create mode 100644 ssisUnit2012Setup/ssisUnit2017Setup.isproj create mode 100644 ssisUnitTestDb/ssisUnitTestDb.jfm diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1c9a181 --- /dev/null +++ b/.gitignore @@ -0,0 +1,242 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +[Xx]64/ +[Xx]86/ +[Bb]uild/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml + +# TODO: Un-comment the next line if you do not want to checkin +# your web deploy settings because they may include unencrypted +# passwords +#*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directory +AppPackages/ +BundleArtifacts/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# LightSwitch generated files +GeneratedArtifacts/ +ModelManifest.xml + +# Paket dependency manager +.paket/paket.exe + +# FAKE - F# Make +.fake/ diff --git a/SSISUnit/Packages/PackageRef.cs b/SSISUnit/Packages/PackageRef.cs index b3dccf8..0c48fb6 100644 --- a/SSISUnit/Packages/PackageRef.cs +++ b/SSISUnit/Packages/PackageRef.cs @@ -1,362 +1,364 @@ -#if !SQL2005 -using System.Linq; -#endif - - -#if SQL2012 || SQL2014 -using Microsoft.SqlServer.Management.IntegrationServices; -#endif - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data.SqlClient; -using System.Globalization; -using System.IO; -using System.Security; -using System.Text; -using System.Xml; - -using Microsoft.SqlServer.Dts.Runtime; - -using SsisUnit.Enums; - -namespace SsisUnit.Packages -{ - public class PackageRef - { - private string _storageType; - - private SecureString _password; - -#if SQL2012 || SQL2014 - private Project _project; -#endif - - private Package _package; - - public PackageRef(string name, string packagePath, PackageStorageType storageType, string server) - { - Name = name; - PackagePath = packagePath; - _storageType = storageType.ToString(); - Server = server; - } - - public PackageRef(string name, string packagePath, PackageStorageType storageType) - { - Name = name; - PackagePath = packagePath; - _storageType = storageType.ToString(); - Server = string.Empty; - } - - public PackageRef(XmlNode packageRef) - { - LoadFromXml(packageRef); - } - - public Package LoadPackage() - { - // TODO: Consider making a singleton instance of this - var ssisApp = new Application(); - Package package = null; - - try - { - if (StoredPassword != null) - { -#if SQL2005 - ssisApp.PackagePassword = Helper.ConvertToUnsecureString(StoredPassword); -#else - ssisApp.PackagePassword = StoredPassword.ConvertToUnsecureString(); -#endif - } - - switch (StorageType) - { - case PackageStorageType.FileSystem: -#if SQL2014 || SQL2012 - if (string.IsNullOrWhiteSpace(ProjectPath)) - package = ssisApp.LoadPackage(ExpandedPackagePath, null); - else - { - string filePassword = StoredPassword == null ? null : StoredPassword.ConvertToUnsecureString(); - - // Read the project file into memory and release the file before opening the project. - var fileMemoryStream = new MemoryStream(File.ReadAllBytes(ExpandedProjectPath)); - - _project = string.IsNullOrEmpty(filePassword) ? Project.OpenProject(fileMemoryStream) : Project.OpenProject(fileMemoryStream, filePassword); - _project.ProtectionLevel = DTSProtectionLevel.EncryptSensitiveWithUserKey; - - package = Helper.LoadPackageFromProject(_project, _project.Name, PackagePath); - } -#else - package = ssisApp.LoadPackage(ExpandedPackagePath, null); -#endif - break; - case PackageStorageType.MSDB: - package = ssisApp.LoadFromSqlServer(PackagePath, Server, null, null, null); - break; - case PackageStorageType.PackageStore: - package = ssisApp.LoadFromDtsServer(PackagePath, Server, null); - break; - case PackageStorageType.SsisCatalog: -#if SQL2014 || SQL2012 - string catalogPassword = StoredPassword == null ? null : StoredPassword.ConvertToUnsecureString(); - - var sqlConnectionStringBuilder = new SqlConnectionStringBuilder { DataSource = Server, InitialCatalog = "SSISDB", IntegratedSecurity = true }; - - var integrationServices = new IntegrationServices(new SqlConnection(sqlConnectionStringBuilder.ToString())); - Catalog ssisCatalog = integrationServices.Catalogs.FirstOrDefault(); - - if (ssisCatalog == null) - throw new Exception("A SSIS Catalog could not be found."); - - string ssisFolderName; - string ssisProjectName; - - Helper.ParseSsisProjectPath(ProjectPath, out ssisFolderName, out ssisProjectName); - - CatalogFolder catalogFolder = ssisCatalog.Folders.FirstOrDefault(x => string.Compare(x.Name, ssisFolderName, StringComparison.OrdinalIgnoreCase) == 0); - - if (catalogFolder == null) - throw new Exception(string.Format("The catalog folder {0} could not be found.", ssisFolderName)); - - ProjectInfo projectInfo = catalogFolder.Projects.FirstOrDefault(x => string.Compare(x.Name, ssisProjectName, StringComparison.OrdinalIgnoreCase) == 0); - - if (projectInfo == null) - throw new Exception(string.Format("The project {0} could not be found.", ssisProjectName)); - - byte[] projectBytes = projectInfo.GetProjectBytes(); - - if (projectBytes == null || projectBytes.Length < 1) - throw new Exception(string.Format("The project {0} could not be loaded.", ssisProjectName)); - - var catalogMemoryStream = new MemoryStream(projectBytes); - - _project = catalogPassword == null ? Project.OpenProject(catalogMemoryStream) : Project.OpenProject(catalogMemoryStream, catalogPassword); - _project.ProtectionLevel = DTSProtectionLevel.EncryptSensitiveWithUserKey; - - package = Helper.LoadPackageFromProject(_project, _project.Name, PackagePath); - - break; -#else - throw new NotSupportedException(); -#endif - - } - } - catch (DtsRuntimeException dtsEx) - { -#if SQL2005 - const string SsisPackageStoreVersion = "2005"; -#elif SQL2008 - const string SsisPackageStoreVersion = "2008"; -#elif SQL2012 - const string SsisPackageStoreVersion = "2012"; -#elif SQL2014 - const string SsisPackageStoreVersion = "2014"; -#endif - - if (StorageType == PackageStorageType.PackageStore && dtsEx.ErrorCode == HResults.DTS_E_PACKAGENOTFOUND) - throw new DtsPackageStoreException(string.Format("The package \"{0}\" couldn't be found in the SSIS {1} Package Store. Please ensure that the correct unit test engine is used when accessing the SSIS {1} Package Store.", PackagePath, SsisPackageStoreVersion)); - - if (dtsEx.ErrorCode == HResults.DTS_E_LOADFROMSQLSERVER) - throw new DtsPackageStoreException(string.Format("There was an error while attempting to load the package \"{0}\" from MSDB. Please ensure the package path is valid and the correct unit test engine is used to execute the package. The current unit test engine is SSIS {1}.", PackagePath, SsisPackageStoreVersion)); - - if (dtsEx.ErrorCode == HResults.DTS_E_LOADFROMXML) - throw new DtsPackageStoreException(string.Format("There was an error while attempting to load the package \"{0}\" from the file system. Please ensure the package path is valid and the correct unit test engine is used to execute the package. The current unit test engine is SSIS {1}.", PackagePath, SsisPackageStoreVersion)); - - throw; - } - catch (KeyNotFoundException) - { - throw new KeyNotFoundException(string.Format(CultureInfo.CurrentCulture, "The package attribute is {0}, which does not reference a valid package.", PackagePath)); - } - - _package = package; - return package; - } - - [Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] - public string PackagePath { get; set; } - - [Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] - public string ProjectPath { get; set; } - - public string Name { get; set; } - - public PackageStorageType StorageType - { - get - { - return ConvertStorageTypeString(_storageType); - } - - set - { - _storageType = value.ToString(); - } - } - - [Description("The server where the package resides. Only Windows Authentication is supported at this time."), - ReadOnly(false)] - public string Server { get; set; } - - private static PackageStorageType ConvertStorageTypeString(string type) - { - if (string.IsNullOrEmpty(type)) - return PackageStorageType.FileSystem; - - string typeToUpper = type.ToUpperInvariant(); - - switch (typeToUpper) - { - case "FILESYSTEM": - return PackageStorageType.FileSystem; - case "MSDB": - return PackageStorageType.MSDB; - case "PACKAGESTORE": - return PackageStorageType.PackageStore; - case "SSISCATALOG": - return PackageStorageType.SsisCatalog; - default: - throw new ArgumentException(string.Format("The provided storage type ({0}) is not recognized.", type)); - } - } - - [Description("The password to use for accessing the package.")] - public string Password - { - set - { -#if SQL2005 - _password = value != null ? Helper.ConvertToSecureString(value) : null; -#else - _password = value != null ? value.ConvertToSecureString() : null; -#endif - } - } - - /// - /// The package password as a . - /// - // DO NOT allow public "get" access via a property so as to add an extra barrier for security. - [Browsable(false), ReadOnly(true)] - internal SecureString StoredPassword { get { return _password; } } - - /// - /// This method will return the package password as a . - /// - /// The package password as a . - public SecureString GetSecurePassword() - { - return StoredPassword; - } - - /// - /// Sets the package password with the provided . If the provided is NULL, the the package password will be set to NULL. - /// - /// The package password. - public void SetSecurePassword(SecureString password) - { - if (password == null) - { - _password = null; - - return; - } - - var passwordString = Helper.ConvertToUnsecureString(password); - - _password = passwordString != null ? Helper.ConvertToSecureString(passwordString) : null; - } - - public string PersistToXml() - { - var xml = new StringBuilder(); - var writerSettings = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Fragment, OmitXmlDeclaration = true }; - - using (XmlWriter xmlWriter = XmlWriter.Create(xml, writerSettings)) - { - xmlWriter.WriteStartElement("Package"); - xmlWriter.WriteAttributeString("name", Name); - xmlWriter.WriteAttributeString("packagePath", PackagePath); - - if (Server != string.Empty) - xmlWriter.WriteAttributeString("server", Server); - - if (!string.IsNullOrEmpty(ProjectPath)) - xmlWriter.WriteAttributeString("projectPath", ProjectPath); - - if (_password != null) - xmlWriter.WriteAttributeString("password", Helper.ConvertToUnsecureString(_password)); - - xmlWriter.WriteAttributeString("storageType", StorageType.ToString()); - xmlWriter.WriteEndElement(); - } - - return xml.ToString(); - } - - public void LoadFromXml(string packageXml) - { - LoadFromXml(Helper.GetXmlNodeFromString(packageXml)); - } - - public void LoadFromXml(XmlNode packageXml) - { - if (packageXml.Name != "Package") - throw new ArgumentException(string.Format("The Xml does not contain the correct type ({0}).", "Package")); - - if (packageXml.Attributes == null) - throw new ArgumentException("The Xml does not contain any attributes."); - - PackagePath = packageXml.Attributes["packagePath"].Value; - _storageType = packageXml.Attributes["storageType"].Value; - Name = packageXml.Attributes["name"].Value; - - if (packageXml.Attributes["server"] != null) - { - Server = packageXml.Attributes["server"].Value; - } - - if (packageXml.Attributes["password"] != null) - { - Password = packageXml.Attributes["password"].Value; - } - - if (packageXml.Attributes["projectPath"] != null) - { - ProjectPath = packageXml.Attributes["projectPath"].Value; - } - } - - /// - /// Returns a version of the with environment variables expanded - /// - public string ExpandedPackagePath { get { return Environment.ExpandEnvironmentVariables(PackagePath ?? string.Empty); } } - - /// - /// Returns a version of the with environment variables expanded - /// - public string ExpandedProjectPath { get { return Environment.ExpandEnvironmentVariables(ProjectPath ?? string.Empty); } } - -#if SQL2012 || SQL2014 - /// - /// Returns the project associated with the . should be called first for this to be populated. - /// - public Project Project { get { return _project; } } -#endif - - /// - /// Returns the package associated with the . should be called first for this to be populated. - /// - public Package Package - { - get { return _package; } - set { _package = value; } - } - } +#if !SQL2005 +using System.Linq; +#endif + + +#if SQL2012 || SQL2014 || SQL2017 +using Microsoft.SqlServer.Management.IntegrationServices; +#endif + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data.SqlClient; +using System.Globalization; +using System.IO; +using System.Security; +using System.Text; +using System.Xml; + +using Microsoft.SqlServer.Dts.Runtime; + +using SsisUnit.Enums; + +namespace SsisUnit.Packages +{ + public class PackageRef + { + private string _storageType; + + private SecureString _password; + +#if SQL2012 || SQL2014 || SQL2017 + private Project _project; +#endif + + private Package _package; + + public PackageRef(string name, string packagePath, PackageStorageType storageType, string server) + { + Name = name; + PackagePath = packagePath; + _storageType = storageType.ToString(); + Server = server; + } + + public PackageRef(string name, string packagePath, PackageStorageType storageType) + { + Name = name; + PackagePath = packagePath; + _storageType = storageType.ToString(); + Server = string.Empty; + } + + public PackageRef(XmlNode packageRef) + { + LoadFromXml(packageRef); + } + + public Package LoadPackage() + { + // TODO: Consider making a singleton instance of this + var ssisApp = new Application(); + Package package = null; + + try + { + if (StoredPassword != null) + { +#if SQL2005 + ssisApp.PackagePassword = Helper.ConvertToUnsecureString(StoredPassword); +#else + ssisApp.PackagePassword = StoredPassword.ConvertToUnsecureString(); +#endif + } + + switch (StorageType) + { + case PackageStorageType.FileSystem: +#if SQL2017 || SQL2014 || SQL2012 + if (string.IsNullOrWhiteSpace(ProjectPath)) + package = ssisApp.LoadPackage(ExpandedPackagePath, null); + else + { + string filePassword = StoredPassword == null ? null : StoredPassword.ConvertToUnsecureString(); + + // Read the project file into memory and release the file before opening the project. + var fileMemoryStream = new MemoryStream(File.ReadAllBytes(ExpandedProjectPath)); + + _project = string.IsNullOrEmpty(filePassword) ? Project.OpenProject(fileMemoryStream) : Project.OpenProject(fileMemoryStream, filePassword); + _project.ProtectionLevel = DTSProtectionLevel.EncryptSensitiveWithUserKey; + + package = Helper.LoadPackageFromProject(_project, _project.Name, PackagePath); + } +#else + package = ssisApp.LoadPackage(ExpandedPackagePath, null); +#endif + break; + case PackageStorageType.MSDB: + package = ssisApp.LoadFromSqlServer(PackagePath, Server, null, null, null); + break; + case PackageStorageType.PackageStore: + package = ssisApp.LoadFromDtsServer(PackagePath, Server, null); + break; + case PackageStorageType.SsisCatalog: +#if SQL2017 || SQL2014 || SQL2012 + string catalogPassword = StoredPassword == null ? null : StoredPassword.ConvertToUnsecureString(); + + var sqlConnectionStringBuilder = new SqlConnectionStringBuilder { DataSource = Server, InitialCatalog = "SSISDB", IntegratedSecurity = true }; + + var integrationServices = new IntegrationServices(new SqlConnection(sqlConnectionStringBuilder.ToString())); + Catalog ssisCatalog = integrationServices.Catalogs.FirstOrDefault(); + + if (ssisCatalog == null) + throw new Exception("A SSIS Catalog could not be found."); + + string ssisFolderName; + string ssisProjectName; + + Helper.ParseSsisProjectPath(ProjectPath, out ssisFolderName, out ssisProjectName); + + CatalogFolder catalogFolder = ssisCatalog.Folders.FirstOrDefault(x => string.Compare(x.Name, ssisFolderName, StringComparison.OrdinalIgnoreCase) == 0); + + if (catalogFolder == null) + throw new Exception(string.Format("The catalog folder {0} could not be found.", ssisFolderName)); + + ProjectInfo projectInfo = catalogFolder.Projects.FirstOrDefault(x => string.Compare(x.Name, ssisProjectName, StringComparison.OrdinalIgnoreCase) == 0); + + if (projectInfo == null) + throw new Exception(string.Format("The project {0} could not be found.", ssisProjectName)); + + byte[] projectBytes = projectInfo.GetProjectBytes(); + + if (projectBytes == null || projectBytes.Length < 1) + throw new Exception(string.Format("The project {0} could not be loaded.", ssisProjectName)); + + var catalogMemoryStream = new MemoryStream(projectBytes); + + _project = catalogPassword == null ? Project.OpenProject(catalogMemoryStream) : Project.OpenProject(catalogMemoryStream, catalogPassword); + _project.ProtectionLevel = DTSProtectionLevel.EncryptSensitiveWithUserKey; + + package = Helper.LoadPackageFromProject(_project, _project.Name, PackagePath); + + break; +#else + throw new NotSupportedException(); +#endif + + } + } + catch (DtsRuntimeException dtsEx) + { +#if SQL2005 + const string SsisPackageStoreVersion = "2005"; +#elif SQL2008 + const string SsisPackageStoreVersion = "2008"; +#elif SQL2012 + const string SsisPackageStoreVersion = "2012"; +#elif SQL2014 + const string SsisPackageStoreVersion = "2014"; +#elif SQL2017 + const string SsisPackageStoreVersion = "2017"; +#endif + + if (StorageType == PackageStorageType.PackageStore && dtsEx.ErrorCode == HResults.DTS_E_PACKAGENOTFOUND) + throw new DtsPackageStoreException(string.Format("The package \"{0}\" couldn't be found in the SSIS {1} Package Store. Please ensure that the correct unit test engine is used when accessing the SSIS {1} Package Store.", PackagePath, SsisPackageStoreVersion)); + + if (dtsEx.ErrorCode == HResults.DTS_E_LOADFROMSQLSERVER) + throw new DtsPackageStoreException(string.Format("There was an error while attempting to load the package \"{0}\" from MSDB. Please ensure the package path is valid and the correct unit test engine is used to execute the package. The current unit test engine is SSIS {1}.", PackagePath, SsisPackageStoreVersion)); + + if (dtsEx.ErrorCode == HResults.DTS_E_LOADFROMXML) + throw new DtsPackageStoreException(string.Format("There was an error while attempting to load the package \"{0}\" from the file system. Please ensure the package path is valid and the correct unit test engine is used to execute the package. The current unit test engine is SSIS {1}.", PackagePath, SsisPackageStoreVersion)); + + throw; + } + catch (KeyNotFoundException) + { + throw new KeyNotFoundException(string.Format(CultureInfo.CurrentCulture, "The package attribute is {0}, which does not reference a valid package.", PackagePath)); + } + + _package = package; + return package; + } + + [Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + public string PackagePath { get; set; } + + [Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + public string ProjectPath { get; set; } + + public string Name { get; set; } + + public PackageStorageType StorageType + { + get + { + return ConvertStorageTypeString(_storageType); + } + + set + { + _storageType = value.ToString(); + } + } + + [Description("The server where the package resides. Only Windows Authentication is supported at this time."), + ReadOnly(false)] + public string Server { get; set; } + + private static PackageStorageType ConvertStorageTypeString(string type) + { + if (string.IsNullOrEmpty(type)) + return PackageStorageType.FileSystem; + + string typeToUpper = type.ToUpperInvariant(); + + switch (typeToUpper) + { + case "FILESYSTEM": + return PackageStorageType.FileSystem; + case "MSDB": + return PackageStorageType.MSDB; + case "PACKAGESTORE": + return PackageStorageType.PackageStore; + case "SSISCATALOG": + return PackageStorageType.SsisCatalog; + default: + throw new ArgumentException(string.Format("The provided storage type ({0}) is not recognized.", type)); + } + } + + [Description("The password to use for accessing the package.")] + public string Password + { + set + { +#if SQL2005 + _password = value != null ? Helper.ConvertToSecureString(value) : null; +#else + _password = value != null ? value.ConvertToSecureString() : null; +#endif + } + } + + /// + /// The package password as a . + /// + // DO NOT allow public "get" access via a property so as to add an extra barrier for security. + [Browsable(false), ReadOnly(true)] + internal SecureString StoredPassword { get { return _password; } } + + /// + /// This method will return the package password as a . + /// + /// The package password as a . + public SecureString GetSecurePassword() + { + return StoredPassword; + } + + /// + /// Sets the package password with the provided . If the provided is NULL, the the package password will be set to NULL. + /// + /// The package password. + public void SetSecurePassword(SecureString password) + { + if (password == null) + { + _password = null; + + return; + } + + var passwordString = Helper.ConvertToUnsecureString(password); + + _password = passwordString != null ? Helper.ConvertToSecureString(passwordString) : null; + } + + public string PersistToXml() + { + var xml = new StringBuilder(); + var writerSettings = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Fragment, OmitXmlDeclaration = true }; + + using (XmlWriter xmlWriter = XmlWriter.Create(xml, writerSettings)) + { + xmlWriter.WriteStartElement("Package"); + xmlWriter.WriteAttributeString("name", Name); + xmlWriter.WriteAttributeString("packagePath", PackagePath); + + if (Server != string.Empty) + xmlWriter.WriteAttributeString("server", Server); + + if (!string.IsNullOrEmpty(ProjectPath)) + xmlWriter.WriteAttributeString("projectPath", ProjectPath); + + if (_password != null) + xmlWriter.WriteAttributeString("password", Helper.ConvertToUnsecureString(_password)); + + xmlWriter.WriteAttributeString("storageType", StorageType.ToString()); + xmlWriter.WriteEndElement(); + } + + return xml.ToString(); + } + + public void LoadFromXml(string packageXml) + { + LoadFromXml(Helper.GetXmlNodeFromString(packageXml)); + } + + public void LoadFromXml(XmlNode packageXml) + { + if (packageXml.Name != "Package") + throw new ArgumentException(string.Format("The Xml does not contain the correct type ({0}).", "Package")); + + if (packageXml.Attributes == null) + throw new ArgumentException("The Xml does not contain any attributes."); + + PackagePath = packageXml.Attributes["packagePath"].Value; + _storageType = packageXml.Attributes["storageType"].Value; + Name = packageXml.Attributes["name"].Value; + + if (packageXml.Attributes["server"] != null) + { + Server = packageXml.Attributes["server"].Value; + } + + if (packageXml.Attributes["password"] != null) + { + Password = packageXml.Attributes["password"].Value; + } + + if (packageXml.Attributes["projectPath"] != null) + { + ProjectPath = packageXml.Attributes["projectPath"].Value; + } + } + + /// + /// Returns a version of the with environment variables expanded + /// + public string ExpandedPackagePath { get { return Environment.ExpandEnvironmentVariables(PackagePath ?? string.Empty); } } + + /// + /// Returns a version of the with environment variables expanded + /// + public string ExpandedProjectPath { get { return Environment.ExpandEnvironmentVariables(ProjectPath ?? string.Empty); } } + +#if SQL2012 || SQL2014 || SQL2017 + /// + /// Returns the project associated with the . should be called first for this to be populated. + /// + public Project Project { get { return _project; } } +#endif + + /// + /// Returns the package associated with the . should be called first for this to be populated. + /// + public Package Package + { + get { return _package; } + set { _package = value; } + } + } } \ No newline at end of file diff --git a/SSISUnit_SQL2017.sln b/SSISUnit_SQL2017.sln new file mode 100644 index 0000000..7e8a394 --- /dev/null +++ b/SSISUnit_SQL2017.sln @@ -0,0 +1,273 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30501.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SSISUnit.2017", "SSISUnit\SSISUnit.2017.csproj", "{8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SsisUnit.TestComponents.2017", "SsisUnit.TestComponents\SsisUnit.TestComponents.2017.csproj", "{6C8078E0-99DD-40D0-94DA-E17B3FC50679}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SsisUnit.Design_SQL2017", "SsisUnitDesign\SsisUnit.Design_SQL2017.csproj", "{3B38F252-0DE8-4639-9AF9-AB8B216B685C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ssisUnitTestRunnerUI.2017", "ssisUnitTestRunnerUI\ssisUnitTestRunnerUI.2017.csproj", "{A943E51D-D0CC-4EF1-875B-937D0B179241}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{17BB6EF3-A1CF-4326-A7E6-A7BF928C1D2B}" + ProjectSection(SolutionItems) = preProject + SsisUnit.testsettings = SsisUnit.testsettings + EndProjectSection +EndProject +Project("{6141683F-8A12-4E36-9623-2EB02B2C2303}") = "ssisUnit2017Setup", "ssisUnit2012Setup\ssisUnit2017Setup.isproj", "{2A9028F9-B03B-46A2-9369-83CE1F38FD2B}" + ProjectSection(ProjectDependencies) = postProject + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7} = {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7} + {A943E51D-D0CC-4EF1-875B-937D0B179241} = {A943E51D-D0CC-4EF1-875B-937D0B179241} + {3B38F252-0DE8-4639-9AF9-AB8B216B685C} = {3B38F252-0DE8-4639-9AF9-AB8B216B685C} + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0} = {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0} + {6C8078E0-99DD-40D0-94DA-E17B3FC50679} = {6C8078E0-99DD-40D0-94DA-E17B3FC50679} + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA} = {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SsisUnitBase", "SsisUnit.Base\SsisUnitBase.csproj", "{E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ssisUnit.TestRunner.2017", "SsisUnitTestRunner\ssisUnit.TestRunner.2017.csproj", "{8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SsisUnit2017.Tests", "SsisUnit.Tests\SsisUnit2017.Tests.csproj", "{ADC78700-333C-4BDC-9F64-DA20F500C273}" + ProjectSection(ProjectDependencies) = postProject + {CE10532C-9925-48D0-A59B-C49343053C1A} = {CE10532C-9925-48D0-A59B-C49343053C1A} + EndProjectSection +EndProject +Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "ssisUnitTestDb", "ssisUnitTestDb\ssisUnitTestDb.sqlproj", "{CE10532C-9925-48D0-A59B-C49343053C1A}" +EndProject +Global + GlobalSection(TeamFoundationVersionControl) = preSolution + SccNumberOfProjects = 10 + SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs04 + SccLocalPath0 = . + SccProjectUniqueName1 = SsisUnit.Base\\SsisUnitBase.csproj + SccProjectName1 = SsisUnit.Base + SccLocalPath1 = SsisUnit.Base + SccProjectUniqueName2 = SsisUnit.TestComponents\\SsisUnit.TestComponents.2017.csproj + SccProjectName2 = SsisUnit.TestComponents + SccLocalPath2 = SsisUnit.TestComponents + SccProjectUniqueName3 = SSISUnit\\SSISUnit.2017.csproj + SccProjectName3 = SSISUnit + SccLocalPath3 = SSISUnit + SccProjectUniqueName4 = SsisUnitDesign\\SsisUnit.Design_SQL2017.csproj + SccProjectName4 = SsisUnitDesign + SccLocalPath4 = SsisUnitDesign + SccProjectUniqueName5 = ssisUnitTestRunnerUI\\ssisUnitTestRunnerUI.2017.csproj + SccProjectName5 = ssisUnitTestRunnerUI + SccLocalPath5 = ssisUnitTestRunnerUI + SccProjectUniqueName6 = SsisUnitTestRunner\\ssisUnit.TestRunner.2017.csproj + SccProjectName6 = SsisUnitTestRunner + SccLocalPath6 = SsisUnitTestRunner + SccProjectUniqueName7 = ssisUnit2012Setup\\ssisUnit2017Setup.isproj + SccProjectName7 = ssisUnit2012Setup + SccLocalPath7 = ssisUnit2012Setup + SccProjectUniqueName8 = SsisUnit.Tests\\SsisUnit2017.Tests.csproj + SccProjectName8 = SsisUnit.Tests + SccLocalPath8 = SsisUnit.Tests + SccProjectUniqueName9 = ssisUnitTestDb\\ssisUnitTestDb.sqlproj + SccProjectName9 = ssisUnitTestDb + SccLocalPath9 = ssisUnitTestDb + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + CD_ROM|Any CPU = CD_ROM|Any CPU + CD_ROM|x86 = CD_ROM|x86 + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + DebugRunTime|Any CPU = DebugRunTime|Any CPU + DebugRunTime|x86 = DebugRunTime|x86 + DVD-5|Any CPU = DVD-5|Any CPU + DVD-5|x86 = DVD-5|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + SingleImage|Any CPU = SingleImage|Any CPU + SingleImage|x86 = SingleImage|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.CD_ROM|Any CPU.Build.0 = Release|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.CD_ROM|x86.ActiveCfg = Debug|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.Debug|x86.ActiveCfg = Debug|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.DebugRunTime|Any CPU.ActiveCfg = Debug|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.DebugRunTime|Any CPU.Build.0 = Debug|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.DebugRunTime|x86.ActiveCfg = Debug|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.DVD-5|Any CPU.Build.0 = Debug|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.Release|Any CPU.Build.0 = Release|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.Release|x86.ActiveCfg = Release|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.SingleImage|Any CPU.Build.0 = Release|Any CPU + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7}.SingleImage|x86.ActiveCfg = Debug|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.CD_ROM|Any CPU.Build.0 = Release|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.CD_ROM|x86.ActiveCfg = DebugRunTime|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.Debug|x86.ActiveCfg = Debug|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.DebugRunTime|Any CPU.ActiveCfg = DebugRunTime|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.DebugRunTime|Any CPU.Build.0 = DebugRunTime|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.DebugRunTime|x86.ActiveCfg = DebugRunTime|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.DVD-5|Any CPU.ActiveCfg = DebugRunTime|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.DVD-5|Any CPU.Build.0 = DebugRunTime|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.DVD-5|x86.ActiveCfg = DebugRunTime|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.Release|Any CPU.Build.0 = Release|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.Release|x86.ActiveCfg = Release|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.SingleImage|Any CPU.Build.0 = Release|Any CPU + {6C8078E0-99DD-40D0-94DA-E17B3FC50679}.SingleImage|x86.ActiveCfg = DebugRunTime|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.CD_ROM|Any CPU.Build.0 = Release|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.CD_ROM|x86.ActiveCfg = Debug|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.Debug|x86.ActiveCfg = Debug|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.DebugRunTime|Any CPU.ActiveCfg = Debug|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.DebugRunTime|Any CPU.Build.0 = Debug|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.DebugRunTime|x86.ActiveCfg = Debug|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.DVD-5|Any CPU.Build.0 = Debug|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.Release|Any CPU.Build.0 = Release|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.Release|x86.ActiveCfg = Release|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.SingleImage|Any CPU.Build.0 = Release|Any CPU + {3B38F252-0DE8-4639-9AF9-AB8B216B685C}.SingleImage|x86.ActiveCfg = Debug|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.CD_ROM|Any CPU.Build.0 = Release|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.CD_ROM|x86.ActiveCfg = Debug|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.Debug|Any CPU.ActiveCfg = Debug|x86 + {A943E51D-D0CC-4EF1-875B-937D0B179241}.Debug|Any CPU.Build.0 = Debug|x86 + {A943E51D-D0CC-4EF1-875B-937D0B179241}.Debug|x86.ActiveCfg = Debug|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.DebugRunTime|Any CPU.ActiveCfg = Debug|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.DebugRunTime|Any CPU.Build.0 = Debug|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.DebugRunTime|x86.ActiveCfg = Debug|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.DVD-5|Any CPU.Build.0 = Debug|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.Release|Any CPU.Build.0 = Release|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.Release|x86.ActiveCfg = Release|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.SingleImage|Any CPU.Build.0 = Release|Any CPU + {A943E51D-D0CC-4EF1-875B-937D0B179241}.SingleImage|x86.ActiveCfg = Debug|Any CPU + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.CD_ROM|Any CPU.ActiveCfg = CD_ROM + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.CD_ROM|Any CPU.Build.0 = CD_ROM + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.CD_ROM|x86.ActiveCfg = CD_ROM + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.CD_ROM|x86.Build.0 = CD_ROM + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.Debug|Any CPU.ActiveCfg = SingleImage + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.Debug|Any CPU.Build.0 = SingleImage + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.Debug|x86.ActiveCfg = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.Debug|x86.Build.0 = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.DebugRunTime|Any CPU.ActiveCfg = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.DebugRunTime|Any CPU.Build.0 = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.DebugRunTime|x86.ActiveCfg = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.DebugRunTime|x86.Build.0 = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.DVD-5|Any CPU.ActiveCfg = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.DVD-5|Any CPU.Build.0 = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.DVD-5|x86.ActiveCfg = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.DVD-5|x86.Build.0 = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.Release|Any CPU.ActiveCfg = SingleImage + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.Release|Any CPU.Build.0 = SingleImage + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.Release|x86.ActiveCfg = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.Release|x86.Build.0 = DVD-5 + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.SingleImage|Any CPU.ActiveCfg = SingleImage + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.SingleImage|Any CPU.Build.0 = SingleImage + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.SingleImage|x86.ActiveCfg = SingleImage + {2A9028F9-B03B-46A2-9369-83CE1F38FD2B}.SingleImage|x86.Build.0 = SingleImage + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.CD_ROM|Any CPU.Build.0 = Release|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.CD_ROM|x86.ActiveCfg = Debug|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.Debug|x86.ActiveCfg = Debug|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.DebugRunTime|Any CPU.ActiveCfg = Debug|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.DebugRunTime|Any CPU.Build.0 = Debug|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.DebugRunTime|x86.ActiveCfg = Debug|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.DVD-5|Any CPU.Build.0 = Debug|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.Release|Any CPU.Build.0 = Release|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.Release|x86.ActiveCfg = Release|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.SingleImage|Any CPU.Build.0 = Release|Any CPU + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA}.SingleImage|x86.ActiveCfg = Debug|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.CD_ROM|Any CPU.Build.0 = Release|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.CD_ROM|x86.ActiveCfg = Release|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.CD_ROM|x86.Build.0 = Release|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.Debug|Any CPU.ActiveCfg = Debug|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.Debug|Any CPU.Build.0 = Debug|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.Debug|x86.ActiveCfg = Debug|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.Debug|x86.Build.0 = Debug|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.DebugRunTime|Any CPU.ActiveCfg = Debug|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.DebugRunTime|Any CPU.Build.0 = Debug|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.DebugRunTime|x86.ActiveCfg = Debug|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.DebugRunTime|x86.Build.0 = Debug|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.DVD-5|Any CPU.Build.0 = Debug|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.DVD-5|x86.ActiveCfg = Debug|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.DVD-5|x86.Build.0 = Debug|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.Release|Any CPU.Build.0 = Release|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.Release|x86.ActiveCfg = Release|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.Release|x86.Build.0 = Release|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.SingleImage|Any CPU.Build.0 = Release|Any CPU + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.SingleImage|x86.ActiveCfg = Release|x86 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0}.SingleImage|x86.Build.0 = Release|x86 + {ADC78700-333C-4BDC-9F64-DA20F500C273}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.CD_ROM|Any CPU.Build.0 = Release|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.CD_ROM|x86.ActiveCfg = Debug|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.Debug|x86.ActiveCfg = Debug|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.DebugRunTime|Any CPU.ActiveCfg = Debug|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.DebugRunTime|Any CPU.Build.0 = Debug|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.DebugRunTime|x86.ActiveCfg = Debug|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.DVD-5|Any CPU.Build.0 = Debug|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.Release|Any CPU.Build.0 = Release|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.Release|x86.ActiveCfg = Release|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.SingleImage|Any CPU.Build.0 = Release|Any CPU + {ADC78700-333C-4BDC-9F64-DA20F500C273}.SingleImage|x86.ActiveCfg = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.CD_ROM|Any CPU.ActiveCfg = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.CD_ROM|Any CPU.Build.0 = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.CD_ROM|Any CPU.Deploy.0 = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.CD_ROM|x86.ActiveCfg = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.Debug|x86.ActiveCfg = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.DebugRunTime|Any CPU.ActiveCfg = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.DebugRunTime|Any CPU.Build.0 = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.DebugRunTime|Any CPU.Deploy.0 = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.DebugRunTime|x86.ActiveCfg = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.DVD-5|Any CPU.Build.0 = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.DVD-5|Any CPU.Deploy.0 = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.DVD-5|x86.ActiveCfg = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.Release|Any CPU.Build.0 = Release|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.Release|Any CPU.Deploy.0 = Release|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.Release|x86.ActiveCfg = Release|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.SingleImage|Any CPU.ActiveCfg = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.SingleImage|Any CPU.Build.0 = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.SingleImage|Any CPU.Deploy.0 = Debug|Any CPU + {CE10532C-9925-48D0-A59B-C49343053C1A}.SingleImage|x86.ActiveCfg = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/SsisUnit.TestComponents/SsisUnit.TestComponents.2017.csproj b/SsisUnit.TestComponents/SsisUnit.TestComponents.2017.csproj new file mode 100644 index 0000000..338ad42 --- /dev/null +++ b/SsisUnit.TestComponents/SsisUnit.TestComponents.2017.csproj @@ -0,0 +1,100 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {6C8078E0-99DD-40D0-94DA-E17B3FC50679} + Library + Properties + SsisUnit.TestComponents + SsisUnit.TestComponents.2017 + v4.0 + 512 + + SAK + SAK + SAK + SAK + + + true + full + false + bin\Debug\ + TRACE;DEBUG;SQL2017 + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE;SQL2017 + prompt + 4 + + + true + bin\DebugRunTime\ + TRACE;DEBUG;SQL2017 + full + AnyCPU + bin\Debug\TestComponents.dll.CodeAnalysisLog.xml + true + GlobalSuppressions.cs + prompt + MinimumRecommendedRules.ruleset + ;C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\\Rule Sets + false + ;C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\FxCop\\Rules + false + + + true + + + SsisUnit.snk + + + + + True + + + True + + + + + + + + + + + + + + + + + + + + + + + copy "$(TargetPath)" "C:\Program Files (x86)\Microsoft SQL Server\140\DTS\PipelineComponents" +copy "$(TargetPath)" "C:\Program Files\Microsoft SQL Server\140\DTS\PipelineComponents" +"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\gacutil.exe" -if "C:\Program Files (x86)\Microsoft SQL Server\140\DTS\PipelineComponents\$(TargetFileName)" + + + \ No newline at end of file diff --git a/SsisUnit.TestComponents/SsisUnitDestination.cs b/SsisUnit.TestComponents/SsisUnitDestination.cs index 6502a2c..f020506 100644 --- a/SsisUnit.TestComponents/SsisUnitDestination.cs +++ b/SsisUnit.TestComponents/SsisUnitDestination.cs @@ -1,225 +1,225 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.IO; -using Microsoft.SqlServer.Dts.Pipeline; -using Microsoft.SqlServer.Dts.Pipeline.Wrapper; - -#if SQL2014 || SQL2008 || SQL2012 -using IDTSInputColumn = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInputColumn100; -using IDTSVariables = Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSVariables100; -using IDTSVirtualInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSVirtualInput100; -using IDTSVirtualInputColumn = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSVirtualInputColumn100; -#elif SQL2005 -using IDTSInputColumn = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInputColumn90; -using IDTSVariables = Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSVariables90; -using IDTSVirtualInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSVirtualInput90; -using IDTSVirtualInputColumn = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSVirtualInputColumn90; -#endif - -namespace SsisUnit.TestComponents -{ - [DtsPipelineComponent( - ComponentType = ComponentType.DestinationAdapter, - DisplayName = "SsisUnit Destination", - CurrentVersion = 0, - Description = "Destination used with SsisUnit tests to retrieve data from the data flow.", - IconResource = "SsisUnit.TestComponents.SsisSource.ico")] - public class SsisUnitDestination : PipelineComponent - { - private const string DataTablePropertyName = "DataTableXml"; - private const string VariablePropertyName = "VariableName"; - - private Dictionary _bufferColumnMapping; - - public DataTable DataTable { get; set; } - - public override void ProvideComponentProperties() - { - RemoveAllInputsOutputsAndCustomProperties(); - - var input = ComponentMetaData.InputCollection.New(); - input.Name = "Default Input"; - input.Description = "Receives the test data provided by an upstream component"; - input.HasSideEffects = true; - - var dataTableProperty = ComponentMetaData.CustomPropertyCollection.New(); - dataTableProperty.Name = DataTablePropertyName; - dataTableProperty.Description = "Contains an XML representation of the data table."; - dataTableProperty.Value = string.Empty; - - var variableProperty = ComponentMetaData.CustomPropertyCollection.New(); - variableProperty.Name = VariablePropertyName; - variableProperty.Description = "References a variable to store the data table results."; - variableProperty.Value = string.Empty; - } - - public override void OnInputPathAttached(int inputID) - { - var virtualInput = ComponentMetaData.InputCollection[0].GetVirtualInput(); - - CreateInputColumns(virtualInput); - } - - public override void OnInputPathDetached(int inputID) - { - var virtualInput = ComponentMetaData.InputCollection[0].GetVirtualInput(); - - CreateInputColumns(virtualInput); - } - - public override void ReinitializeMetaData() - { - var virtualInput = ComponentMetaData.InputCollection[0].GetVirtualInput(); - - CreateInputColumns(virtualInput); - } - - private void CreateInputColumns(IDTSVirtualInput virtualInput) - { - ComponentMetaData.InputCollection[0].InputColumnCollection.RemoveAll(); - foreach (IDTSVirtualInputColumn virtualInputColumn in virtualInput.VirtualInputColumnCollection) - { - var inputColumn = ComponentMetaData.InputCollection[0].InputColumnCollection.New(); - inputColumn.LineageID = virtualInputColumn.LineageID; - inputColumn.UsageType = DTSUsageType.UT_READONLY; - } - } - - public override void PreExecute() - { - if (DataTable == null) - { - DataTable = new DataTable("SsisUnit"); - } - - if (_bufferColumnMapping == null) - { - _bufferColumnMapping = new Dictionary(); - } - else - { - _bufferColumnMapping.Clear(); - } - - var names = new Dictionary(); - foreach (IDTSInputColumn column in ComponentMetaData.InputCollection[0].InputColumnCollection) - { - int value; - if (names.TryGetValue(column.Name, out value)) - { - names[column.Name] = value + 1; - } - else - { - names[column.Name] = 1; - } - } - - foreach (IDTSInputColumn column in ComponentMetaData.InputCollection[0].InputColumnCollection) - { - bool isLong = false; - _bufferColumnMapping.Add(GetColumName(names, column), BufferManager.FindColumnByLineageID(ComponentMetaData.InputCollection[0].Buffer, column.LineageID)); - var dataColumn = new DataColumn(GetColumName(names, column)) - { - DataType = BufferTypeToDataRecordType(ConvertBufferDataTypeToFitManaged(column.DataType, ref isLong)), - MaxLength = column.Length == 0 ? -1 : column.Length - }; - if (column.CodePage != 0) - { - dataColumn.ExtendedProperties.Add("codePage", column.CodePage); - } - - if (column.Scale != 0) - { - dataColumn.ExtendedProperties.Add("scale", column.Scale); - } - - if (column.Precision != 0) - { - dataColumn.ExtendedProperties.Add("precision", column.Precision); - } - - DataTable.Columns.Add(dataColumn); - } - } - - private static string GetColumName(Dictionary names, IDTSInputColumn column) - { - int value; - if (names.TryGetValue(column.Name, out value)) - { - if (value > 1) - { - return string.Format("{0}_{1}", column.UpstreamComponentName, column.Name); - } - } - - return string.Format("{0}", column.Name); - } - - public override void ProcessInput(int inputID, PipelineBuffer buffer) - { - base.ProcessInput(inputID, buffer); - - while (buffer.NextRow()) - { - var dataRow = DataTable.NewRow(); - foreach (var columnMapping in _bufferColumnMapping) - { - // TODO: Update to use the correct data type methods - if (buffer.IsNull(columnMapping.Value)) - { - dataRow[columnMapping.Key] = DBNull.Value; - } - else - { - dataRow[columnMapping.Key] = buffer[columnMapping.Value]; - } - } - DataTable.Rows.Add(dataRow); - } - - if (buffer.EndOfRowset) - { - var xml = SaveDataTableToXml(DataTable); - var property = ComponentMetaData.CustomPropertyCollection[DataTablePropertyName]; - property.Value = xml; - - string variableName = ComponentMetaData.CustomPropertyCollection[VariablePropertyName].Value.ToString(); - if (!string.IsNullOrEmpty(variableName)) - { - IDTSVariables variables = null; - VariableDispenser.LockOneForWrite(variableName, ref variables); - variables[variableName].Value = xml; - variables.Unlock(); - } - } - } - - public override void PostExecute() - { - ////var logFile = Path.Combine(Path.GetTempPath(), "SsisUnitDestination.log"); - ////File.WriteAllText(logFile, SaveDataTableToXml(DataTable)); - } - - public override DTSValidationStatus Validate() - { - if (ComponentMetaData.InputCollection[0].InputColumnCollection.Count != ComponentMetaData.InputCollection[0].GetVirtualInput().VirtualInputColumnCollection.Count) - { - return DTSValidationStatus.VS_NEEDSNEWMETADATA; - } - - return base.Validate(); - } - - private static string SaveDataTableToXml(DataTable dataTable) - { - using (var writer = new StringWriter()) - { - dataTable.WriteXml(writer, XmlWriteMode.WriteSchema); - return writer.ToString(); - } - } - } -} +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using Microsoft.SqlServer.Dts.Pipeline; +using Microsoft.SqlServer.Dts.Pipeline.Wrapper; + +#if SQL2017 || SQL2014 || SQL2008 || SQL2012 +using IDTSInputColumn = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInputColumn100; +using IDTSVariables = Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSVariables100; +using IDTSVirtualInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSVirtualInput100; +using IDTSVirtualInputColumn = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSVirtualInputColumn100; +#elif SQL2005 +using IDTSInputColumn = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInputColumn90; +using IDTSVariables = Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSVariables90; +using IDTSVirtualInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSVirtualInput90; +using IDTSVirtualInputColumn = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSVirtualInputColumn90; +#endif + +namespace SsisUnit.TestComponents +{ + [DtsPipelineComponent( + ComponentType = ComponentType.DestinationAdapter, + DisplayName = "SsisUnit Destination", + CurrentVersion = 0, + Description = "Destination used with SsisUnit tests to retrieve data from the data flow.", + IconResource = "SsisUnit.TestComponents.SsisSource.ico")] + public class SsisUnitDestination : PipelineComponent + { + private const string DataTablePropertyName = "DataTableXml"; + private const string VariablePropertyName = "VariableName"; + + private Dictionary _bufferColumnMapping; + + public DataTable DataTable { get; set; } + + public override void ProvideComponentProperties() + { + RemoveAllInputsOutputsAndCustomProperties(); + + var input = ComponentMetaData.InputCollection.New(); + input.Name = "Default Input"; + input.Description = "Receives the test data provided by an upstream component"; + input.HasSideEffects = true; + + var dataTableProperty = ComponentMetaData.CustomPropertyCollection.New(); + dataTableProperty.Name = DataTablePropertyName; + dataTableProperty.Description = "Contains an XML representation of the data table."; + dataTableProperty.Value = string.Empty; + + var variableProperty = ComponentMetaData.CustomPropertyCollection.New(); + variableProperty.Name = VariablePropertyName; + variableProperty.Description = "References a variable to store the data table results."; + variableProperty.Value = string.Empty; + } + + public override void OnInputPathAttached(int inputID) + { + var virtualInput = ComponentMetaData.InputCollection[0].GetVirtualInput(); + + CreateInputColumns(virtualInput); + } + + public override void OnInputPathDetached(int inputID) + { + var virtualInput = ComponentMetaData.InputCollection[0].GetVirtualInput(); + + CreateInputColumns(virtualInput); + } + + public override void ReinitializeMetaData() + { + var virtualInput = ComponentMetaData.InputCollection[0].GetVirtualInput(); + + CreateInputColumns(virtualInput); + } + + private void CreateInputColumns(IDTSVirtualInput virtualInput) + { + ComponentMetaData.InputCollection[0].InputColumnCollection.RemoveAll(); + foreach (IDTSVirtualInputColumn virtualInputColumn in virtualInput.VirtualInputColumnCollection) + { + var inputColumn = ComponentMetaData.InputCollection[0].InputColumnCollection.New(); + inputColumn.LineageID = virtualInputColumn.LineageID; + inputColumn.UsageType = DTSUsageType.UT_READONLY; + } + } + + public override void PreExecute() + { + if (DataTable == null) + { + DataTable = new DataTable("SsisUnit"); + } + + if (_bufferColumnMapping == null) + { + _bufferColumnMapping = new Dictionary(); + } + else + { + _bufferColumnMapping.Clear(); + } + + var names = new Dictionary(); + foreach (IDTSInputColumn column in ComponentMetaData.InputCollection[0].InputColumnCollection) + { + int value; + if (names.TryGetValue(column.Name, out value)) + { + names[column.Name] = value + 1; + } + else + { + names[column.Name] = 1; + } + } + + foreach (IDTSInputColumn column in ComponentMetaData.InputCollection[0].InputColumnCollection) + { + bool isLong = false; + _bufferColumnMapping.Add(GetColumName(names, column), BufferManager.FindColumnByLineageID(ComponentMetaData.InputCollection[0].Buffer, column.LineageID)); + var dataColumn = new DataColumn(GetColumName(names, column)) + { + DataType = BufferTypeToDataRecordType(ConvertBufferDataTypeToFitManaged(column.DataType, ref isLong)), + MaxLength = column.Length == 0 ? -1 : column.Length + }; + if (column.CodePage != 0) + { + dataColumn.ExtendedProperties.Add("codePage", column.CodePage); + } + + if (column.Scale != 0) + { + dataColumn.ExtendedProperties.Add("scale", column.Scale); + } + + if (column.Precision != 0) + { + dataColumn.ExtendedProperties.Add("precision", column.Precision); + } + + DataTable.Columns.Add(dataColumn); + } + } + + private static string GetColumName(Dictionary names, IDTSInputColumn column) + { + int value; + if (names.TryGetValue(column.Name, out value)) + { + if (value > 1) + { + return string.Format("{0}_{1}", column.UpstreamComponentName, column.Name); + } + } + + return string.Format("{0}", column.Name); + } + + public override void ProcessInput(int inputID, PipelineBuffer buffer) + { + base.ProcessInput(inputID, buffer); + + while (buffer.NextRow()) + { + var dataRow = DataTable.NewRow(); + foreach (var columnMapping in _bufferColumnMapping) + { + // TODO: Update to use the correct data type methods + if (buffer.IsNull(columnMapping.Value)) + { + dataRow[columnMapping.Key] = DBNull.Value; + } + else + { + dataRow[columnMapping.Key] = buffer[columnMapping.Value]; + } + } + DataTable.Rows.Add(dataRow); + } + + if (buffer.EndOfRowset) + { + var xml = SaveDataTableToXml(DataTable); + var property = ComponentMetaData.CustomPropertyCollection[DataTablePropertyName]; + property.Value = xml; + + string variableName = ComponentMetaData.CustomPropertyCollection[VariablePropertyName].Value.ToString(); + if (!string.IsNullOrEmpty(variableName)) + { + IDTSVariables variables = null; + VariableDispenser.LockOneForWrite(variableName, ref variables); + variables[variableName].Value = xml; + variables.Unlock(); + } + } + } + + public override void PostExecute() + { + ////var logFile = Path.Combine(Path.GetTempPath(), "SsisUnitDestination.log"); + ////File.WriteAllText(logFile, SaveDataTableToXml(DataTable)); + } + + public override DTSValidationStatus Validate() + { + if (ComponentMetaData.InputCollection[0].InputColumnCollection.Count != ComponentMetaData.InputCollection[0].GetVirtualInput().VirtualInputColumnCollection.Count) + { + return DTSValidationStatus.VS_NEEDSNEWMETADATA; + } + + return base.Validate(); + } + + private static string SaveDataTableToXml(DataTable dataTable) + { + using (var writer = new StringWriter()) + { + dataTable.WriteXml(writer, XmlWriteMode.WriteSchema); + return writer.ToString(); + } + } + } +} diff --git a/SsisUnit.Tests/App.config b/SsisUnit.Tests/App.config index d8c1bd6..b1630b9 100644 --- a/SsisUnit.Tests/App.config +++ b/SsisUnit.Tests/App.config @@ -1,6 +1,6 @@ - - - - - - \ No newline at end of file + + + + + + diff --git a/SsisUnit.Tests/Commands/PropertyCommandTest.cs b/SsisUnit.Tests/Commands/PropertyCommandTest.cs index 4f556b2..71442b6 100644 --- a/SsisUnit.Tests/Commands/PropertyCommandTest.cs +++ b/SsisUnit.Tests/Commands/PropertyCommandTest.cs @@ -1,144 +1,148 @@ -using System; -using System.Diagnostics; -using Microsoft.SqlServer.Dts.Runtime; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -using SsisUnit; -using SsisUnit.Enums; -using SsisUnit.Packages; - -using SsisUnitBase.Enums; - -namespace UTssisUnit.Commands -{ - [TestClass] - public class PropertyCommandTest : ExternalFileResourceTestBase - { - private const string TestXmlFilename = "UTSsisUnit_Property.ssisUnit"; - - [TestMethod] - public void PropertyCommandConstructorTest() - { - var target = new PropertyCommand(new SsisTestSuite(Helper.CreateUnitTestStream(TestXmlFilename))); - Assert.IsNotNull(target); - } - - [TestMethod] - public void RunPropertyCommandSetTest() - { - var ts = new SsisTestSuite(Helper.CreateUnitTestStream(TestXmlFilename)); - var packageFile = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); - ts.PackageList["PropertyTest"].PackagePath = packageFile; - var target = (PropertyCommand)ts.SetupCommands.Commands[1]; - - var ssisApp = new Application(); - var package = ssisApp.LoadPackage(ts.PackageList["PropertyTest"].PackagePath, null); - var container = package; - object actual = target.Execute(package, container); - Assert.AreEqual(1, actual); - Assert.AreEqual(1, package.Variables["TestInt"].Value); - - ts.Execute(); - Assert.AreEqual(3, ts.Statistics.GetStatistic(StatisticEnum.AssertPassedCount)); - } - - [TestMethod] - public void RunPropertyCommandGetTest() - { - var ts = new SsisTestSuite(Helper.CreateUnitTestStream(TestXmlFilename)); - var target = (PropertyCommand)ts.SetupCommands.Commands[0]; - - var ssisApp = new Application(); - var packageFile = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); - ts.PackageList["PropertyTest"].PackagePath = packageFile; - Package package = ssisApp.LoadPackage(ts.PackageList["PropertyTest"].PackagePath, null); - DtsContainer container = package; - object actual = target.Execute(package, container); - Assert.AreEqual("TestValue", actual); - } - - [TestMethod] - public void CheckVariousPathsTest() - { - string packageFilepath; -#if SQL2005 - packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); -#elif SQL2008 - packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); -#elif SQL2014 || SQL2012 - packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest2012.dtsx"); -#endif - - var ts = new SsisTestSuite(); - ts.PackageList.Add("PackageA", new PackageRef("PackageA", packageFilepath, PackageStorageType.FileSystem)); - - ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package\Sequence Container\Script Task.Properties[Description]", "Test Descr")); - ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package\Sequence Container.Properties[Description]", "Test Descr")); - ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package\Execute SQL Task.Properties[Description]", "Test Descr")); - ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.Properties[CreationDate]", "2000-01-01")); - ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.Connections[localhost.AdventureWorksDW2008].Properties[Description]", "Test Descr")); - ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.EventHandlers[OnError].Variables[System::Cancel].Properties[Value]", false)); - ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.EventHandlers[OnError].Properties[Description]", "Test Descr")); - ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.EventHandlers[OnError]\Script Task.Properties[Description]", "Test Descr")); - - // Added to verify work item #7188 - multiple periods in object names - ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.Connections[test.multple.periods.in.path].Properties[Description]", "Test Descr")); - - Test ssisTest = new Test(ts, "Test", "PackageA", null, "{7874CCC9-C3C6-40F5-9E8B-1DD62903D845}"); - - ts.Tests.Add("Test", ssisTest); - - ts.Tests["Test"].Asserts.Add("TestA", AddNewAssert(ts, ssisTest, "TestA", "Test Descr", "\\Package\\Sequence Container\\Script Task.Properties[Description]")); - ts.Tests["Test"].Asserts.Add("TestB", AddNewAssert(ts, ssisTest, "TestB", "Test Descr", "\\Package\\Sequence Container.Properties[Description]")); - ts.Tests["Test"].Asserts.Add("TestC", AddNewAssert(ts, ssisTest, "TestC", "Test Descr", "\\Package\\Execute SQL Task.Properties[Description]")); - ts.Tests["Test"].Asserts.Add("TestD", AddNewAssert(ts, ssisTest, "TestD", "1/1/2000 12:00:00 AM", "\\Package.Properties[CreationDate]")); - ts.Tests["Test"].Asserts.Add("TestE", AddNewAssert(ts, ssisTest, "TestE", "Test Descr", "\\Package.Connections[localhost.AdventureWorksDW2008].Properties[Description]")); - ts.Tests["Test"].Asserts.Add("TestF", AddNewAssert(ts, ssisTest, "TestF", false, "\\Package.EventHandlers[OnError].Variables[System::Cancel].Properties[Value]")); - ts.Tests["Test"].Asserts.Add("TestG", AddNewAssert(ts, ssisTest, "TestG", "Test Descr", "\\Package.EventHandlers[OnError].Properties[Description]")); - ts.Tests["Test"].Asserts.Add("TestH", AddNewAssert(ts, ssisTest, "TestH", "Test Descr", "\\Package.EventHandlers[OnError]\\Script Task.Properties[Description]")); - ts.Tests["Test"].Asserts.Add("TestI", AddNewAssert(ts, ssisTest, "TestI", "Test Descr", "\\Package.Connections[test.multple.periods.in.path].Properties[Description]")); - - var context = ts.CreateContext(); - ts.Execute(context); - context.Log.ApplyTo(log => Debug.Print(log.ItemName + " :: " + string.Join(Environment.NewLine + "\t", log.Messages))); - Assert.AreEqual(10, ts.Statistics.GetStatistic(StatisticEnum.AssertPassedCount)); - Assert.AreEqual(0, ts.Statistics.GetStatistic(StatisticEnum.AssertFailedCount)); - } - - private SsisAssert AddNewAssert(SsisTestSuite ts, Test test, string assertName, object result, string propertyPath) - { - return new SsisAssert(ts, test, assertName, result, false) { Command = new PropertyCommand(ts, "Get", propertyPath, string.Empty) }; - } - - [TestMethod] - public void TestSetConnectionString() - { - string packageFilepath; -#if SQL2005 - packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); -#elif SQL2008 - packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); -#elif SQL2014 || SQL2012 - packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest2012.dtsx"); -#endif - - var ts = new SsisTestSuite(); - ts.PackageList.Add("PackageA", new PackageRef("PackageA", packageFilepath, PackageStorageType.FileSystem)); - - var ssisTest = new Test(ts, "Test", "PackageA", null, "{7874CCC9-C3C6-40F5-9E8B-1DD62903D845}"); - ssisTest.TestSetup.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.Connections[localhost.AdventureWorksDW2008].Properties[ConnectionString]", "Provider=SQLNCLI11.1;Data Source=localhost;Initial Catalog=ssisUnitTestDb;Integrated Security=SSPI;Application Name=TestValue")); - - ts.Tests.Add("Test", ssisTest); - - ts.Tests["Test"].Asserts.Add("Assert", AddNewAssert(ts, ssisTest, "Assert", "Data Source=localhost;Initial Catalog=ssisUnitTestDb;Provider=SQLNCLI11.1;Integrated Security=SSPI;Application Name=TestValue;", "\\Package.Connections[localhost.AdventureWorksDW2008].Properties[ConnectionString]")); - - ts.Execute(); - - Assert.AreEqual("Data Source=localhost;Initial Catalog=ssisUnitTestDb;Provider=SQLNCLI11.1;Integrated Security=SSPI;Application Name=TestValue;", - ssisTest.InternalPackage.Connections["localhost.AdventureWorksDW2008"].ConnectionString); - - Assert.AreEqual(2, ts.Statistics.GetStatistic(StatisticEnum.AssertPassedCount)); - Assert.AreEqual(0, ts.Statistics.GetStatistic(StatisticEnum.AssertFailedCount)); - } - } -} +using System; +using System.Diagnostics; +using Microsoft.SqlServer.Dts.Runtime; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using SsisUnit; +using SsisUnit.Enums; +using SsisUnit.Packages; + +using SsisUnitBase.Enums; + +namespace UTssisUnit.Commands +{ + [TestClass] + public class PropertyCommandTest : ExternalFileResourceTestBase + { + private const string TestXmlFilename = "UTSsisUnit_Property.ssisUnit"; + + [TestMethod] + public void PropertyCommandConstructorTest() + { + var target = new PropertyCommand(new SsisTestSuite(Helper.CreateUnitTestStream(TestXmlFilename))); + Assert.IsNotNull(target); + } + + [TestMethod] + public void RunPropertyCommandSetTest() + { + var ts = new SsisTestSuite(Helper.CreateUnitTestStream(TestXmlFilename)); + var packageFile = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); + ts.PackageList["PropertyTest"].PackagePath = packageFile; + var target = (PropertyCommand)ts.SetupCommands.Commands[1]; + + var ssisApp = new Application(); + var package = ssisApp.LoadPackage(ts.PackageList["PropertyTest"].PackagePath, null); + var container = package; + object actual = target.Execute(package, container); + Assert.AreEqual(1, actual); + Assert.AreEqual(1, package.Variables["TestInt"].Value); + + ts.Execute(); + Assert.AreEqual(3, ts.Statistics.GetStatistic(StatisticEnum.AssertPassedCount)); + } + + [TestMethod] + public void RunPropertyCommandGetTest() + { + var ts = new SsisTestSuite(Helper.CreateUnitTestStream(TestXmlFilename)); + var target = (PropertyCommand)ts.SetupCommands.Commands[0]; + + var ssisApp = new Application(); + var packageFile = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); + ts.PackageList["PropertyTest"].PackagePath = packageFile; + Package package = ssisApp.LoadPackage(ts.PackageList["PropertyTest"].PackagePath, null); + DtsContainer container = package; + object actual = target.Execute(package, container); + Assert.AreEqual("TestValue", actual); + } + + [TestMethod] + public void CheckVariousPathsTest() + { + string packageFilepath; +#if SQL2005 + packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); +#elif SQL2008 + packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); +#elif SQL2014 || SQL2012 + packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest2012.dtsx"); +#elif SQL2017 + packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest2017.dtsx"); +#endif + + var ts = new SsisTestSuite(); + ts.PackageList.Add("PackageA", new PackageRef("PackageA", packageFilepath, PackageStorageType.FileSystem)); + + ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package\Sequence Container\Script Task.Properties[Description]", "Test Descr")); + ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package\Sequence Container.Properties[Description]", "Test Descr")); + ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package\Execute SQL Task.Properties[Description]", "Test Descr")); + ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.Properties[CreationDate]", "2000-01-01")); + ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.Connections[localhost.AdventureWorksDW2008].Properties[Description]", "Test Descr")); + ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.EventHandlers[OnError].Variables[System::Cancel].Properties[Value]", false)); + ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.EventHandlers[OnError].Properties[Description]", "Test Descr")); + ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.EventHandlers[OnError]\Script Task.Properties[Description]", "Test Descr")); + + // Added to verify work item #7188 - multiple periods in object names + ts.SetupCommands.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.Connections[test.multple.periods.in.path].Properties[Description]", "Test Descr")); + + Test ssisTest = new Test(ts, "Test", "PackageA", null, "{7874CCC9-C3C6-40F5-9E8B-1DD62903D845}"); + + ts.Tests.Add("Test", ssisTest); + + ts.Tests["Test"].Asserts.Add("TestA", AddNewAssert(ts, ssisTest, "TestA", "Test Descr", "\\Package\\Sequence Container\\Script Task.Properties[Description]")); + ts.Tests["Test"].Asserts.Add("TestB", AddNewAssert(ts, ssisTest, "TestB", "Test Descr", "\\Package\\Sequence Container.Properties[Description]")); + ts.Tests["Test"].Asserts.Add("TestC", AddNewAssert(ts, ssisTest, "TestC", "Test Descr", "\\Package\\Execute SQL Task.Properties[Description]")); + ts.Tests["Test"].Asserts.Add("TestD", AddNewAssert(ts, ssisTest, "TestD", "1/1/2000 12:00:00 AM", "\\Package.Properties[CreationDate]")); + ts.Tests["Test"].Asserts.Add("TestE", AddNewAssert(ts, ssisTest, "TestE", "Test Descr", "\\Package.Connections[localhost.AdventureWorksDW2008].Properties[Description]")); + ts.Tests["Test"].Asserts.Add("TestF", AddNewAssert(ts, ssisTest, "TestF", false, "\\Package.EventHandlers[OnError].Variables[System::Cancel].Properties[Value]")); + ts.Tests["Test"].Asserts.Add("TestG", AddNewAssert(ts, ssisTest, "TestG", "Test Descr", "\\Package.EventHandlers[OnError].Properties[Description]")); + ts.Tests["Test"].Asserts.Add("TestH", AddNewAssert(ts, ssisTest, "TestH", "Test Descr", "\\Package.EventHandlers[OnError]\\Script Task.Properties[Description]")); + ts.Tests["Test"].Asserts.Add("TestI", AddNewAssert(ts, ssisTest, "TestI", "Test Descr", "\\Package.Connections[test.multple.periods.in.path].Properties[Description]")); + + var context = ts.CreateContext(); + ts.Execute(context); + context.Log.ApplyTo(log => Debug.Print(log.ItemName + " :: " + string.Join(Environment.NewLine + "\t", log.Messages))); + Assert.AreEqual(10, ts.Statistics.GetStatistic(StatisticEnum.AssertPassedCount)); + Assert.AreEqual(0, ts.Statistics.GetStatistic(StatisticEnum.AssertFailedCount)); + } + + private SsisAssert AddNewAssert(SsisTestSuite ts, Test test, string assertName, object result, string propertyPath) + { + return new SsisAssert(ts, test, assertName, result, false) { Command = new PropertyCommand(ts, "Get", propertyPath, string.Empty) }; + } + + [TestMethod] + public void TestSetConnectionString() + { + string packageFilepath; +#if SQL2005 + packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); +#elif SQL2008 + packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest.dtsx"); +#elif SQL2014 || SQL2012 + packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest2012.dtsx"); +#elif SQL2017 + packageFilepath = UnpackToFile("UTssisUnit.TestPackages.PropertyTest2017.dtsx"); +#endif + + var ts = new SsisTestSuite(); + ts.PackageList.Add("PackageA", new PackageRef("PackageA", packageFilepath, PackageStorageType.FileSystem)); + + var ssisTest = new Test(ts, "Test", "PackageA", null, "{7874CCC9-C3C6-40F5-9E8B-1DD62903D845}"); + ssisTest.TestSetup.Commands.Add(new PropertyCommand(ts, "Set", @"\Package.Connections[localhost.AdventureWorksDW2008].Properties[ConnectionString]", "Provider=SQLNCLI11.1;Data Source=localhost;Initial Catalog=ssisUnitTestDb;Integrated Security=SSPI;Application Name=TestValue")); + + ts.Tests.Add("Test", ssisTest); + + ts.Tests["Test"].Asserts.Add("Assert", AddNewAssert(ts, ssisTest, "Assert", "Data Source=localhost;Initial Catalog=ssisUnitTestDb;Provider=SQLNCLI11.1;Integrated Security=SSPI;Application Name=TestValue;", "\\Package.Connections[localhost.AdventureWorksDW2008].Properties[ConnectionString]")); + + ts.Execute(); + + Assert.AreEqual("Data Source=localhost;Initial Catalog=ssisUnitTestDb;Provider=SQLNCLI11.1;Integrated Security=SSPI;Application Name=TestValue;", + ssisTest.InternalPackage.Connections["localhost.AdventureWorksDW2008"].ConnectionString); + + Assert.AreEqual(2, ts.Statistics.GetStatistic(StatisticEnum.AssertPassedCount)); + Assert.AreEqual(0, ts.Statistics.GetStatistic(StatisticEnum.AssertFailedCount)); + } + } +} diff --git a/SsisUnit.Tests/SsisUnit2017.Tests.csproj b/SsisUnit.Tests/SsisUnit2017.Tests.csproj new file mode 100644 index 0000000..779087f --- /dev/null +++ b/SsisUnit.Tests/SsisUnit2017.Tests.csproj @@ -0,0 +1,184 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {ADC78700-333C-4BDC-9F64-DA20F500C273} + Library + Properties + UTssisUnit + UTssisUnit + v4.5 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + SAK + SAK + SAK + SAK + true + SsisUnit.snk + + + + + 3.5 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + true + full + false + bin\Debug\ + TRACE;DEBUG;SQL2017 + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE;SQL2017 + prompt + 4 + false + + + + + True + + + + FakesAssemblies\Microsoft.SQLServer.ManagedDTS.14.0.0.0.Fakes.dll + + + + ..\packages\NUnit.2.6.2\lib\nunit.framework.dll + + + + 3.5 + + + + 3.5 + + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Designer + + + Designer + + + + + Designer + + + + + + + + + + + + + + + + + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + + + + {e693cce8-9edf-4117-ab7f-eb87b87e29ea} + SsisUnitBase + + + {8c839f0e-0afd-4d9a-8dee-5c7963e3e6c7} + SSISUnit.2017 + + + + + \ No newline at end of file diff --git a/SsisUnit.Tests/TestPackages/PropertyTest2017.dtsx b/SsisUnit.Tests/TestPackages/PropertyTest2017.dtsx new file mode 100644 index 0000000..8d0917c --- /dev/null +++ b/SsisUnit.Tests/TestPackages/PropertyTest2017.dtsx @@ -0,0 +1,1431 @@ + + + 6 + + + + + + + + + + + + + + + 0 + + + TestValue + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + +]]> + + + + + + + {30D016F9-3734-4E33-A861-5E7D899E18F3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Debug + AnyCPU + Library + false + ST_2e520664da294f5ca476d73bf038c554.csproj + ST_2e520664da294f5ca476d73bf038c554.csproj + {C26EE104-AC5E-4F4E-A041-E8C774D42051} + + + + true + false + .\bin\Debug\ + false + DEBUG;TRACE + 4 + + + + false + true + .\bin\Release\ + false + TRACE + 4 + + + + + + + + + + + + + + + + + + + + Code + + + ResXFileCodeGenerator + Resources.Designer.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + + + Code + + + + + + + + + + + + + SSIS_ST110 + + + + + + v4.0 + + + + +]]> + + + + + + + + + msBuild + Reference;Import;Folder + {41243A0C-C742-4679-87D2-D249D0A5D01F} + st_2e520664da294f5ca476d73bf038c554 + st_2e520664da294f5ca476d73bf038c554 + + + + + + + + + + +]]> + + + +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ST_2e520664da294f5ca476d73bf038c554.csproj.Properties.Settings.get_Default():ST_2e520664da294f5ca476d73bf038c554.csproj.Properties.Sett" + + "ings")] + +namespace ST_2e520664da294f5ca476d73bf038c554.csproj.Properties +{ + + + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +}]]> + + + + + + +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ST_2e520664da294f5ca476d73bf038c554.csproj.Properties.Resources.get_ResourceManager():System.Resources.Resou" + + "rceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ST_2e520664da294f5ca476d73bf038c554.csproj.Properties.Resources.get_Culture():System.Globalization.CultureIn" + + "fo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ST_2e520664da294f5ca476d73bf038c554.csproj.Properties.Resources.set_Culture(System.Globalization.CultureInfo" + + "):Void")] + +namespace ST_2e520664da294f5ca476d73bf038c554.csproj.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ST_2e520664da294f5ca476d73bf038c554.csproj.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +}]]> + + + TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v + ZGUuDQ0KJAAAAAAAAABQRQAATAEDALF8fFAAAAAAAAAAAOAAAiELAQsAAA4AAAAIAAAAAAAAHi0A + AAAgAAAAQAAAAAAAEAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAACAAAAAAgAAAAAAAAMAQIUAABAA + ABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAMgsAABTAAAAAEAAAJAEAAAAAAAAAAAAAAAAAAAA + AAAAAGAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAJA0AAAAgAAAADgAAAAIA + AAAAAAAAAAAAAAAAACAAAGAucnNyYwAAAJAEAAAAQAAAAAYAAAAQAAAAAAAAAAAAAAAAAABAAABA + LnJlbG9jAAAMAAAAAGAAAAACAAAAFgAAAAAAAAAAAAAAAAAAQAAAQgAAAAAAAAAAAAAAAAAAAAAA + LQAAAAAAAEgAAAACAAUAkCEAADgLAAABAAAAAAAAANggAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4CKA4AAAoqEzACAC0AAAABAAARfgEAAAQtIHIBAABw0AIA + AAIoDwAACm8QAAAKcxEAAAoKBoABAAAEfgEAAAQqGn4CAAAEKh4CgAIAAAQqGn4DAAAEKi5zBgAA + BoADAAAEKh4CKBQAAAoqNgIoFgAAChZvFwAACioeAigYAAAKKgAAAAAAAAC0AAAAzsrvvgEAAACR + AAAAbFN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VSZWFkZXIsIG1zY29ybGliLCBWZXJzaW9uPTQu + MC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OSNT + eXN0ZW0uUmVzb3VyY2VzLlJ1bnRpbWVSZXNvdXJjZVNldAIAAAAAAAAAAAAAAFBBRFBBRFC0AAAA + QlNKQgEAAQAAAAAADAAAAHY0LjAuMzAzMTkAAAAABQBsAAAAhAMAACN+AADwAwAATAUAACNTdHJp + bmdzAAAAADwJAACEAAAAI1VTAMAJAAAQAAAAI0dVSUQAAADQCQAAaAEAACNCbG9iAAAAAAAAAAIA + AAFXHaIBCQMAAAD6JTMAFgAAAQAAABsAAAAFAAAABgAAAAkAAAABAAAAGAAAAAIAAAAPAAAAAQAA + AAIAAAADAAAABAAAAAEAAAADAAAAAQAAAAEAAAAAAAoAAQAAAAAABgDWAM8ACgDyAN0ADgBSASkB + BgBuAc8ABgCEAXMBBgC1AaABBgBsAlICBgCXAoUCBgCuAoUCBgDLAoUCBgDqAoUCBgADA4UCBgAc + A4UCBgA3A4UCBgBSA4UCBgBrA4UCBgCkA4QDBgDEA4QDBgD1A+IDBgASBM8ABgAXBM8ABgA7BIUC + CgBnBFEECgCABFEEBgCVBIQDDgC3BCkBDgDZBCkBAAAAAAEAAAAAAAEAAQAAABAAOQBDAAUAAQAB + AAABEAB5AEMACQADAAUAAQAQAIIAjQANAAQACAADAQAAuAAAABEABAAKABEAlAETABEAwQEXABEA + CwI5AAYGNAJHAFaAPAJKAFaARAJKAFAgAAAAAIMY0QEbAAEAWCAAAAAAkwjXAR8AAQCRIAAAAACT + COsBJAABAJggAAAAAJMI9wEpAAEAoCAAAAAAlggbAj0AAgCzIAAAAACGGNEBGwACAKcgAAAAAJEY + sASJAAIAuyAAAAAAhgAvAhsAAgDJIAAAAACGGNEBGwACAAAAAQBMAjkA0QFYAEEA0QFYAEkA0QFY + AFEA0QFYAFkA0QFYAGEA0QFYAGkA0QFYAHEA0QFYAHkA0QFYAIEA0QFYAIkA0QFdAJEA0QEbAJkA + 0QEbAAkA0QEbAKEAKQRiAKEARARpACkA0QFuALkA0QF6AMkA0QEbABEA0QEbANEA0QEbABkA6wSN + ANkA8wRdABkA0QEbAAgAFABOAAgAGABTACkAkwCAAC4AGwAKAS4AIwAKAS4AYwBIAS4ACwCSAC4A + EwDaAC4AMwDaAC4AKwAQAS4AOwAfAS4AQwAKAS4AWwA/AUMAawBTAEkAkwCAAGEAmwBTAIMAqwBT + AHUAAgABAAMAAwAAAIQBLwAAAAMCNAAAACcCQgACAAIAAwACAAMABQABAAQABQACAAUABwAEgAAA + AQAAAD8SMHIAAAAAAACNAAAABAAAAAAAAAAAAAAAAQDGAAAAAAAEAAAAAAAAAAAAAAABAM8AAAAA + AAsAAAAAAAAAAAAAAAoACgEAAAAAAAAAAAEAAAACBQAABQAEAAAAADxNb2R1bGU+AFNUXzJlNTIw + NjY0ZGEyOTRmNWNhNDc2ZDczYmYwMzhjNTU0LmNzcHJvai5kbGwAUmVzb3VyY2VzAFNUXzJlNTIw + NjY0ZGEyOTRmNWNhNDc2ZDczYmYwMzhjNTU0LmNzcHJvai5Qcm9wZXJ0aWVzAFNldHRpbmdzAFNj + cmlwdE1haW4AU1RfMmU1MjA2NjRkYTI5NGY1Y2E0NzZkNzNiZjAzOGM1NTQuY3Nwcm9qAFNjcmlw + dFJlc3VsdHMAbXNjb3JsaWIAU3lzdGVtAE9iamVjdABTeXN0ZW0uQ29uZmlndXJhdGlvbgBBcHBs + aWNhdGlvblNldHRpbmdzQmFzZQBNaWNyb3NvZnQuU3FsU2VydmVyLlNjcmlwdFRhc2sATWljcm9z + b2Z0LlNxbFNlcnZlci5EdHMuVGFza3MuU2NyaXB0VGFzawBWU1RBUlRTY3JpcHRPYmplY3RNb2Rl + bEJhc2UARW51bQBTeXN0ZW0uUmVzb3VyY2VzAFJlc291cmNlTWFuYWdlcgByZXNvdXJjZU1hbgBT + eXN0ZW0uR2xvYmFsaXphdGlvbgBDdWx0dXJlSW5mbwByZXNvdXJjZUN1bHR1cmUALmN0b3IAZ2V0 + X1Jlc291cmNlTWFuYWdlcgBnZXRfQ3VsdHVyZQBzZXRfQ3VsdHVyZQBDdWx0dXJlAGRlZmF1bHRJ + bnN0YW5jZQBnZXRfRGVmYXVsdABEZWZhdWx0AE1haW4AdmFsdWVfXwBTdWNjZXNzAEZhaWx1cmUA + dmFsdWUAU3lzdGVtLlJ1bnRpbWUuVmVyc2lvbmluZwBUYXJnZXRGcmFtZXdvcmtBdHRyaWJ1dGUA + U3lzdGVtLlJlZmxlY3Rpb24AQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZQBBc3NlbWJseURlc2NyaXB0 + aW9uQXR0cmlidXRlAEFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZQBBc3NlbWJseUNvbXBh + bnlBdHRyaWJ1dGUAQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlAEFzc2VtYmx5Q29weXJpZ2h0QXR0 + cmlidXRlAEFzc2VtYmx5VHJhZGVtYXJrQXR0cmlidXRlAEFzc2VtYmx5Q3VsdHVyZUF0dHJpYnV0 + ZQBBc3NlbWJseVZlcnNpb25BdHRyaWJ1dGUAU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNl + cwBDb21waWxhdGlvblJlbGF4YXRpb25zQXR0cmlidXRlAFJ1bnRpbWVDb21wYXRpYmlsaXR5QXR0 + cmlidXRlAFN5c3RlbS5EaWFnbm9zdGljcwBEZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlAFR5 + cGUAUnVudGltZVR5cGVIYW5kbGUAR2V0VHlwZUZyb21IYW5kbGUAQXNzZW1ibHkAZ2V0X0Fzc2Vt + Ymx5AFN5c3RlbS5Db21wb25lbnRNb2RlbABFZGl0b3JCcm93c2FibGVBdHRyaWJ1dGUARWRpdG9y + QnJvd3NhYmxlU3RhdGUAQ29tcGlsZXJHZW5lcmF0ZWRBdHRyaWJ1dGUALmNjdG9yAFNTSVNTY3Jp + cHRUYXNrRW50cnlQb2ludEF0dHJpYnV0ZQBTY3JpcHRPYmplY3RNb2RlbABnZXRfRHRzAHNldF9U + YXNrUmVzdWx0AFNUXzJlNTIwNjY0ZGEyOTRmNWNhNDc2ZDczYmYwMzhjNTU0LmNzcHJvai5Qcm9w + ZXJ0aWVzLlJlc291cmNlcy5yZXNvdXJjZXMAAH9TAFQAXwAyAGUANQAyADAANgA2ADQAZABhADIA + OQA0AGYANQBjAGEANAA3ADYAZAA3ADMAYgBmADAAMwA4AGMANQA1ADQALgBjAHMAcAByAG8AagAu + AFAAcgBvAHAAZQByAHQAaQBlAHMALgBSAGUAcwBvAHUAcgBjAGUAcwAAAAAA+emofvtmyk+Ozrse + Fhg/hgAIt3pcVhk04IkIiYRdzYCAzJEDBhIVAwYSGQMgAAEEAAASFQQAABIZBQABARIZBAgAEhUE + CAASGQMGEgwEAAASDAQIABIMAgYIAwYRFAQAAAAABAEAAAAEIAEBDgQgAQEIBgABElERVQQgABJZ + BiACAQ4SWQQHARIVBSABARFhCAEAAgAAAAAAAwAAAQQgABJtRwEAGi5ORVRGcmFtZXdvcmssVmVy + c2lvbj12NC4wAQBUDhRGcmFtZXdvcmtEaXNwbGF5TmFtZRAuTkVUIEZyYW1ld29yayA0LwEAKlNU + XzJlNTIwNjY0ZGEyOTRmNWNhNDc2ZDczYmYwMzhjNTU0LmNzcHJvagAABQEAAAAADgEACU1pY3Jv + c29mdAAAHwEAGkNvcHlyaWdodCBAIE1pY3Jvc29mdCAyMDA5AAAIAQAIAAAAAAAeAQABAFQCFldy + YXBOb25FeGNlcHRpb25UaHJvd3MBAPAsAAAAAAAAAAAAAA4tAAAAIAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAALQAAAAAAAAAAAAAAAAAAAABfQ29yRGxsTWFpbgBtc2NvcmVlLmRsbAAAAAAA/yUAIAAQ + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAQAQAAAAGAAAgAAAAAAAAAAAAAAAAAAAAQABAAAAMAAAgAAAAAAAAAAAAAAAAAAAAQAA + AAAASAAAAFhAAAA4BAAAAAAAAAAAAAA4BDQAAABWAFMAXwBWAEUAUgBTAEkATwBOAF8ASQBOAEYA + TwAAAAAAvQTv/gAAAQAAAAEAMHI/EgAAAQAwcj8SPwAAAAAAAAAEAAAAAgAAAAAAAAAAAAAAAAAA + AEQAAAABAFYAYQByAEYAaQBsAGUASQBuAGYAbwAAAAAAJAAEAAAAVAByAGEAbgBzAGwAYQB0AGkA + bwBuAAAAAAAAALAEmAMAAAEAUwB0AHIAaQBuAGcARgBpAGwAZQBJAG4AZgBvAAAAdAMAAAEAMAAw + ADAAMAAwADQAYgAwAAAANAAKAAEAQwBvAG0AcABhAG4AeQBOAGEAbQBlAAAAAABNAGkAYwByAG8A + cwBvAGYAdAAAAIAAKwABAEYAaQBsAGUARABlAHMAYwByAGkAcAB0AGkAbwBuAAAAAABTAFQAXwAy + AGUANQAyADAANgA2ADQAZABhADIAOQA0AGYANQBjAGEANAA3ADYAZAA3ADMAYgBmADAAMwA4AGMA + NQA1ADQALgBjAHMAcAByAG8AagAAAAAAQAAPAAEARgBpAGwAZQBWAGUAcgBzAGkAbwBuAAAAAAAx + AC4AMAAuADQANgA3ADEALgAyADkAMgAzADIAAAAAAIAALwABAEkAbgB0AGUAcgBuAGEAbABOAGEA + bQBlAAAAUwBUAF8AMgBlADUAMgAwADYANgA0AGQAYQAyADkANABmADUAYwBhADQANwA2AGQANwAz + AGIAZgAwADMAOABjADUANQA0AC4AYwBzAHAAcgBvAGoALgBkAGwAbAAAAAAAXAAbAAEATABlAGcA + YQBsAEMAbwBwAHkAcgBpAGcAaAB0AAAAQwBvAHAAeQByAGkAZwBoAHQAIABAACAATQBpAGMAcgBv + AHMAbwBmAHQAIAAyADAAMAA5AAAAAACIAC8AAQBPAHIAaQBnAGkAbgBhAGwARgBpAGwAZQBuAGEA + bQBlAAAAUwBUAF8AMgBlADUAMgAwADYANgA0AGQAYQAyADkANABmADUAYwBhADQANwA2AGQANwAz + AGIAZgAwADMAOABjADUANQA0AC4AYwBzAHAAcgBvAGoALgBkAGwAbAAAAAAAeAArAAEAUAByAG8A + ZAB1AGMAdABOAGEAbQBlAAAAAABTAFQAXwAyAGUANQAyADAANgA2ADQAZABhADIAOQA0AGYANQBj + AGEANAA3ADYAZAA3ADMAYgBmADAAMwA4AGMANQA1ADQALgBjAHMAcAByAG8AagAAAAAARAAPAAEA + UAByAG8AZAB1AGMAdABWAGUAcgBzAGkAbwBuAAAAMQAuADAALgA0ADYANwAxAC4AMgA5ADIAMwAy + AAAAAABIAA8AAQBBAHMAcwBlAG0AYgBsAHkAIABWAGUAcgBzAGkAbwBuAAAAMQAuADAALgA0ADYA + NwAxAC4AMgA5ADIAMwAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAMAAAAID0A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + +]]> + + + +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_a0ccb2ff521c4e8983a384c2b7dc0dbb.Properties.Settings.get_Default():ST_a0ccb2ff521c4e8983a384c2b7dc0dbb.Properties.Sett" + + "ings")] + +namespace ST_a0ccb2ff521c4e8983a384c2b7dc0dbb.Properties { + + + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +}]]> + + + + /// ScriptMain is the entry point class of the script. Do not change the name, attributes, + /// or parent of this class. + /// + [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] + public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase + { + #region Help: Using Integration Services variables and parameters in a script + /* To use a variable in this script, first ensure that the variable has been added to + * either the list contained in the ReadOnlyVariables property or the list contained in + * the ReadWriteVariables property of this script task, according to whether or not your + * code needs to write to the variable. To add the variable, save this script, close this instance of + * Visual Studio, and update the ReadOnlyVariables and + * ReadWriteVariables properties in the Script Transformation Editor window. + * To use a parameter in this script, follow the same steps. Parameters are always read-only. + * + * Example of reading from a variable: + * DateTime startTime = (DateTime) Dts.Variables["System::StartTime"].Value; + * + * Example of writing to a variable: + * Dts.Variables["User::myStringVariable"].Value = "new value"; + * + * Example of reading from a package parameter: + * int batchId = (int) Dts.Variables["$Package::batchId"].Value; + * + * Example of reading from a project parameter: + * int batchId = (int) Dts.Variables["$Project::batchId"].Value; + * + * Example of reading from a sensitive project parameter: + * int batchId = (int) Dts.Variables["$Project::batchId"].GetSensitiveValue(); + * */ + + #endregion + + #region Help: Firing Integration Services events from a script + /* This script task can fire events for logging purposes. + * + * Example of firing an error event: + * Dts.Events.FireError(18, "Process Values", "Bad value", "", 0); + * + * Example of firing an information event: + * Dts.Events.FireInformation(3, "Process Values", "Processing has started", "", 0, ref fireAgain) + * + * Example of firing a warning event: + * Dts.Events.FireWarning(14, "Process Values", "No values received for input", "", 0); + * */ + #endregion + + #region Help: Using Integration Services connection managers in a script + /* Some types of connection managers can be used in this script task. See the topic + * "Working with Connection Managers Programatically" for details. + * + * Example of using an ADO.Net connection manager: + * object rawConnection = Dts.Connections["Sales DB"].AcquireConnection(Dts.Transaction); + * SqlConnection myADONETConnection = (SqlConnection)rawConnection; + * //Use the connection in some code here, then release the connection + * Dts.Connections["Sales DB"].ReleaseConnection(rawConnection); + * + * Example of using a File connection manager + * object rawConnection = Dts.Connections["Prices.zip"].AcquireConnection(Dts.Transaction); + * string filePath = (string)rawConnection; + * //Use the connection in some code here, then release the connection + * Dts.Connections["Prices.zip"].ReleaseConnection(rawConnection); + * */ + #endregion + + + /// + /// This method is called when this script task executes in the control flow. + /// Before returning from this method, set the value of Dts.TaskResult to indicate success or failure. + /// To open Help, press F1. + /// + public void Main() + { + // TODO: Add your code here + + Dts.TaskResult = (int)ScriptResults.Success; + } + + #region ScriptResults declaration + /// + /// This enum provides a convenient shorthand within the scope of this class for setting the + /// result of the script. + /// + /// This code was generated automatically. + /// + enum ScriptResults + { + Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, + Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure + }; + #endregion + + } +}]]> + + + + + + {30D016F9-3734-4E33-A861-5E7D899E18F3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Debug + AnyCPU + 8.0.30703 + 2.0 + {52274F9C-F092-4E9A-97CD-E3432E9296B3} + Library + Properties + ST_a0ccb2ff521c4e8983a384c2b7dc0dbb + ST_a0ccb2ff521c4e8983a384c2b7dc0dbb + v4.0 + 512 + + + true + full + false + .\bin\Debug\ + false + DEBUG;TRACE + prompt + 4 + + + false + true + .\bin\Release\ + false + TRACE + prompt + 4 + + + + + + + + + + + + + Code + + + ResXFileCodeGenerator + Resources.Designer.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + + + Code + + + + + + + + + + + SSIS_ST110 + + + + +]]> + + + + + + ST_a0ccb2ff521c4e8983a384c2b7dc0dbb + ST_a0ccb2ff521c4e8983a384c2b7dc0dbb + {68BFC19E-329D-47A6-94A9-79081165763D} + msBuild + + + + + + + + + + +]]> + + + + + + + + + + + +]]> + + + +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_a0ccb2ff521c4e8983a384c2b7dc0dbb.Properties.Resources.get_ResourceManager():System.Resources.Resou" + + "rceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_a0ccb2ff521c4e8983a384c2b7dc0dbb.Properties.Resources.get_Culture():System.Globalization.CultureIn" + + "fo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ST_a0ccb2ff521c4e8983a384c2b7dc0dbb.Properties.Resources.set_Culture(System.Globalization.CultureInfo" + + "):Void")] + +namespace ST_a0ccb2ff521c4e8983a384c2b7dc0dbb.Properties { + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ST_a0ccb2ff521c4e8983a384c2b7dc0dbb.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +}]]> + + + TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v + ZGUuDQ0KJAAAAAAAAABQRQAATAEDANR8fFAAAAAAAAAAAOAAAiELAQsAAA4AAAAIAAAAAAAAziwA + AAAgAAAAQAAAAAAAEAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAACAAAAAAgAAAAAAAAMAQIUAABAA + ABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAHwsAABPAAAAAEAAAAgEAAAAAAAAAAAAAAAAAAAA + AAAAAGAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAA1AwAAAAgAAAADgAAAAIA + AAAAAAAAAAAAAAAAACAAAGAucnNyYwAAAAgEAAAAQAAAAAYAAAAQAAAAAAAAAAAAAAAAAABAAABA + LnJlbG9jAAAMAAAAAGAAAAACAAAAFgAAAAAAAAAAAAAAAAAAQAAAQgAAAAAAAAAAAAAAAAAAAACw + LAAAAAAAAEgAAAACAAUAkCEAAOwKAAABAAAAAAAAANggAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4CKA4AAAoqEzACAC0AAAABAAARfgEAAAQtIHIBAABw0AIA + AAIoDwAACm8QAAAKcxEAAAoKBoABAAAEfgEAAAQqGn4CAAAEKh4CgAIAAAQqGn4DAAAEKi5zBgAA + BoADAAAEKh4CKBQAAAoqNgIoFgAAChZvFwAACioeAigYAAAKKgAAAAAAAAC0AAAAzsrvvgEAAACR + AAAAbFN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VSZWFkZXIsIG1zY29ybGliLCBWZXJzaW9uPTQu + MC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OSNT + eXN0ZW0uUmVzb3VyY2VzLlJ1bnRpbWVSZXNvdXJjZVNldAIAAAAAAAAAAAAAAFBBRFBBRFC0AAAA + QlNKQgEAAQAAAAAADAAAAHY0LjAuMzAzMTkAAAAABQBsAAAAhAMAACN+AADwAwAAMAUAACNTdHJp + bmdzAAAAACAJAAB0AAAAI1VTAJQJAAAQAAAAI0dVSUQAAACkCQAASAEAACNCbG9iAAAAAAAAAAIA + AAFXHaIBCQMAAAD6JTMAFgAAAQAAABsAAAAFAAAABgAAAAkAAAABAAAAGAAAAAIAAAAPAAAAAQAA + AAIAAAADAAAABAAAAAEAAAADAAAAAQAAAAEAAAAAAAoAAQAAAAAABgDBALoACgDdAMgADgA9ARQB + BgBZAboABgBvAV4BBgCgAYsBBgBXAj0CBgCCAnACBgCZAnACBgC2AnACBgDVAnACBgDuAnACBgAH + A3ACBgAiA3ACBgA9A3ACBgBWA3ACBgCPA28DBgCvA28DBgDgA80DBgD9A7oABgACBLoABgAmBHAC + CgBSBDwECgBrBDwEBgCABG8DDgCiBBQBDgDEBBQBAAAAAAEAAAAAAAEAAQAAABAAMgA8AAUAAQAB + AAABEABrADwACQADAAUAAQAQAHQAfwANAAQACAADAQAAowAAABEABAAKABEAfwETABEArAEXABEA + 9gE5AAYGHwJHAFaAJwJKAFaALwJKAFAgAAAAAIMYvAEbAAEAWCAAAAAAkwjCAR8AAQCRIAAAAACT + CNYBJAABAJggAAAAAJMI4gEpAAEAoCAAAAAAlggGAj0AAgCzIAAAAACGGLwBGwACAKcgAAAAAJEY + mwSJAAIAuyAAAAAAhgAaAhsAAgDJIAAAAACGGLwBGwACAAAAAQA3AjkAvAFYAEEAvAFYAEkAvAFY + AFEAvAFYAFkAvAFYAGEAvAFYAGkAvAFYAHEAvAFYAHkAvAFYAIEAvAFYAIkAvAFdAJEAvAEbAJkA + vAEbAAkAvAEbAKEAFARiAKEALwRpACkAvAFuALkAvAF6AMkAvAEbABEAvAEbANEAvAEbABkA1gSN + ANkA3gRdABkAvAEbAAgAFABOAAgAGABTACkAkwCAAC4AGwADAS4AIwADAS4AYwApAS4ACwCSAC4A + EwDaAC4AMwDaAC4AKwADAS4AOwAJAS4AQwADAS4AWwAgAUMAawBTAEkAkwCAAGEAmwBTAIMAqwBT + AHUAAgABAAMAAwAAAG8BLwAAAO4BNAAAABICQgACAAIAAwACAAMABQABAAQABQACAAUABwAEgAAA + AQAAAD8SQnIAAAAAAAB/AAAABAAAAAAAAAAAAAAAAQCxAAAAAAAEAAAAAAAAAAAAAAABALoAAAAA + AAsAAAAAAAAAAAAAAAoA9QAAAAAAAAAAAAEAAADtBAAABQAEAAAAADxNb2R1bGU+AFNUX2EwY2Ni + MmZmNTIxYzRlODk4M2EzODRjMmI3ZGMwZGJiLmRsbABSZXNvdXJjZXMAU1RfYTBjY2IyZmY1MjFj + NGU4OTgzYTM4NGMyYjdkYzBkYmIuUHJvcGVydGllcwBTZXR0aW5ncwBTY3JpcHRNYWluAFNUX2Ew + Y2NiMmZmNTIxYzRlODk4M2EzODRjMmI3ZGMwZGJiAFNjcmlwdFJlc3VsdHMAbXNjb3JsaWIAU3lz + dGVtAE9iamVjdABTeXN0ZW0uQ29uZmlndXJhdGlvbgBBcHBsaWNhdGlvblNldHRpbmdzQmFzZQBN + aWNyb3NvZnQuU3FsU2VydmVyLlNjcmlwdFRhc2sATWljcm9zb2Z0LlNxbFNlcnZlci5EdHMuVGFz + a3MuU2NyaXB0VGFzawBWU1RBUlRTY3JpcHRPYmplY3RNb2RlbEJhc2UARW51bQBTeXN0ZW0uUmVz + b3VyY2VzAFJlc291cmNlTWFuYWdlcgByZXNvdXJjZU1hbgBTeXN0ZW0uR2xvYmFsaXphdGlvbgBD + dWx0dXJlSW5mbwByZXNvdXJjZUN1bHR1cmUALmN0b3IAZ2V0X1Jlc291cmNlTWFuYWdlcgBnZXRf + Q3VsdHVyZQBzZXRfQ3VsdHVyZQBDdWx0dXJlAGRlZmF1bHRJbnN0YW5jZQBnZXRfRGVmYXVsdABE + ZWZhdWx0AE1haW4AdmFsdWVfXwBTdWNjZXNzAEZhaWx1cmUAdmFsdWUAU3lzdGVtLlJ1bnRpbWUu + VmVyc2lvbmluZwBUYXJnZXRGcmFtZXdvcmtBdHRyaWJ1dGUAU3lzdGVtLlJlZmxlY3Rpb24AQXNz + ZW1ibHlUaXRsZUF0dHJpYnV0ZQBBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlAEFzc2VtYmx5 + Q29uZmlndXJhdGlvbkF0dHJpYnV0ZQBBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGUAQXNzZW1ibHlQ + cm9kdWN0QXR0cmlidXRlAEFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlAEFzc2VtYmx5VHJhZGVt + YXJrQXR0cmlidXRlAEFzc2VtYmx5Q3VsdHVyZUF0dHJpYnV0ZQBBc3NlbWJseVZlcnNpb25BdHRy + aWJ1dGUAU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcwBDb21waWxhdGlvblJlbGF4YXRp + b25zQXR0cmlidXRlAFJ1bnRpbWVDb21wYXRpYmlsaXR5QXR0cmlidXRlAFN5c3RlbS5EaWFnbm9z + dGljcwBEZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlAFR5cGUAUnVudGltZVR5cGVIYW5kbGUA + R2V0VHlwZUZyb21IYW5kbGUAQXNzZW1ibHkAZ2V0X0Fzc2VtYmx5AFN5c3RlbS5Db21wb25lbnRN + b2RlbABFZGl0b3JCcm93c2FibGVBdHRyaWJ1dGUARWRpdG9yQnJvd3NhYmxlU3RhdGUAQ29tcGls + ZXJHZW5lcmF0ZWRBdHRyaWJ1dGUALmNjdG9yAFNTSVNTY3JpcHRUYXNrRW50cnlQb2ludEF0dHJp + YnV0ZQBTY3JpcHRPYmplY3RNb2RlbABnZXRfRHRzAHNldF9UYXNrUmVzdWx0AFNUX2EwY2NiMmZm + NTIxYzRlODk4M2EzODRjMmI3ZGMwZGJiLlByb3BlcnRpZXMuUmVzb3VyY2VzLnJlc291cmNlcwAA + cVMAVABfAGEAMABjAGMAYgAyAGYAZgA1ADIAMQBjADQAZQA4ADkAOAAzAGEAMwA4ADQAYwAyAGIA + NwBkAGMAMABkAGIAYgAuAFAAcgBvAHAAZQByAHQAaQBlAHMALgBSAGUAcwBvAHUAcgBjAGUAcwAA + AMBRXj+ryRdEs0oYSs3cZ0gACLd6XFYZNOCJCImEXc2AgMyRAwYSFQMGEhkDIAABBAAAEhUEAAAS + GQUAAQESGQQIABIVBAgAEhkDBhIMBAAAEgwECAASDAIGCAMGERQEAAAAAAQBAAAABCABAQ4EIAEB + CAYAARJREVUEIAASWQYgAgEOElkEBwESFQUgAQERYQgBAAIAAAAAAAMAAAEEIAASbUcBABouTkVU + RnJhbWV3b3JrLFZlcnNpb249djQuMAEAVA4URnJhbWV3b3JrRGlzcGxheU5hbWUQLk5FVCBGcmFt + ZXdvcmsgNCgBACNTVF9hMGNjYjJmZjUyMWM0ZTg5ODNhMzg0YzJiN2RjMGRiYgAABQEAAAAAFgEA + EUNvcHlyaWdodCBAICAyMDEyAAAIAQAIAAAAAAAeAQABAFQCFldyYXBOb25FeGNlcHRpb25UaHJv + d3MBpCwAAAAAAAAAAAAAviwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAsAAAAAAAAAAAAAAAA + X0NvckRsbE1haW4AbXNjb3JlZS5kbGwAAAAAAP8lACAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAQAQAAAAGAAAgAAAAAAAAAAAAAAAAAAAAQABAAAAMAAAgAAAAAAAAAAAAAAAAAAAAQAA + AAAASAAAAFhAAACwAwAAAAAAAAAAAACwAzQAAABWAFMAXwBWAEUAUgBTAEkATwBOAF8ASQBOAEYA + TwAAAAAAvQTv/gAAAQAAAAEAQnI/EgAAAQBCcj8SPwAAAAAAAAAEAAAAAgAAAAAAAAAAAAAAAAAA + AEQAAAABAFYAYQByAEYAaQBsAGUASQBuAGYAbwAAAAAAJAAEAAAAVAByAGEAbgBzAGwAYQB0AGkA + bwBuAAAAAAAAALAEEAMAAAEAUwB0AHIAaQBuAGcARgBpAGwAZQBJAG4AZgBvAAAA7AIAAAEAMAAw + ADAAMAAwADQAYgAwAAAAcAAkAAEARgBpAGwAZQBEAGUAcwBjAHIAaQBwAHQAaQBvAG4AAAAAAFMA + VABfAGEAMABjAGMAYgAyAGYAZgA1ADIAMQBjADQAZQA4ADkAOAAzAGEAMwA4ADQAYwAyAGIANwBk + AGMAMABkAGIAYgAAAEAADwABAEYAaQBsAGUAVgBlAHIAcwBpAG8AbgAAAAAAMQAuADAALgA0ADYA + NwAxAC4AMgA5ADIANQAwAAAAAABwACgAAQBJAG4AdABlAHIAbgBhAGwATgBhAG0AZQAAAFMAVABf + AGEAMABjAGMAYgAyAGYAZgA1ADIAMQBjADQAZQA4ADkAOAAzAGEAMwA4ADQAYwAyAGIANwBkAGMA + MABkAGIAYgAuAGQAbABsAAAASAASAAEATABlAGcAYQBsAEMAbwBwAHkAcgBpAGcAaAB0AAAAQwBv + AHAAeQByAGkAZwBoAHQAIABAACAAIAAyADAAMQAyAAAAeAAoAAEATwByAGkAZwBpAG4AYQBsAEYA + aQBsAGUAbgBhAG0AZQAAAFMAVABfAGEAMABjAGMAYgAyAGYAZgA1ADIAMQBjADQAZQA4ADkAOAAz + AGEAMwA4ADQAYwAyAGIANwBkAGMAMABkAGIAYgAuAGQAbABsAAAAaAAkAAEAUAByAG8AZAB1AGMA + dABOAGEAbQBlAAAAAABTAFQAXwBhADAAYwBjAGIAMgBmAGYANQAyADEAYwA0AGUAOAA5ADgAMwBh + ADMAOAA0AGMAMgBiADcAZABjADAAZABiAGIAAABEAA8AAQBQAHIAbwBkAHUAYwB0AFYAZQByAHMA + aQBvAG4AAAAxAC4AMAAuADQANgA3ADEALgAyADkAMgA1ADAAAAAAAEgADwABAEEAcwBzAGUAbQBi + AGwAeQAgAFYAZQByAHMAaQBvAG4AAAAxAC4AMAAuADQANgA3ADEALgAyADkAMgA1ADAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAMAAAA0DwA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + \ No newline at end of file diff --git a/SsisUnit/Commands/ComponentInputCommand.cs b/SsisUnit/Commands/ComponentInputCommand.cs index 64d9520..6c6d1a9 100644 --- a/SsisUnit/Commands/ComponentInputCommand.cs +++ b/SsisUnit/Commands/ComponentInputCommand.cs @@ -1,147 +1,147 @@ -using System; -using System.Data; -using System.IO; -using System.Xml; - -using Microsoft.SqlServer.Dts.Pipeline.Wrapper; -using Microsoft.SqlServer.Dts.Runtime; - -using SsisUnit.TestComponents; - -#if SQL2014 || SQL2012 || SQL2008 -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; -using IDTSInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInput100; -#elif SQL2005 -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; -using IDTSInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInput90; -#endif - -namespace SsisUnit.Commands -{ - class ComponentInputCommand : CommandBase - { - // private const string SsisUnitSourceId = "SsisUnit.TestComponents.SsisUnitSource"; - private const string PropName = "name"; - private const string PropDataSet = "dataset"; - private const string PropInput = "input"; - - #region Constructors - - public ComponentInputCommand(SsisTestSuite testSuite) - : base(testSuite) - { - InitializeProperties(); - } - - public ComponentInputCommand(SsisTestSuite testSuite, object parent) - : base(testSuite, parent) - { - InitializeProperties(); - } - - public ComponentInputCommand(SsisTestSuite testSuite, string commandXml) - : base(testSuite, commandXml) - { - InitializeProperties(); - } - - public ComponentInputCommand(SsisTestSuite testSuite, object parent, string commandXml) - : base(testSuite, parent, commandXml) - { - InitializeProperties(); - } - - public ComponentInputCommand(SsisTestSuite testSuite, XmlNode commandXml) - : base(testSuite, commandXml) - { - InitializeProperties(); - } - - public ComponentInputCommand(SsisTestSuite testSuite, object parent, XmlNode commandXml) - : base(testSuite, parent, commandXml) - { - InitializeProperties(); - } - - public ComponentInputCommand(SsisTestSuite testSuite, string name, string dataset, string input) - : this(testSuite) - { - Properties[PropName] = new CommandProperty(PropName, name); - Properties[PropDataSet] = new CommandProperty(PropDataSet, dataset); - Properties[PropInput] = new CommandProperty(PropInput, input); - } - - #endregion - - public override object Execute(object project, Package package, DtsContainer container) - { - return Execute(package, container); - } - - public override object Execute(Package package, DtsContainer container) - { - string remainingPath; - var taskHost = Helper.FindExecutable(package, Properties[PropInput].Value, out remainingPath) as TaskHost; - if (taskHost == null) - { - throw new ArgumentException("Input property did not match a valid component input.", "package"); - } - var mainPipe = taskHost.InnerObject as MainPipe; - if (mainPipe == null) - { - throw new ArgumentException("Input property did not match a valid component input.", "package"); - } - - IDTSInput input = Helper.FindComponentInput(mainPipe, remainingPath); - if (input == null) - { - throw new ArgumentException("Input property did not match a valid component input.", "package"); - } - - ReplaceInput(mainPipe, input, TestSuite.Datasets[Properties[PropDataSet].Value]); - - return null; - } - - private void ReplaceInput(MainPipe mainPipe, IDTSInput input, Dataset dataset) - { - var placeholderSource = mainPipe.ComponentMetaDataCollection.New(); - placeholderSource.ComponentClassID = typeof(SsisUnitSource).AssemblyQualifiedName; - CManagedComponentWrapper wrapper = placeholderSource.Instantiate(); - wrapper.ProvideComponentProperties(); - wrapper.SetComponentProperty("TestData", GetDataSet(dataset)); - -#if DEBUG - for (int i = 0; i < placeholderSource.OutputCollection[0].OutputColumnCollection.Count; i++) - { - System.Diagnostics.Debug.Print(placeholderSource.OutputCollection[0].OutputColumnCollection[i].Name); - } -#endif - - var path = Helper.FindPath(mainPipe, input); - mainPipe.PathCollection.RemoveObjectByID(path.ID); - path = mainPipe.PathCollection.New(); - path.AttachPathAndPropagateNotifications(placeholderSource.OutputCollection[0], input); - - // TODO: Remap IDs? - Failing downstream because of invalid column references. - // Could remap ids, or clone the output column ids from the original source - that will mean changing the source component. - } - - private string GetDataSet(Dataset dataset) - { - var result = dataset.RetrieveDataTable(); - using (var writer = new StringWriter()) - { - result.WriteXml(writer, XmlWriteMode.WriteSchema); - return writer.ToString(); - } - } - - private void InitializeProperties() - { - AddProperty(PropName, string.Empty); - AddProperty(PropDataSet, string.Empty); - AddProperty(PropInput, string.Empty); - } - } -} +using System; +using System.Data; +using System.IO; +using System.Xml; + +using Microsoft.SqlServer.Dts.Pipeline.Wrapper; +using Microsoft.SqlServer.Dts.Runtime; + +using SsisUnit.TestComponents; + +#if SQL2017 || SQL2014 || SQL2012 || SQL2008 +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; +using IDTSInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInput100; +#elif SQL2005 +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; +using IDTSInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInput90; +#endif + +namespace SsisUnit.Commands +{ + class ComponentInputCommand : CommandBase + { + // private const string SsisUnitSourceId = "SsisUnit.TestComponents.SsisUnitSource"; + private const string PropName = "name"; + private const string PropDataSet = "dataset"; + private const string PropInput = "input"; + + #region Constructors + + public ComponentInputCommand(SsisTestSuite testSuite) + : base(testSuite) + { + InitializeProperties(); + } + + public ComponentInputCommand(SsisTestSuite testSuite, object parent) + : base(testSuite, parent) + { + InitializeProperties(); + } + + public ComponentInputCommand(SsisTestSuite testSuite, string commandXml) + : base(testSuite, commandXml) + { + InitializeProperties(); + } + + public ComponentInputCommand(SsisTestSuite testSuite, object parent, string commandXml) + : base(testSuite, parent, commandXml) + { + InitializeProperties(); + } + + public ComponentInputCommand(SsisTestSuite testSuite, XmlNode commandXml) + : base(testSuite, commandXml) + { + InitializeProperties(); + } + + public ComponentInputCommand(SsisTestSuite testSuite, object parent, XmlNode commandXml) + : base(testSuite, parent, commandXml) + { + InitializeProperties(); + } + + public ComponentInputCommand(SsisTestSuite testSuite, string name, string dataset, string input) + : this(testSuite) + { + Properties[PropName] = new CommandProperty(PropName, name); + Properties[PropDataSet] = new CommandProperty(PropDataSet, dataset); + Properties[PropInput] = new CommandProperty(PropInput, input); + } + + #endregion + + public override object Execute(object project, Package package, DtsContainer container) + { + return Execute(package, container); + } + + public override object Execute(Package package, DtsContainer container) + { + string remainingPath; + var taskHost = Helper.FindExecutable(package, Properties[PropInput].Value, out remainingPath) as TaskHost; + if (taskHost == null) + { + throw new ArgumentException("Input property did not match a valid component input.", "package"); + } + var mainPipe = taskHost.InnerObject as MainPipe; + if (mainPipe == null) + { + throw new ArgumentException("Input property did not match a valid component input.", "package"); + } + + IDTSInput input = Helper.FindComponentInput(mainPipe, remainingPath); + if (input == null) + { + throw new ArgumentException("Input property did not match a valid component input.", "package"); + } + + ReplaceInput(mainPipe, input, TestSuite.Datasets[Properties[PropDataSet].Value]); + + return null; + } + + private void ReplaceInput(MainPipe mainPipe, IDTSInput input, Dataset dataset) + { + var placeholderSource = mainPipe.ComponentMetaDataCollection.New(); + placeholderSource.ComponentClassID = typeof(SsisUnitSource).AssemblyQualifiedName; + CManagedComponentWrapper wrapper = placeholderSource.Instantiate(); + wrapper.ProvideComponentProperties(); + wrapper.SetComponentProperty("TestData", GetDataSet(dataset)); + +#if DEBUG + for (int i = 0; i < placeholderSource.OutputCollection[0].OutputColumnCollection.Count; i++) + { + System.Diagnostics.Debug.Print(placeholderSource.OutputCollection[0].OutputColumnCollection[i].Name); + } +#endif + + var path = Helper.FindPath(mainPipe, input); + mainPipe.PathCollection.RemoveObjectByID(path.ID); + path = mainPipe.PathCollection.New(); + path.AttachPathAndPropagateNotifications(placeholderSource.OutputCollection[0], input); + + // TODO: Remap IDs? - Failing downstream because of invalid column references. + // Could remap ids, or clone the output column ids from the original source - that will mean changing the source component. + } + + private string GetDataSet(Dataset dataset) + { + var result = dataset.RetrieveDataTable(); + using (var writer = new StringWriter()) + { + result.WriteXml(writer, XmlWriteMode.WriteSchema); + return writer.ToString(); + } + } + + private void InitializeProperties() + { + AddProperty(PropName, string.Empty); + AddProperty(PropDataSet, string.Empty); + AddProperty(PropInput, string.Empty); + } + } +} diff --git a/SsisUnit/Commands/ComponentOutputCommand.cs b/SsisUnit/Commands/ComponentOutputCommand.cs index 4cddd11..ccb1161 100644 --- a/SsisUnit/Commands/ComponentOutputCommand.cs +++ b/SsisUnit/Commands/ComponentOutputCommand.cs @@ -1,107 +1,107 @@ -using System; -using System.Xml; - -using Microsoft.SqlServer.Dts.Pipeline.Wrapper; -using Microsoft.SqlServer.Dts.Runtime; - -#if SQL2014 || SQL2012 || SQL2008 -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; -using IDTSOutput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSOutput100; -#elif SQL2005 -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; -using IDTSOutput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSOutput90; -#endif - -namespace SsisUnit.Commands -{ - class ComponentOutputCommand : CommandBase - { - private const string PropName = "name"; - private const string PropDataSet = "dataset"; - private const string PropOutput = "output"; - - #region Constructors - - public ComponentOutputCommand(SsisTestSuite testSuite) - : base(testSuite) - { - InitializeProperties(); - } - - public ComponentOutputCommand(SsisTestSuite testSuite, object parent) - : base(testSuite, parent) - { - InitializeProperties(); - } - - public ComponentOutputCommand(SsisTestSuite testSuite, string commandXml) - : base(testSuite, commandXml) - { - InitializeProperties(); - } - - public ComponentOutputCommand(SsisTestSuite testSuite, object parent, string commandXml) - : base(testSuite, parent, commandXml) - { - InitializeProperties(); - } - - public ComponentOutputCommand(SsisTestSuite testSuite, XmlNode commandXml) - : base(testSuite, commandXml) - { - InitializeProperties(); - } - - public ComponentOutputCommand(SsisTestSuite testSuite, object parent, XmlNode commandXml) - : base(testSuite, parent, commandXml) - { - InitializeProperties(); - } - - public ComponentOutputCommand(SsisTestSuite testSuite, string name, string dataset, string output) - : this(testSuite) - { - Properties[PropName] = new CommandProperty(PropName, name); - Properties[PropDataSet] = new CommandProperty(PropDataSet, dataset); - Properties[PropOutput] = new CommandProperty(PropOutput, output); - } - - #endregion - - public override object Execute(object project, Package package, DtsContainer container) - { - return Execute(package, container); - } - - public override object Execute(Package package, DtsContainer container) - { - string remainingPath; - var taskHost = Helper.FindExecutable(package, Properties[PropOutput].Value, out remainingPath) as TaskHost; - if (taskHost == null) - { - throw new ArgumentException("Output property did not match a valid component output.", "package"); - } - var mainPipe = taskHost.InnerObject as MainPipe; - if (mainPipe == null) - { - throw new ArgumentException("Output property did not match a valid component output.", "package"); - } - - IDTSOutput output = Helper.FindComponentOutput(mainPipe, remainingPath); - if (output == null) - { - throw new ArgumentException("Output property did not match a valid component output.", "package"); - } - - throw new NotImplementedException(); - // return true; - } - - private void InitializeProperties() - { - AddProperty(PropName, string.Empty); - AddProperty(PropDataSet, string.Empty); - AddProperty(PropOutput, string.Empty); - } - } -} +using System; +using System.Xml; + +using Microsoft.SqlServer.Dts.Pipeline.Wrapper; +using Microsoft.SqlServer.Dts.Runtime; + +#if SQL2017 || SQL2014 || SQL2012 || SQL2008 +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; +using IDTSOutput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSOutput100; +#elif SQL2005 +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; +using IDTSOutput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSOutput90; +#endif + +namespace SsisUnit.Commands +{ + class ComponentOutputCommand : CommandBase + { + private const string PropName = "name"; + private const string PropDataSet = "dataset"; + private const string PropOutput = "output"; + + #region Constructors + + public ComponentOutputCommand(SsisTestSuite testSuite) + : base(testSuite) + { + InitializeProperties(); + } + + public ComponentOutputCommand(SsisTestSuite testSuite, object parent) + : base(testSuite, parent) + { + InitializeProperties(); + } + + public ComponentOutputCommand(SsisTestSuite testSuite, string commandXml) + : base(testSuite, commandXml) + { + InitializeProperties(); + } + + public ComponentOutputCommand(SsisTestSuite testSuite, object parent, string commandXml) + : base(testSuite, parent, commandXml) + { + InitializeProperties(); + } + + public ComponentOutputCommand(SsisTestSuite testSuite, XmlNode commandXml) + : base(testSuite, commandXml) + { + InitializeProperties(); + } + + public ComponentOutputCommand(SsisTestSuite testSuite, object parent, XmlNode commandXml) + : base(testSuite, parent, commandXml) + { + InitializeProperties(); + } + + public ComponentOutputCommand(SsisTestSuite testSuite, string name, string dataset, string output) + : this(testSuite) + { + Properties[PropName] = new CommandProperty(PropName, name); + Properties[PropDataSet] = new CommandProperty(PropDataSet, dataset); + Properties[PropOutput] = new CommandProperty(PropOutput, output); + } + + #endregion + + public override object Execute(object project, Package package, DtsContainer container) + { + return Execute(package, container); + } + + public override object Execute(Package package, DtsContainer container) + { + string remainingPath; + var taskHost = Helper.FindExecutable(package, Properties[PropOutput].Value, out remainingPath) as TaskHost; + if (taskHost == null) + { + throw new ArgumentException("Output property did not match a valid component output.", "package"); + } + var mainPipe = taskHost.InnerObject as MainPipe; + if (mainPipe == null) + { + throw new ArgumentException("Output property did not match a valid component output.", "package"); + } + + IDTSOutput output = Helper.FindComponentOutput(mainPipe, remainingPath); + if (output == null) + { + throw new ArgumentException("Output property did not match a valid component output.", "package"); + } + + throw new NotImplementedException(); + // return true; + } + + private void InitializeProperties() + { + AddProperty(PropName, string.Empty); + AddProperty(PropDataSet, string.Empty); + AddProperty(PropOutput, string.Empty); + } + } +} diff --git a/SsisUnit/ConnectionRef.cs b/SsisUnit/ConnectionRef.cs index 911ccc1..e5383ca 100644 --- a/SsisUnit/ConnectionRef.cs +++ b/SsisUnit/ConnectionRef.cs @@ -1,166 +1,174 @@ -using System; -using System.ComponentModel; -using System.Reflection; -using System.Text; -using System.Xml; - -namespace SsisUnit -{ - public class ConnectionRef - { - private ConnectionTypeEnum _connectionType; - - public ConnectionRef(string referenceName, string connectionString, ConnectionTypeEnum connectionType) - { - ReferenceName = referenceName; - ConnectionString = connectionString; - ConnectionType = connectionType; - } - - public ConnectionRef(string referenceName, string connectionString, ConnectionTypeEnum connectionType, string invariantType) - : this(referenceName, connectionString, connectionType) - { - InvariantType = invariantType; - } - - public ConnectionRef(XmlNode connectionRef) - { - LoadFromXml(connectionRef); - } - -#if SQL2005 - [DescriptionAttribute("Connection String used by SQL Commands or the name of a ConnectionManager in the package"), - Editor("SsisUnit.Design.ConnectionStringEditor, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), - ReadOnly(false)] -#elif SQL2008 - [DescriptionAttribute("Connection String used by SQL Commands or the name of a ConnectionManager in the package"), - Editor("SsisUnit.Design.ConnectionStringEditor, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), - ReadOnly(false)] -#elif SQL2012 - [Description("Connection String used by SQL Commands or the name of a ConnectionManager in the package"), - Editor("SsisUnit.Design.ConnectionStringEditor, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), - ReadOnly(false)] -#elif SQL2014 - [Description("Connection String used by SQL Commands or the name of a ConnectionManager in the package"), - Editor("SsisUnit.Design.ConnectionStringEditor, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), - ReadOnly(false)] -#endif - - public string ConnectionString { get; set; } - - [Description("The name that a SQLCommand will use to reference this connection"), - ReadOnly(false)] - public string ReferenceName { get; set; } - - [Description("The type of the ConnectionRef\r\nConnectionString - The connection string is provided directly\r\nConnectionManager - The connection string is obtained from a ConnectionManager in the Package - Not supported currently"), - ReadOnly(false), - RefreshProperties(RefreshProperties.All)] - public ConnectionTypeEnum ConnectionType - { - get { return _connectionType; } - set - { - _connectionType = value; - - // RefreshInvariantTypeAccessiblity(); - } - } - - // Set ReadOnly(true) and un-comment the RefreshInvariantTypeAccessiblity() method in order to make the property grid behave in a more user-friendly way. -#if SQL2005 - [Description("The invariant name of the ADO.NET provider to use when ConnectionType == AdoNet."), - TypeConverter("SsisUnit.Design.ConnectionRefInvariantTypeConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), - ReadOnly(false)] -#elif SQL2008 - [Description("The invariant name of the ADO.NET provider to use when ConnectionType == AdoNet."), - TypeConverter("SsisUnit.Design.ConnectionRefInvariantTypeConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), - ReadOnly(false)] -#elif SQL2012 - [Description("The invariant name of the ADO.NET provider to use when ConnectionType == AdoNet."), - TypeConverter("SsisUnit.Design.ConnectionRefInvariantTypeConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), - ReadOnly(false)] -#elif SQL2014 - [Description("The invariant name of the ADO.NET provider to use when ConnectionType == AdoNet."), - TypeConverter("SsisUnit.Design.ConnectionRefInvariantTypeConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), - ReadOnly(false)] -#endif - public string InvariantType { get; set; } - - private static ConnectionTypeEnum ConvertConnectionTypeString(string type) - { - if (type == "ConnectionManager") - return ConnectionTypeEnum.ConnectionManager; - - if (type == "ConnectionString") - return ConnectionTypeEnum.ConnectionString; - - if (type == "AdoNet") - return ConnectionTypeEnum.AdoNet; - - throw new ArgumentException(string.Format("The provided connection type ({0}) is not recognized.", type)); - } - - public void LoadFromXml(string connectionXml) - { - XmlDocument doc = new XmlDocument(); - - XmlDocumentFragment frag = doc.CreateDocumentFragment(); - frag.InnerXml = connectionXml; - - if (frag["Connection"] == null) - { - throw new ArgumentException(string.Format("The Xml does not contain the correct type ({0}).", "Connection")); - } - LoadFromXml(frag["Connection"]); - } - - public void LoadFromXml(XmlNode connectionXml) - { - if (connectionXml.Name != "Connection") - { - throw new ArgumentException(string.Format("The Xml does not contain the correct type ({0}).", "Connection")); - } - - ConnectionString = connectionXml.Attributes != null ? connectionXml.Attributes["connection"].Value : null; - _connectionType = connectionXml.Attributes != null ? ConvertConnectionTypeString(connectionXml.Attributes["connectionType"].Value) : ConnectionTypeEnum.ConnectionString; - ReferenceName = connectionXml.Attributes != null ? connectionXml.Attributes["name"].Value : null; - InvariantType = connectionXml.Attributes != null && connectionXml.Attributes["invariantType"] != null ? connectionXml.Attributes["invariantType"].Value : null; - } - - public string PersistToXml() - { - StringBuilder xml = new StringBuilder(); - xml.AppendFormat(@"", XmlHelper.EscapeAttributeValue(ReferenceName), XmlHelper.EscapeAttributeValue(ConnectionString), XmlHelper.EscapeAttributeValue(ConnectionType.ToString()), XmlHelper.EscapeAttributeValue(InvariantType)); - return xml.ToString(); - } - - public XmlElement PersistToXmlNode(XmlDocument xmlDocument) - { - XmlElement element = xmlDocument.CreateElement("Connection"); - - element.SetAttribute("name", ReferenceName); - element.SetAttribute("connection", ConnectionString); - element.SetAttribute("connectionType", ConnectionType.ToString()); - element.SetAttribute("invariantType", InvariantType); - - return element; - } - - // public void RefreshInvariantTypeAccessiblity() - // { - // PropertyDescriptor descriptor = TypeDescriptor.GetProperties(GetType())["InvariantType"]; - // ReadOnlyAttribute attribute = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)]; - // FieldInfo fieldToChange = attribute.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); - // - // if (fieldToChange != null) - // fieldToChange.SetValue(attribute, ConnectionType != ConnectionTypeEnum.AdoNet); - // } - - public enum ConnectionTypeEnum - { - ConnectionManager = 0, - ConnectionString = 1, - AdoNet = 2 - } - } +using System; +using System.ComponentModel; +using System.Reflection; +using System.Text; +using System.Xml; + +namespace SsisUnit +{ + public class ConnectionRef + { + private ConnectionTypeEnum _connectionType; + + public ConnectionRef(string referenceName, string connectionString, ConnectionTypeEnum connectionType) + { + ReferenceName = referenceName; + ConnectionString = connectionString; + ConnectionType = connectionType; + } + + public ConnectionRef(string referenceName, string connectionString, ConnectionTypeEnum connectionType, string invariantType) + : this(referenceName, connectionString, connectionType) + { + InvariantType = invariantType; + } + + public ConnectionRef(XmlNode connectionRef) + { + LoadFromXml(connectionRef); + } + +#if SQL2005 + [DescriptionAttribute("Connection String used by SQL Commands or the name of a ConnectionManager in the package"), + Editor("SsisUnit.Design.ConnectionStringEditor, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), + ReadOnly(false)] +#elif SQL2008 + [DescriptionAttribute("Connection String used by SQL Commands or the name of a ConnectionManager in the package"), + Editor("SsisUnit.Design.ConnectionStringEditor, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), + ReadOnly(false)] +#elif SQL2012 + [Description("Connection String used by SQL Commands or the name of a ConnectionManager in the package"), + Editor("SsisUnit.Design.ConnectionStringEditor, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), + ReadOnly(false)] +#elif SQL2014 + [Description("Connection String used by SQL Commands or the name of a ConnectionManager in the package"), + Editor("SsisUnit.Design.ConnectionStringEditor, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), + ReadOnly(false)] +#elif SQL2017 + [Description("Connection String used by SQL Commands or the name of a ConnectionManager in the package"), + Editor("SsisUnit.Design.ConnectionStringEditor, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), + ReadOnly(false)] +#endif + + public string ConnectionString { get; set; } + + [Description("The name that a SQLCommand will use to reference this connection"), + ReadOnly(false)] + public string ReferenceName { get; set; } + + [Description("The type of the ConnectionRef\r\nConnectionString - The connection string is provided directly\r\nConnectionManager - The connection string is obtained from a ConnectionManager in the Package - Not supported currently"), + ReadOnly(false), + RefreshProperties(RefreshProperties.All)] + public ConnectionTypeEnum ConnectionType + { + get { return _connectionType; } + set + { + _connectionType = value; + + // RefreshInvariantTypeAccessiblity(); + } + } + + // Set ReadOnly(true) and un-comment the RefreshInvariantTypeAccessiblity() method in order to make the property grid behave in a more user-friendly way. +#if SQL2005 + [Description("The invariant name of the ADO.NET provider to use when ConnectionType == AdoNet."), + TypeConverter("SsisUnit.Design.ConnectionRefInvariantTypeConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), + ReadOnly(false)] +#elif SQL2008 + [Description("The invariant name of the ADO.NET provider to use when ConnectionType == AdoNet."), + TypeConverter("SsisUnit.Design.ConnectionRefInvariantTypeConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), + ReadOnly(false)] +#elif SQL2012 + [Description("The invariant name of the ADO.NET provider to use when ConnectionType == AdoNet."), + TypeConverter("SsisUnit.Design.ConnectionRefInvariantTypeConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), + ReadOnly(false)] +#elif SQL2014 + [Description("The invariant name of the ADO.NET provider to use when ConnectionType == AdoNet."), + TypeConverter("SsisUnit.Design.ConnectionRefInvariantTypeConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), + ReadOnly(false)] +#elif SQL2017 + [Description("The invariant name of the ADO.NET provider to use when ConnectionType == AdoNet."), + TypeConverter("SsisUnit.Design.ConnectionRefInvariantTypeConverter, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), + ReadOnly(false)] +#endif + public string InvariantType { get; set; } + + private static ConnectionTypeEnum ConvertConnectionTypeString(string type) + { + if (type == "ConnectionManager") + return ConnectionTypeEnum.ConnectionManager; + + if (type == "ConnectionString") + return ConnectionTypeEnum.ConnectionString; + + if (type == "AdoNet") + return ConnectionTypeEnum.AdoNet; + + throw new ArgumentException(string.Format("The provided connection type ({0}) is not recognized.", type)); + } + + public void LoadFromXml(string connectionXml) + { + XmlDocument doc = new XmlDocument(); + + XmlDocumentFragment frag = doc.CreateDocumentFragment(); + frag.InnerXml = connectionXml; + + if (frag["Connection"] == null) + { + throw new ArgumentException(string.Format("The Xml does not contain the correct type ({0}).", "Connection")); + } + LoadFromXml(frag["Connection"]); + } + + public void LoadFromXml(XmlNode connectionXml) + { + if (connectionXml.Name != "Connection") + { + throw new ArgumentException(string.Format("The Xml does not contain the correct type ({0}).", "Connection")); + } + + ConnectionString = connectionXml.Attributes != null ? connectionXml.Attributes["connection"].Value : null; + _connectionType = connectionXml.Attributes != null ? ConvertConnectionTypeString(connectionXml.Attributes["connectionType"].Value) : ConnectionTypeEnum.ConnectionString; + ReferenceName = connectionXml.Attributes != null ? connectionXml.Attributes["name"].Value : null; + InvariantType = connectionXml.Attributes != null && connectionXml.Attributes["invariantType"] != null ? connectionXml.Attributes["invariantType"].Value : null; + } + + public string PersistToXml() + { + StringBuilder xml = new StringBuilder(); + xml.AppendFormat(@"", XmlHelper.EscapeAttributeValue(ReferenceName), XmlHelper.EscapeAttributeValue(ConnectionString), XmlHelper.EscapeAttributeValue(ConnectionType.ToString()), XmlHelper.EscapeAttributeValue(InvariantType)); + return xml.ToString(); + } + + public XmlElement PersistToXmlNode(XmlDocument xmlDocument) + { + XmlElement element = xmlDocument.CreateElement("Connection"); + + element.SetAttribute("name", ReferenceName); + element.SetAttribute("connection", ConnectionString); + element.SetAttribute("connectionType", ConnectionType.ToString()); + element.SetAttribute("invariantType", InvariantType); + + return element; + } + + // public void RefreshInvariantTypeAccessiblity() + // { + // PropertyDescriptor descriptor = TypeDescriptor.GetProperties(GetType())["InvariantType"]; + // ReadOnlyAttribute attribute = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)]; + // FieldInfo fieldToChange = attribute.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); + // + // if (fieldToChange != null) + // fieldToChange.SetValue(attribute, ConnectionType != ConnectionTypeEnum.AdoNet); + // } + + public enum ConnectionTypeEnum + { + ConnectionManager = 0, + ConnectionString = 1, + AdoNet = 2 + } + } } \ No newline at end of file diff --git a/SsisUnit/DataCompareCommand.cs b/SsisUnit/DataCompareCommand.cs index 302cf81..325dd3c 100644 --- a/SsisUnit/DataCompareCommand.cs +++ b/SsisUnit/DataCompareCommand.cs @@ -1,421 +1,427 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Globalization; -using System.Xml; - -using Microsoft.SqlServer.Dts.Runtime; - -using SsisUnitBase.Enums; -using SsisUnitBase.EventArgs; - -#if !SQL2005 -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; -#else -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; -#endif - -namespace SsisUnit -{ - using System.ComponentModel; - - public class DataCompareCommand : CommandBase - { - private const string PropName = "name"; - private const string PropExpectedDataset = "expected"; - private const string PropActualDataset = "actual"; - - private Dataset _actualDataset; - private Dataset _expectedDataset; - - public DataCompareCommand(SsisTestSuite testSuite) - : base(testSuite) - { - InitializeProperties(); - } - - public DataCompareCommand(SsisTestSuite testSuite, object parent) - : base(testSuite, parent) - { - InitializeProperties(); - } - - public DataCompareCommand(SsisTestSuite testSuite, string commandXml) - : base(testSuite, commandXml) - { - InitializeProperties(); - } - - public DataCompareCommand(SsisTestSuite testSuite, object parent, string commandXml) - : base(testSuite, parent, commandXml) - { - InitializeProperties(); - } - - public DataCompareCommand(SsisTestSuite testSuite, XmlNode commandXml) - : base(testSuite, commandXml) - { - InitializeProperties(); - - AssignPropertiesFromXmlNode(testSuite, commandXml); - } - - public DataCompareCommand(SsisTestSuite testSuite, object parent, XmlNode commandXml) - : base(testSuite, parent, commandXml) - { - InitializeProperties(); - - AssignPropertiesFromXmlNode(testSuite, commandXml); - } - - public DataCompareCommand(SsisTestSuite testSuite, string name, Dataset expectedDataset, Dataset actualDataset) - : this(testSuite) - { - Name = name; - ExpectedDataset = expectedDataset; - ActualDataset = actualDataset; - } - - public DataCompareCommand(SsisTestSuite testSuite, object parent, string name, Dataset expectedDataset, Dataset actualDataset) - : this(testSuite, parent) - { - Name = name; - ExpectedDataset = expectedDataset; - ActualDataset = actualDataset; - } - - private void AssignPropertiesFromXmlNode(SsisTestSuite testSuite, XmlNode commandXml) - { - if (commandXml == null || commandXml.Attributes == null || testSuite == null || testSuite.Datasets == null) - return; - - string actualDatasetName = commandXml.Attributes[PropActualDataset] != null ? commandXml.Attributes[PropActualDataset].Value : null; - string expectedDatasetName = commandXml.Attributes[PropExpectedDataset] != null ? commandXml.Attributes[PropExpectedDataset].Value : null; - - foreach (Dataset dataset in testSuite.Datasets.Values) - { - if (!string.IsNullOrEmpty(actualDatasetName) && string.Compare(dataset.Name, actualDatasetName, StringComparison.Ordinal) == 0) - ActualDataset = dataset; - - if (!string.IsNullOrEmpty(expectedDatasetName) && string.Compare(dataset.Name, expectedDatasetName, StringComparison.Ordinal) == 0) - ExpectedDataset = dataset; - } - } - - private void InitializeProperties() - { - if (!Properties.ContainsKey(PropName)) - Properties.Add(PropName, new CommandProperty(PropName, string.Empty)); - - if (!Properties.ContainsKey(PropExpectedDataset)) - Properties.Add(PropExpectedDataset, new CommandProperty(PropExpectedDataset, string.Empty)); - - if (!Properties.ContainsKey(PropActualDataset)) - Properties.Add(PropActualDataset, new CommandProperty(PropActualDataset, string.Empty)); - } - -#if SQL2005 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2008 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2012 - [Description("The Actual Dataset that the DataCompareCommmand will use"), - TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2014 - [Description("The Actual Dataset that the DataCompareCommmand will use"), - TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#endif - public Dataset ActualDataset - { - get - { - return _actualDataset; - } - set - { - _actualDataset = value; - - Properties[PropActualDataset].Value = value != null ? value.Name : string.Empty; - } - } - -#if SQL2005 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2008 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2012 - [Description("The Expected Dataset that the DataCompareCommand will use"), - TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2014 - [Description("The Expected Dataset that the DataCompareCommand will use"), - TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#endif - public Dataset ExpectedDataset - { - get - { - return _expectedDataset; - } - set - { - _expectedDataset = value; - - Properties[PropExpectedDataset].Value = value != null ? value.Name : string.Empty; - } - } - - public override object Execute(object project, Package package, DtsContainer container) - { - return Execute(package, container); - } - - public override object Execute(Package package, DtsContainer container) - { - if (ExpectedDataset == null) - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The expectedDataset attribute is {0}, which does not reference a valid dataset.", Properties[PropExpectedDataset].Value)); - - if (ExpectedDataset.ConnectionRef == null) - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The expected dataset's (\"{0}\") connection does not reference a valid Connection Reference.", Properties[PropExpectedDataset].Value)); - - if (string.IsNullOrEmpty(ExpectedDataset.Query)) - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The expected dataset's (\"{0}\") query is not specified.", Properties[PropExpectedDataset].Value)); - - if (ActualDataset == null) - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The actualDataset attribute is {0}, which does not reference a valid dataset.", Properties[PropActualDataset].Value)); - - if (ActualDataset.ConnectionRef == null) - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The actual dataset's (\"{0}\") connection does not reference a valid Connection Reference.", Properties[PropActualDataset].Value)); - - if (string.IsNullOrEmpty(ActualDataset.Query)) - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The actual dataset's (\"{0}\") query is not specified.", Properties[PropActualDataset].Value)); - - DbCommand expectedDbCommand = null; - DbCommand actualDbCommand = null; - - DataTable expectedDataTable; - DataTable actualDataTable; - - CommandParentType commandParentType = GetCommandParentType(); - - try - { - OnCommandStarted(new CommandStartedEventArgs(DateTime.Now, Name, null, null, commandParentType)); - - if (!ExpectedDataset.IsResultsStored) - { - expectedDbCommand = Helper.GetCommand(ExpectedDataset.ConnectionRef, ExpectedDataset.Query); - expectedDbCommand.Connection.Open(); - - using (IDataReader expectedReader = expectedDbCommand.ExecuteReader()) - { - var ds = new DataSet(); - - ds.Load(expectedReader, LoadOption.OverwriteChanges, new[] { "Results" }); - - if (ds.Tables.Count < 1) - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The expected dataset (\"{0}\") did not retrieve any data.", Properties[PropExpectedDataset].Value)); - - expectedDataTable = ds.Tables[0]; - } - } - else - { - if (ExpectedDataset.Results == null || ExpectedDataset.Results.Columns.Count < 1) - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The expected dataset's (\"{0}\") stored results does not contain data. Populate the Results data table before executing.", Properties[PropExpectedDataset].Value)); - - expectedDataTable = ExpectedDataset.Results; - } - } - catch (Exception ex) - { - OnCommandFailed(new CommandFailedEventArgs(DateTime.Now, Name, null, null, ex.Message, commandParentType)); - - throw; - } - finally - { - if (expectedDbCommand != null) - { - if (expectedDbCommand.Connection != null) - expectedDbCommand.Connection.Close(); - - expectedDbCommand.Dispose(); - } - } - - try - { - if (!ActualDataset.IsResultsStored) - { - actualDbCommand = Helper.GetCommand(ActualDataset.ConnectionRef, ActualDataset.Query); - actualDbCommand.Connection.Open(); - - using (IDataReader actualReader = actualDbCommand.ExecuteReader()) - { - var ds = new DataSet(); - - ds.Load(actualReader, LoadOption.OverwriteChanges, new[] { "Results" }); - - if (ds.Tables.Count < 1) - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The actual dataset (\"{0}\") did not retrieve any data.", Properties[PropActualDataset].Value)); - - actualDataTable = ds.Tables[0]; - } - } - else - { - if (ActualDataset.Results == null || ActualDataset.Results.Columns.Count < 1) - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The actual dataset's (\"{0}\") stored results does not contain data. Populate the Results data table before executing.", Properties[PropActualDataset].Value)); - - actualDataTable = ActualDataset.Results; - } - } - catch (Exception ex) - { - OnCommandFailed(new CommandFailedEventArgs(DateTime.Now, Name, null, null, ex.Message, commandParentType)); - - throw; - } - finally - { - if (actualDbCommand != null) - { - if (actualDbCommand.Connection != null) - actualDbCommand.Connection.Close(); - - actualDbCommand.Dispose(); - } - } - - bool isComparisonPossible = true; - var expectedDatasetMessages = new List(); - var actualDatasetMessages = new List(); - - if (expectedDataTable == null || expectedDataTable.Columns.Count < 1) - { - isComparisonPossible = false; - - expectedDatasetMessages.Add(string.Format(CultureInfo.CurrentCulture, "The expected dataset (\"{0}\") did not retrieve any data.", Properties[PropExpectedDataset].Value)); - } - else - { - expectedDataTable.AcceptChanges(); - } - - if (actualDataTable == null || actualDataTable.Columns.Count < 1) - { - isComparisonPossible = false; - - actualDatasetMessages.Add(string.Format(CultureInfo.CurrentCulture, "The actual dataset (\"{0}\") did not retrieve any data.", Properties[PropActualDataset].Value)); - } - else - { - actualDataTable.AcceptChanges(); - } - - bool isSchemasCompatible; - - if (isComparisonPossible) - { - if (expectedDataTable.Columns.Count == actualDataTable.Columns.Count) - { - isSchemasCompatible = true; - - // Compare each table's columns and ensure that they're the same datatypes at each position. - for (int columnIndex = 0; columnIndex < expectedDataTable.Columns.Count; columnIndex++) - { - if (expectedDataTable.Columns[columnIndex].DataType == actualDataTable.Columns[columnIndex].DataType) - continue; - - isSchemasCompatible = false; - - break; - } - } - else - { - isSchemasCompatible = false; - - actualDatasetMessages.Add(string.Format("The expected \"{0}\" and actual \"{1}\" datasets do not have the same columns and/or data types for each column. Ensure that both datasets return the same number of columns and that each column is the same data type.", Properties[PropExpectedDataset].Value, Properties[PropActualDataset].Value)); - } - } - else - isSchemasCompatible = false; - - var expectedDatasetErrorIndices = new Dictionary>(expectedDataTable != null ? expectedDataTable.Rows.Count : 0); - var actualDatasetErrorIndices = new Dictionary>(actualDataTable != null ? actualDataTable.Rows.Count : 0); - int rowIndex = 0; - - if (expectedDataTable != null && actualDataTable != null) - { - for (; rowIndex < expectedDataTable.Rows.Count; rowIndex++) - { - if (rowIndex < actualDataTable.Rows.Count) - { - DataRow expectedRow = expectedDataTable.Rows[rowIndex]; - DataRow actualRow = actualDataTable.Rows[rowIndex]; - - var expectedColumnsDifferent = new List(); - var actualColumnsDifferent = new List(); - - for (int columnIndex = 0; columnIndex < expectedRow.ItemArray.Length; columnIndex++) - { - if (columnIndex < actualRow.ItemArray.Length) - { - if (!Equals(expectedRow[columnIndex], actualRow[columnIndex])) - actualColumnsDifferent.Add(columnIndex); - } - else - expectedColumnsDifferent.Add(columnIndex); - } - - // If there are rows that aren't found in the actual dataset or there are additional columns in the the expected dataset. - if (expectedColumnsDifferent.Count > 0) - expectedDatasetErrorIndices.Add(rowIndex, expectedColumnsDifferent.Count >= expectedRow.ItemArray.Length ? null : expectedColumnsDifferent); - - if (actualColumnsDifferent.Count > 0) - actualDatasetErrorIndices.Add(rowIndex, actualColumnsDifferent.Count >= expectedRow.ItemArray.Length ? null : actualColumnsDifferent); - } - else - expectedDatasetErrorIndices.Add(rowIndex, null); - } - } - - if (actualDataTable != null) - { - for (; rowIndex < actualDataTable.Rows.Count; rowIndex++) - { - actualDatasetErrorIndices.Add(rowIndex, null); - } - } - - bool isResultsSame = actualDatasetErrorIndices.Count < 1 && expectedDatasetErrorIndices.Count < 1; - - var results = new DataCompareCommandResults(ExpectedDataset, ActualDataset, expectedDataTable, actualDataTable, expectedDatasetErrorIndices, actualDatasetErrorIndices, isSchemasCompatible, isResultsSame, expectedDatasetMessages, actualDatasetMessages); - - string resultMessage = isResultsSame ? - string.Format("The datasets \"{0}\" and \"{1}\" are the same.", ExpectedDataset.Name, ActualDataset.Name) - : - string.Format("{0} row{1} differ{2} between the expected \"{3}\" and actual \"{4}\" datasets.", - (expectedDatasetErrorIndices.Count + actualDatasetErrorIndices.Count).ToString("N0"), - actualDatasetErrorIndices.Count == 1 ? string.Empty : "s", - actualDatasetErrorIndices.Count == 1 ? "s" : string.Empty, - ExpectedDataset.Name, - ActualDataset.Name); - - var completedEventArgs = new DataCompareCommandCompletedEventArgs(DateTime.Now, Name, null, null, resultMessage, results, commandParentType); - - if (isResultsSame) - OnCommandCompleted(completedEventArgs); - else - OnCommandFailed(new CommandFailedEventArgs(DateTime.Now, Name, null, null, resultMessage, results, commandParentType)); - - return results; - } - } +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Globalization; +using System.Xml; + +using Microsoft.SqlServer.Dts.Runtime; + +using SsisUnitBase.Enums; +using SsisUnitBase.EventArgs; + +#if !SQL2005 +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; +#else +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; +#endif + +namespace SsisUnit +{ + using System.ComponentModel; + + public class DataCompareCommand : CommandBase + { + private const string PropName = "name"; + private const string PropExpectedDataset = "expected"; + private const string PropActualDataset = "actual"; + + private Dataset _actualDataset; + private Dataset _expectedDataset; + + public DataCompareCommand(SsisTestSuite testSuite) + : base(testSuite) + { + InitializeProperties(); + } + + public DataCompareCommand(SsisTestSuite testSuite, object parent) + : base(testSuite, parent) + { + InitializeProperties(); + } + + public DataCompareCommand(SsisTestSuite testSuite, string commandXml) + : base(testSuite, commandXml) + { + InitializeProperties(); + } + + public DataCompareCommand(SsisTestSuite testSuite, object parent, string commandXml) + : base(testSuite, parent, commandXml) + { + InitializeProperties(); + } + + public DataCompareCommand(SsisTestSuite testSuite, XmlNode commandXml) + : base(testSuite, commandXml) + { + InitializeProperties(); + + AssignPropertiesFromXmlNode(testSuite, commandXml); + } + + public DataCompareCommand(SsisTestSuite testSuite, object parent, XmlNode commandXml) + : base(testSuite, parent, commandXml) + { + InitializeProperties(); + + AssignPropertiesFromXmlNode(testSuite, commandXml); + } + + public DataCompareCommand(SsisTestSuite testSuite, string name, Dataset expectedDataset, Dataset actualDataset) + : this(testSuite) + { + Name = name; + ExpectedDataset = expectedDataset; + ActualDataset = actualDataset; + } + + public DataCompareCommand(SsisTestSuite testSuite, object parent, string name, Dataset expectedDataset, Dataset actualDataset) + : this(testSuite, parent) + { + Name = name; + ExpectedDataset = expectedDataset; + ActualDataset = actualDataset; + } + + private void AssignPropertiesFromXmlNode(SsisTestSuite testSuite, XmlNode commandXml) + { + if (commandXml == null || commandXml.Attributes == null || testSuite == null || testSuite.Datasets == null) + return; + + string actualDatasetName = commandXml.Attributes[PropActualDataset] != null ? commandXml.Attributes[PropActualDataset].Value : null; + string expectedDatasetName = commandXml.Attributes[PropExpectedDataset] != null ? commandXml.Attributes[PropExpectedDataset].Value : null; + + foreach (Dataset dataset in testSuite.Datasets.Values) + { + if (!string.IsNullOrEmpty(actualDatasetName) && string.Compare(dataset.Name, actualDatasetName, StringComparison.Ordinal) == 0) + ActualDataset = dataset; + + if (!string.IsNullOrEmpty(expectedDatasetName) && string.Compare(dataset.Name, expectedDatasetName, StringComparison.Ordinal) == 0) + ExpectedDataset = dataset; + } + } + + private void InitializeProperties() + { + if (!Properties.ContainsKey(PropName)) + Properties.Add(PropName, new CommandProperty(PropName, string.Empty)); + + if (!Properties.ContainsKey(PropExpectedDataset)) + Properties.Add(PropExpectedDataset, new CommandProperty(PropExpectedDataset, string.Empty)); + + if (!Properties.ContainsKey(PropActualDataset)) + Properties.Add(PropActualDataset, new CommandProperty(PropActualDataset, string.Empty)); + } + +#if SQL2005 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2008 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2012 + [Description("The Actual Dataset that the DataCompareCommmand will use"), + TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2014 + [Description("The Actual Dataset that the DataCompareCommmand will use"), + TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2017 + [Description("The Actual Dataset that the DataCompareCommmand will use"), + TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#endif + public Dataset ActualDataset + { + get + { + return _actualDataset; + } + set + { + _actualDataset = value; + + Properties[PropActualDataset].Value = value != null ? value.Name : string.Empty; + } + } + +#if SQL2005 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2008 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2012 + [Description("The Expected Dataset that the DataCompareCommand will use"), + TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2014 + [Description("The Expected Dataset that the DataCompareCommand will use"), + TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2017 + [Description("The Expected Dataset that the DataCompareCommand will use"), + TypeConverter("SsisUnit.Design.DatasetConverter, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#endif + public Dataset ExpectedDataset + { + get + { + return _expectedDataset; + } + set + { + _expectedDataset = value; + + Properties[PropExpectedDataset].Value = value != null ? value.Name : string.Empty; + } + } + + public override object Execute(object project, Package package, DtsContainer container) + { + return Execute(package, container); + } + + public override object Execute(Package package, DtsContainer container) + { + if (ExpectedDataset == null) + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The expectedDataset attribute is {0}, which does not reference a valid dataset.", Properties[PropExpectedDataset].Value)); + + if (ExpectedDataset.ConnectionRef == null) + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The expected dataset's (\"{0}\") connection does not reference a valid Connection Reference.", Properties[PropExpectedDataset].Value)); + + if (string.IsNullOrEmpty(ExpectedDataset.Query)) + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The expected dataset's (\"{0}\") query is not specified.", Properties[PropExpectedDataset].Value)); + + if (ActualDataset == null) + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The actualDataset attribute is {0}, which does not reference a valid dataset.", Properties[PropActualDataset].Value)); + + if (ActualDataset.ConnectionRef == null) + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The actual dataset's (\"{0}\") connection does not reference a valid Connection Reference.", Properties[PropActualDataset].Value)); + + if (string.IsNullOrEmpty(ActualDataset.Query)) + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The actual dataset's (\"{0}\") query is not specified.", Properties[PropActualDataset].Value)); + + DbCommand expectedDbCommand = null; + DbCommand actualDbCommand = null; + + DataTable expectedDataTable; + DataTable actualDataTable; + + CommandParentType commandParentType = GetCommandParentType(); + + try + { + OnCommandStarted(new CommandStartedEventArgs(DateTime.Now, Name, null, null, commandParentType)); + + if (!ExpectedDataset.IsResultsStored) + { + expectedDbCommand = Helper.GetCommand(ExpectedDataset.ConnectionRef, ExpectedDataset.Query); + expectedDbCommand.Connection.Open(); + + using (IDataReader expectedReader = expectedDbCommand.ExecuteReader()) + { + var ds = new DataSet(); + + ds.Load(expectedReader, LoadOption.OverwriteChanges, new[] { "Results" }); + + if (ds.Tables.Count < 1) + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The expected dataset (\"{0}\") did not retrieve any data.", Properties[PropExpectedDataset].Value)); + + expectedDataTable = ds.Tables[0]; + } + } + else + { + if (ExpectedDataset.Results == null || ExpectedDataset.Results.Columns.Count < 1) + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The expected dataset's (\"{0}\") stored results does not contain data. Populate the Results data table before executing.", Properties[PropExpectedDataset].Value)); + + expectedDataTable = ExpectedDataset.Results; + } + } + catch (Exception ex) + { + OnCommandFailed(new CommandFailedEventArgs(DateTime.Now, Name, null, null, ex.Message, commandParentType)); + + throw; + } + finally + { + if (expectedDbCommand != null) + { + if (expectedDbCommand.Connection != null) + expectedDbCommand.Connection.Close(); + + expectedDbCommand.Dispose(); + } + } + + try + { + if (!ActualDataset.IsResultsStored) + { + actualDbCommand = Helper.GetCommand(ActualDataset.ConnectionRef, ActualDataset.Query); + actualDbCommand.Connection.Open(); + + using (IDataReader actualReader = actualDbCommand.ExecuteReader()) + { + var ds = new DataSet(); + + ds.Load(actualReader, LoadOption.OverwriteChanges, new[] { "Results" }); + + if (ds.Tables.Count < 1) + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The actual dataset (\"{0}\") did not retrieve any data.", Properties[PropActualDataset].Value)); + + actualDataTable = ds.Tables[0]; + } + } + else + { + if (ActualDataset.Results == null || ActualDataset.Results.Columns.Count < 1) + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The actual dataset's (\"{0}\") stored results does not contain data. Populate the Results data table before executing.", Properties[PropActualDataset].Value)); + + actualDataTable = ActualDataset.Results; + } + } + catch (Exception ex) + { + OnCommandFailed(new CommandFailedEventArgs(DateTime.Now, Name, null, null, ex.Message, commandParentType)); + + throw; + } + finally + { + if (actualDbCommand != null) + { + if (actualDbCommand.Connection != null) + actualDbCommand.Connection.Close(); + + actualDbCommand.Dispose(); + } + } + + bool isComparisonPossible = true; + var expectedDatasetMessages = new List(); + var actualDatasetMessages = new List(); + + if (expectedDataTable == null || expectedDataTable.Columns.Count < 1) + { + isComparisonPossible = false; + + expectedDatasetMessages.Add(string.Format(CultureInfo.CurrentCulture, "The expected dataset (\"{0}\") did not retrieve any data.", Properties[PropExpectedDataset].Value)); + } + else + { + expectedDataTable.AcceptChanges(); + } + + if (actualDataTable == null || actualDataTable.Columns.Count < 1) + { + isComparisonPossible = false; + + actualDatasetMessages.Add(string.Format(CultureInfo.CurrentCulture, "The actual dataset (\"{0}\") did not retrieve any data.", Properties[PropActualDataset].Value)); + } + else + { + actualDataTable.AcceptChanges(); + } + + bool isSchemasCompatible; + + if (isComparisonPossible) + { + if (expectedDataTable.Columns.Count == actualDataTable.Columns.Count) + { + isSchemasCompatible = true; + + // Compare each table's columns and ensure that they're the same datatypes at each position. + for (int columnIndex = 0; columnIndex < expectedDataTable.Columns.Count; columnIndex++) + { + if (expectedDataTable.Columns[columnIndex].DataType == actualDataTable.Columns[columnIndex].DataType) + continue; + + isSchemasCompatible = false; + + break; + } + } + else + { + isSchemasCompatible = false; + + actualDatasetMessages.Add(string.Format("The expected \"{0}\" and actual \"{1}\" datasets do not have the same columns and/or data types for each column. Ensure that both datasets return the same number of columns and that each column is the same data type.", Properties[PropExpectedDataset].Value, Properties[PropActualDataset].Value)); + } + } + else + isSchemasCompatible = false; + + var expectedDatasetErrorIndices = new Dictionary>(expectedDataTable != null ? expectedDataTable.Rows.Count : 0); + var actualDatasetErrorIndices = new Dictionary>(actualDataTable != null ? actualDataTable.Rows.Count : 0); + int rowIndex = 0; + + if (expectedDataTable != null && actualDataTable != null) + { + for (; rowIndex < expectedDataTable.Rows.Count; rowIndex++) + { + if (rowIndex < actualDataTable.Rows.Count) + { + DataRow expectedRow = expectedDataTable.Rows[rowIndex]; + DataRow actualRow = actualDataTable.Rows[rowIndex]; + + var expectedColumnsDifferent = new List(); + var actualColumnsDifferent = new List(); + + for (int columnIndex = 0; columnIndex < expectedRow.ItemArray.Length; columnIndex++) + { + if (columnIndex < actualRow.ItemArray.Length) + { + if (!Equals(expectedRow[columnIndex], actualRow[columnIndex])) + actualColumnsDifferent.Add(columnIndex); + } + else + expectedColumnsDifferent.Add(columnIndex); + } + + // If there are rows that aren't found in the actual dataset or there are additional columns in the the expected dataset. + if (expectedColumnsDifferent.Count > 0) + expectedDatasetErrorIndices.Add(rowIndex, expectedColumnsDifferent.Count >= expectedRow.ItemArray.Length ? null : expectedColumnsDifferent); + + if (actualColumnsDifferent.Count > 0) + actualDatasetErrorIndices.Add(rowIndex, actualColumnsDifferent.Count >= expectedRow.ItemArray.Length ? null : actualColumnsDifferent); + } + else + expectedDatasetErrorIndices.Add(rowIndex, null); + } + } + + if (actualDataTable != null) + { + for (; rowIndex < actualDataTable.Rows.Count; rowIndex++) + { + actualDatasetErrorIndices.Add(rowIndex, null); + } + } + + bool isResultsSame = actualDatasetErrorIndices.Count < 1 && expectedDatasetErrorIndices.Count < 1; + + var results = new DataCompareCommandResults(ExpectedDataset, ActualDataset, expectedDataTable, actualDataTable, expectedDatasetErrorIndices, actualDatasetErrorIndices, isSchemasCompatible, isResultsSame, expectedDatasetMessages, actualDatasetMessages); + + string resultMessage = isResultsSame ? + string.Format("The datasets \"{0}\" and \"{1}\" are the same.", ExpectedDataset.Name, ActualDataset.Name) + : + string.Format("{0} row{1} differ{2} between the expected \"{3}\" and actual \"{4}\" datasets.", + (expectedDatasetErrorIndices.Count + actualDatasetErrorIndices.Count).ToString("N0"), + actualDatasetErrorIndices.Count == 1 ? string.Empty : "s", + actualDatasetErrorIndices.Count == 1 ? "s" : string.Empty, + ExpectedDataset.Name, + ActualDataset.Name); + + var completedEventArgs = new DataCompareCommandCompletedEventArgs(DateTime.Now, Name, null, null, resultMessage, results, commandParentType); + + if (isResultsSame) + OnCommandCompleted(completedEventArgs); + else + OnCommandFailed(new CommandFailedEventArgs(DateTime.Now, Name, null, null, resultMessage, results, commandParentType)); + + return results; + } + } } \ No newline at end of file diff --git a/SsisUnit/Dataset.cs b/SsisUnit/Dataset.cs index bc57c81..fb0e65a 100644 --- a/SsisUnit/Dataset.cs +++ b/SsisUnit/Dataset.cs @@ -1,244 +1,251 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Globalization; -using System.IO; -using System.Text; -using System.Xml; - -namespace SsisUnit -{ - public class Dataset - { - private const string DatasetElementName = "Dataset"; - private const string ResultsDataTableName = "Results"; - - public Dataset(SsisTestSuite ssisTestSuite, XmlNode datasetNode) - { - if (ssisTestSuite == null) - throw new ArgumentNullException("ssisTestSuite"); - - TestSuite = ssisTestSuite; - - LoadFromXml(datasetNode); - } - - public Dataset(SsisTestSuite ssisTestSuite, string name, ConnectionRef connectionReference, bool isResultsStored, string query) - { - if (ssisTestSuite == null) - throw new ArgumentNullException("ssisTestSuite"); - - Name = name; - ConnectionRef = connectionReference; - IsResultsStored = isResultsStored; - Query = query; - TestSuite = ssisTestSuite; - } - - public Dataset(SsisTestSuite ssisTestSuite, string name, ConnectionRef connectionReference, bool isResultsStored, string query, DataTable results) - : this(ssisTestSuite, name, connectionReference, isResultsStored, query) - { - Results = results; - } - - public void LoadFromXml(string packageXml) - { - LoadFromXml(Helper.GetXmlNodeFromString(packageXml)); - } - - private void LoadFromXml(XmlNode datasetNode) - { - if (datasetNode.Name != DatasetElementName) - throw new ArgumentException(string.Format("The Xml does not contain the correct type ({0}).", "Dataset")); - - if (datasetNode.Attributes == null) - throw new ArgumentException("The Xml does not contain any attributes."); - - Name = datasetNode.Attributes["name"].Value; - IsResultsStored = datasetNode.Attributes["isResultsStored"].Value != null && datasetNode.Attributes["isResultsStored"].Value.ToLowerInvariant() == "true"; - - string connectionReferenceName = datasetNode.Attributes["connection"] != null ? datasetNode.Attributes["connection"].Value : null; - - if (!string.IsNullOrEmpty(connectionReferenceName) && TestSuite.ConnectionList != null) - { - foreach (KeyValuePair connectionRef in TestSuite.ConnectionList) - { - if (connectionRef.Value.ReferenceName != connectionReferenceName) - continue; - - ConnectionRef = connectionRef.Value; - - break; - } - } - - if (!datasetNode.HasChildNodes) - { - Results = null; - - return; - } - - XmlNode queryNode = null; - XmlNode resultsNode = null; - - foreach (XmlNode childNode in datasetNode.ChildNodes) - { - if (childNode.Name != "results" && childNode.Name != "query") - continue; - - if (childNode.Name == "query") - queryNode = childNode; - - if (childNode.Name == "results") - resultsNode = childNode; - } - - if (resultsNode == null || !resultsNode.HasChildNodes || resultsNode.FirstChild == null || resultsNode.FirstChild.NodeType != XmlNodeType.CDATA || string.IsNullOrEmpty(resultsNode.FirstChild.InnerText)) - Results = null; - else - { - string rawDataStream = resultsNode.FirstChild.InnerText.Trim(); - - if (string.IsNullOrEmpty(rawDataStream)) - Results = null; - else - { - var deserializedDataTable = new DataTable(ResultsDataTableName); - - deserializedDataTable.ReadXml(new StringReader(rawDataStream)); - - Results = deserializedDataTable; - } - } - - if (queryNode == null || !queryNode.HasChildNodes || queryNode.FirstChild == null || queryNode.FirstChild.NodeType != XmlNodeType.CDATA || string.IsNullOrEmpty(queryNode.FirstChild.InnerText)) - Query = null; - else - { - string queryText = queryNode.FirstChild.InnerText; - - Query = string.IsNullOrEmpty(queryText) ? null : queryText; - } - } - - public string PersistToXml() - { - var xml = new StringBuilder(); - - var writerSettings = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Fragment, OmitXmlDeclaration = true }; - - using (XmlWriter xmlWriter = XmlWriter.Create(xml, writerSettings)) - { - xmlWriter.WriteStartElement(DatasetElementName); - xmlWriter.WriteAttributeString("name", Name); - xmlWriter.WriteAttributeString("connection", ConnectionRef == null ? string.Empty : ConnectionRef.ReferenceName); - xmlWriter.WriteAttributeString("isResultsStored", IsResultsStored.ToString().ToLowerInvariant()); - - if (!string.IsNullOrEmpty(Query)) - { - xmlWriter.WriteStartElement("query"); - xmlWriter.WriteCData(Query); - xmlWriter.WriteEndElement(); - } - - if (Results != null) - { - xmlWriter.WriteStartElement("results"); - - using (var stringWriter = new StringWriter()) - { - Results.WriteXml(stringWriter, XmlWriteMode.WriteSchema, true); - - xmlWriter.WriteCData(stringWriter.ToString()); - } - - xmlWriter.WriteEndElement(); - } - - xmlWriter.WriteEndElement(); - xmlWriter.Close(); - } - - return xml.ToString(); - } - -#if SQL2005 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2008 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2012 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2014 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#endif - public ConnectionRef ConnectionRef { get; set; } - - public string Name { get; set; } - - public bool IsResultsStored { get; set; } - - [Browsable(false)] - public DataTable Results { get; internal set; } - -#if SQL2005 - [Description("The SQL statement to be executed by the SQLCommand"), - Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#elif SQL2008 - [Description("The SQL statement to be executed by the SQLCommand"), - Editor("SsisUnit.Design.QueryEditor, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#elif SQL2012 - [Description("The SQL statement to be executed by the SQLCommand"), - Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#elif SQL2014 - [Description("The SQL statement to be executed by the SQLCommand"), - Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#endif - public string Query { get; set; } - - [Browsable(false)] - public SsisTestSuite TestSuite { get; private set; } - - internal DataTable RetrieveDataTable() - { - if (!IsResultsStored) - { - using (var command = Helper.GetCommand(ConnectionRef, Query)) - { - command.Connection.Open(); - using (IDataReader expectedReader = command.ExecuteReader()) - { - var ds = new DataSet(); - - ds.Load(expectedReader, LoadOption.OverwriteChanges, new[] { "Results" }); - - if (ds.Tables.Count < 1) - { - throw new ApplicationException( - string.Format( - CultureInfo.CurrentCulture, "The dataset (\"{0}\") did not retrieve any data.", Name)); - } - - return ds.Tables[0]; - } - } - } - - if (Results == null || Results.Columns.Count < 1) - { - throw new ApplicationException( - string.Format( - CultureInfo.CurrentCulture, - "The expected dataset's (\"{0}\") stored results does not contain data. Populate the Results data table before executing.", - Name)); - } - - return Results; - } - } +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Globalization; +using System.IO; +using System.Text; +using System.Xml; + +namespace SsisUnit +{ + public class Dataset + { + private const string DatasetElementName = "Dataset"; + private const string ResultsDataTableName = "Results"; + + public Dataset(SsisTestSuite ssisTestSuite, XmlNode datasetNode) + { + if (ssisTestSuite == null) + throw new ArgumentNullException("ssisTestSuite"); + + TestSuite = ssisTestSuite; + + LoadFromXml(datasetNode); + } + + public Dataset(SsisTestSuite ssisTestSuite, string name, ConnectionRef connectionReference, bool isResultsStored, string query) + { + if (ssisTestSuite == null) + throw new ArgumentNullException("ssisTestSuite"); + + Name = name; + ConnectionRef = connectionReference; + IsResultsStored = isResultsStored; + Query = query; + TestSuite = ssisTestSuite; + } + + public Dataset(SsisTestSuite ssisTestSuite, string name, ConnectionRef connectionReference, bool isResultsStored, string query, DataTable results) + : this(ssisTestSuite, name, connectionReference, isResultsStored, query) + { + Results = results; + } + + public void LoadFromXml(string packageXml) + { + LoadFromXml(Helper.GetXmlNodeFromString(packageXml)); + } + + private void LoadFromXml(XmlNode datasetNode) + { + if (datasetNode.Name != DatasetElementName) + throw new ArgumentException(string.Format("The Xml does not contain the correct type ({0}).", "Dataset")); + + if (datasetNode.Attributes == null) + throw new ArgumentException("The Xml does not contain any attributes."); + + Name = datasetNode.Attributes["name"].Value; + IsResultsStored = datasetNode.Attributes["isResultsStored"].Value != null && datasetNode.Attributes["isResultsStored"].Value.ToLowerInvariant() == "true"; + + string connectionReferenceName = datasetNode.Attributes["connection"] != null ? datasetNode.Attributes["connection"].Value : null; + + if (!string.IsNullOrEmpty(connectionReferenceName) && TestSuite.ConnectionList != null) + { + foreach (KeyValuePair connectionRef in TestSuite.ConnectionList) + { + if (connectionRef.Value.ReferenceName != connectionReferenceName) + continue; + + ConnectionRef = connectionRef.Value; + + break; + } + } + + if (!datasetNode.HasChildNodes) + { + Results = null; + + return; + } + + XmlNode queryNode = null; + XmlNode resultsNode = null; + + foreach (XmlNode childNode in datasetNode.ChildNodes) + { + if (childNode.Name != "results" && childNode.Name != "query") + continue; + + if (childNode.Name == "query") + queryNode = childNode; + + if (childNode.Name == "results") + resultsNode = childNode; + } + + if (resultsNode == null || !resultsNode.HasChildNodes || resultsNode.FirstChild == null || resultsNode.FirstChild.NodeType != XmlNodeType.CDATA || string.IsNullOrEmpty(resultsNode.FirstChild.InnerText)) + Results = null; + else + { + string rawDataStream = resultsNode.FirstChild.InnerText.Trim(); + + if (string.IsNullOrEmpty(rawDataStream)) + Results = null; + else + { + var deserializedDataTable = new DataTable(ResultsDataTableName); + + deserializedDataTable.ReadXml(new StringReader(rawDataStream)); + + Results = deserializedDataTable; + } + } + + if (queryNode == null || !queryNode.HasChildNodes || queryNode.FirstChild == null || queryNode.FirstChild.NodeType != XmlNodeType.CDATA || string.IsNullOrEmpty(queryNode.FirstChild.InnerText)) + Query = null; + else + { + string queryText = queryNode.FirstChild.InnerText; + + Query = string.IsNullOrEmpty(queryText) ? null : queryText; + } + } + + public string PersistToXml() + { + var xml = new StringBuilder(); + + var writerSettings = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Fragment, OmitXmlDeclaration = true }; + + using (XmlWriter xmlWriter = XmlWriter.Create(xml, writerSettings)) + { + xmlWriter.WriteStartElement(DatasetElementName); + xmlWriter.WriteAttributeString("name", Name); + xmlWriter.WriteAttributeString("connection", ConnectionRef == null ? string.Empty : ConnectionRef.ReferenceName); + xmlWriter.WriteAttributeString("isResultsStored", IsResultsStored.ToString().ToLowerInvariant()); + + if (!string.IsNullOrEmpty(Query)) + { + xmlWriter.WriteStartElement("query"); + xmlWriter.WriteCData(Query); + xmlWriter.WriteEndElement(); + } + + if (Results != null) + { + xmlWriter.WriteStartElement("results"); + + using (var stringWriter = new StringWriter()) + { + Results.WriteXml(stringWriter, XmlWriteMode.WriteSchema, true); + + xmlWriter.WriteCData(stringWriter.ToString()); + } + + xmlWriter.WriteEndElement(); + } + + xmlWriter.WriteEndElement(); + xmlWriter.Close(); + } + + return xml.ToString(); + } + +#if SQL2005 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2008 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2012 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2014 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2017 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#endif + public ConnectionRef ConnectionRef { get; set; } + + public string Name { get; set; } + + public bool IsResultsStored { get; set; } + + [Browsable(false)] + public DataTable Results { get; internal set; } + +#if SQL2005 + [Description("The SQL statement to be executed by the SQLCommand"), + Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2008 + [Description("The SQL statement to be executed by the SQLCommand"), + Editor("SsisUnit.Design.QueryEditor, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2012 + [Description("The SQL statement to be executed by the SQLCommand"), + Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2014 + [Description("The SQL statement to be executed by the SQLCommand"), + Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2017 + [Description("The SQL statement to be executed by the SQLCommand"), + Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + +#endif + public string Query { get; set; } + + [Browsable(false)] + public SsisTestSuite TestSuite { get; private set; } + + internal DataTable RetrieveDataTable() + { + if (!IsResultsStored) + { + using (var command = Helper.GetCommand(ConnectionRef, Query)) + { + command.Connection.Open(); + using (IDataReader expectedReader = command.ExecuteReader()) + { + var ds = new DataSet(); + + ds.Load(expectedReader, LoadOption.OverwriteChanges, new[] { "Results" }); + + if (ds.Tables.Count < 1) + { + throw new ApplicationException( + string.Format( + CultureInfo.CurrentCulture, "The dataset (\"{0}\") did not retrieve any data.", Name)); + } + + return ds.Tables[0]; + } + } + } + + if (Results == null || Results.Columns.Count < 1) + { + throw new ApplicationException( + string.Format( + CultureInfo.CurrentCulture, + "The expected dataset's (\"{0}\") stored results does not contain data. Populate the Results data table before executing.", + Name)); + } + + return Results; + } + } } \ No newline at end of file diff --git a/SsisUnit/Helper.cs b/SsisUnit/Helper.cs index c85ef9f..1966b1a 100644 --- a/SsisUnit/Helper.cs +++ b/SsisUnit/Helper.cs @@ -1,614 +1,614 @@ -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Globalization; -using System.Runtime.InteropServices; -using System.Security; -using System.Xml; -using Microsoft.SqlServer.Dts.Pipeline.Wrapper; -using Microsoft.SqlServer.Dts.Runtime; -using System.IO; - -using SsisUnit.Packages; -#if SQL2014 || SQL2012 -using System.Linq; -#endif - -#if !SQL2005 -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; -using IDTSInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInput100; -using IDTSOutput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSOutput100; -using IDTSPath = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSPath100; -#else -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; -using IDTSInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInput90; -using IDTSOutput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSOutput90; -using IDTSPath = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSPath90; -#endif - -namespace SsisUnit -{ - internal static class Helper - { - private const string FactoryOledb = "System.Data.OleDb"; - private const string FactorySql = "System.Data.SqlClient"; - private const string TagOledb = "Provider"; - private const string TagSql = "SqlClient"; - - public static XmlNode GetXmlNodeFromString(string xmlFragment) - { - if (xmlFragment == null) - throw new ArgumentNullException("xmlFragment"); - - var doc = new XmlDocument(); - - XmlDocumentFragment frag = doc.CreateDocumentFragment(); - frag.InnerXml = xmlFragment; - - return frag.ChildNodes[0]; - } - - /// - /// Locate a component in the data flow by it's path. - /// - /// The Data Flow Task to search. - /// The path to the component. - /// The component that matches the path. If no component is found, returns null. - public static IDTSComponentMetaData FindComponent(DtsContainer task, string path) - { - var taskHost = task as TaskHost; - if (taskHost == null) - { - throw new ArgumentException("Task must be a Data Flow task.", "task"); - } - - var mainPipe = taskHost.InnerObject as MainPipe; - if (mainPipe == null) - { - throw new ArgumentException("Task must be a Data Flow task.", "task"); - } - - return FindComponent(mainPipe, path); - } - - /// - /// Locate a component in the data flow by it's path. - /// - /// The Data Flow pipeline object to search. - /// The path to the component. - /// The component that matches the path. If no component is found, returns null. - public static IDTSComponentMetaData FindComponent(MainPipe mainPipe, string path) - { - if (mainPipe == null) - { - throw new ArgumentNullException("mainPipe"); - } - - foreach (IDTSComponentMetaData component in mainPipe.ComponentMetaDataCollection) - { - if (component.Name.Equals(path, StringComparison.Ordinal)) - { - return component; - } - } - - return null; - } - - /// - /// Locate an input in the data flow by it's path. - /// - /// The Data Flow pipeline object to search. - /// The path to the input. - /// The input that matches the path. If no input is found, returns null. - public static IDTSInput FindComponentInput(MainPipe mainPipe, string path) - { - if (mainPipe == null) - { - throw new ArgumentNullException("mainPipe"); - } - - var pathParts = new List(path.Split(new[] { "." }, StringSplitOptions.None)); - if (pathParts.Count != 2 || !pathParts[1].StartsWith("Inputs", StringComparison.Ordinal)) - { - throw new ArgumentException("Path was not a valid SSIS reference path.", "path"); - } - - IDTSComponentMetaData component = FindComponent(mainPipe, pathParts[0]); - string inputName = GetSubStringBetween(pathParts[1], "[", "]"); - - foreach (IDTSInput input in component.InputCollection) - { - if (input.Name.Equals(inputName, StringComparison.Ordinal)) - { - return input; - } - } - - return null; - } - - /// - /// Find an executable in a package. - /// - /// The parent sequence to search - /// The task to find. This can be a task name, a GUID, or a 2012-format RefId. - /// The task or container if found, null if it was not found. - public static DtsContainer FindExecutable(IDTSSequence parentExecutable, string taskId) - { - string remainingPath; - return FindExecutable(parentExecutable, taskId, out remainingPath); - } - - /// - /// Find an executable in a package. - /// - /// The parent sequence to search - /// The task to find. This can be a task name, a GUID, or a 2012-format RefId. - /// Outputs the remaining path. This is used with RefIds which contain data flow components. The remaining path will include the portion of the path after the data flow task. - /// The task or container if found, null if it was not found. - public static DtsContainer FindExecutable(IDTSSequence parentExecutable, string taskId, out string remainingPath) - { - if (taskId.Contains("\\") || taskId.Equals("Package", StringComparison.Ordinal)) - { - return NavigateReferencePath(parentExecutable, taskId, out remainingPath); - } - - remainingPath = string.Empty; - - DtsContainer matchingExecutable; - var parent = (DtsContainer)parentExecutable; - - if (parent.ID == taskId || parent.Name == taskId) - { - return parent; - } - - var provider = parent as EventsProvider; - - if (provider != null) - { - foreach (DtsEventHandler eh in provider.EventHandlers) - { - matchingExecutable = FindExecutable(eh, taskId, out remainingPath); - - if (matchingExecutable != null) - return matchingExecutable; - } - } - - if (parentExecutable.Executables.Contains(taskId)) - { - return (DtsContainer)parentExecutable.Executables[taskId]; - } - - foreach (Executable e in parentExecutable.Executables) - { - var sequence = e as IDTSSequence; - - if (sequence == null) - continue; - - matchingExecutable = FindExecutable(sequence, taskId, out remainingPath); - - if (matchingExecutable != null) - return matchingExecutable; - } - - return null; - } - - private static DtsContainer NavigateReferencePath(IDTSSequence parentExecutable, string taskId, out string remainingPath) - { - // This is a 2012 format path to the task / component. - var pathParts = new Queue(taskId.Split(new[] { "\\" }, StringSplitOptions.RemoveEmptyEntries)); - if (pathParts.Count == 0) - { - throw new ArgumentException( - "TaskId included a backslash (\\) but was not a valid SSIS reference path.", "taskId"); - } - - remainingPath = string.Empty; - - var currentSequence = parentExecutable; - DtsContainer currentExecutable; - - do - { - if (currentSequence == null) - { - return null; - } - - var pathPart = pathParts.Dequeue(); - if (pathPart.Equals("Package", StringComparison.Ordinal) && currentSequence is Package) - { - currentExecutable = currentSequence as DtsContainer; - continue; - } - - if (!currentSequence.Executables.Contains(pathPart)) - { - // Not found - return null; - } - - currentExecutable = currentSequence.Executables[pathPart] as DtsContainer; - currentSequence = currentExecutable as IDTSSequence; - var taskHost = currentExecutable as TaskHost; - if (taskHost != null && taskHost.InnerObject is MainPipe) - { - // This method shouldn't search past the Data Flow Task - - string fullPath = string.Empty; - - foreach (string nextPart in pathParts) - { - if (fullPath == string.Empty) - { - fullPath = nextPart; - - continue; - } - - fullPath += @"\" + nextPart; - } - - remainingPath = fullPath; - - return currentExecutable; - } - } - while (pathParts.Count > 0); - - return currentExecutable; - } - - public static Package LoadPackage(SsisTestSuite testSuite, string packageName, SecureString packagePassword) - { - object loadedProject = null; - - try - { - return LoadPackage(testSuite, packageName, packagePassword, null, out loadedProject); - } - finally - { -#if SQL2014 || SQL2012 - var project = loadedProject as Project; - - if (project != null) - project.Dispose(); -#else - loadedProject = null; -#endif - } - } - - public static Package LoadPackage(SsisTestSuite testSuite, string packageName, SecureString packagePassword, string projectPath, out object loadedProject) - { - var ssisApp = new Application(); - Package package = null; - PackageRef packageRef = null; - - loadedProject = null; - - bool isPackagePathFilePath = false; - - if (string.IsNullOrEmpty(projectPath) && packageName.Contains(".dtsx")) - { - // Assume that it is a file path. - var fileInfo = new FileInfo(Environment.ExpandEnvironmentVariables(packageName)); - - if (fileInfo.Exists) - { - isPackagePathFilePath = true; - - if (packagePassword != null) ssisApp.PackagePassword = ConvertToUnsecureString(packagePassword); - - try - { - package = ssisApp.LoadPackage(fileInfo.FullName, null); - } - catch (DtsRuntimeException) - { - isPackagePathFilePath = false; - } - } - } - - if (!isPackagePathFilePath) - { - if (testSuite.PackageList.ContainsKey(packageName)) - { - packageRef = testSuite.PackageList[packageName]; - } - else - { - foreach (PackageRef packageReference in testSuite.PackageList.Values) - { - if ((packageReference.Name != null - && string.Compare( - packageReference.Name, - packageName, - StringComparison.OrdinalIgnoreCase) == 0) - || (packageReference.PackagePath != null - && string.Compare( - packageReference.PackagePath, - packageName, - StringComparison.OrdinalIgnoreCase) == 0)) - { - packageRef = packageReference; - - break; - } - } - } - - if (packageRef == null) - { - throw new KeyNotFoundException(string.Format(CultureInfo.CurrentCulture, "{0} was not found in the test suite package references.", packageName)); - } - - package = packageRef.LoadPackage(); - -#if SQL2012 || SQL2014 - loadedProject = packageRef.Project; -#endif - } - - return package; - } - - internal static void ParseSsisProjectPath(string relativeProjectPath, out string ssisFolderName, out string ssisProjectName) - { - if (string.IsNullOrEmpty(relativeProjectPath)) - throw new ArgumentException(string.Format("The relative project path is invalid: \"{0}\")", relativeProjectPath ?? "NULL")); - - int indx = relativeProjectPath.LastIndexOf('\\'); - - if (indx < 0) - throw new ArgumentException("The relative project path is not valid. SSIS Catalog project paths must contain the folder name and project name (e.g. \\FolderName\\ProjectName)."); - - ssisFolderName = relativeProjectPath.Substring(0, indx); - ssisProjectName = relativeProjectPath.Substring(indx + 1 > relativeProjectPath.Length ? indx : indx + 1); - } - -#if SQL2014 || SQL2012 - internal static Package LoadPackageFromProject(Project loadedProject, string projectName, string packageName) - { - PackageItem packageItem = loadedProject.PackageItems.FirstOrDefault(x => string.Compare(x.StreamName, packageName, StringComparison.InvariantCultureIgnoreCase) == 0); - - if (packageItem == null) - { - throw new ArgumentException( - string.Format( - CultureInfo.CurrentCulture, - "The package \"{0}\" could not be found within project \"{1}\".", - packageName, - projectName), - "packageName"); - } - - if (packageItem.State != PackageItemState.Loaded) - packageItem.LoadPackage(null); - - Package package = packageItem.Package; - - if (package == null) - throw new Exception(string.Format("The package \"{0}\" could not be loaded from the project \"{1}\".", packageName, projectName)); - - return package; - } -#endif - - private static string GetSubStringBetween(string stringToParse, string startString, string endString) - { - int startPosition = stringToParse.IndexOf(startString, StringComparison.Ordinal) + 1; - int endPosition = stringToParse.IndexOf(endString, StringComparison.Ordinal); - return stringToParse.Substring(startPosition, endPosition - startPosition); - } - - // public static object GetPropertyValue(Package pkg, string propertyPath) - // { - // return null; - // } - // \package.variables[myvariable].Value - // \Package\Sequence Container\Script Task.Properties[Description] - public static IDTSPath FindPath(MainPipe mainPipe, IDTSInput input) - { - foreach (IDTSPath path in mainPipe.PathCollection) - { - if (path.EndPoint.ID == input.ID) - { - return path; - } - } - - return null; - } - - /// - /// Tries to return the appropriate Provider Factory based on the value passed in. Creating the - /// factory depends on having the appropriate provider invariant name. - /// Common invariant names: - /// - SQL Server = System.Data.SqlClient - /// - SQL Server CE = System.Data.SqlServerCe - /// - My SQL = MySql.Data.MySqlClient - /// - Ole DB = System.Data.OleDb - /// - ODBC = System.Data.Odbc - /// - Oracle = System.Data.OracleClient - /// - PostgreSQL = Devart.Data.PostgreSql - /// - DB2 = IBM.Data.DB2 - /// - /// Value that identifies the connection type. - /// A generic provider factory based on the provider invariant name passed in. - internal static DbProviderFactory GetFactory(string factoryInvariantName) - { - return DbProviderFactories.GetFactory(factoryInvariantName); - } - - /// - /// Tries to return the appropriate Provider Factory based on the value passed in. Creating the - /// factory depends on having the appropriate provider invariant name. - /// Common invariant names: - /// - SQL Server = System.Data.SqlClient - /// - SQL Server CE = System.Data.SqlServerCe - /// - My SQL = MySql.Data.MySqlClient - /// - Ole DB = System.Data.OleDb - /// - ODBC = System.Data.Odbc - /// - Oracle = System.Data.OracleClient - /// - PostgreSQL = Devart.Data.PostgreSql - /// - DB2 = IBM.Data.DB2 - /// - /// Value that identifies the connection type. - /// A generic provider factory based on the provider invariant name passed in. - internal static DbProviderFactory GetReservedFactory(string providerType) - { - string factoryInvariantName; - - if (providerType.Contains(TagOledb)) - { - factoryInvariantName = FactoryOledb; - } - else if (providerType.Contains(TagSql)) - { - factoryInvariantName = FactorySql; - } - else - { - throw new ArgumentException("Connection type not supported"); - } - - return DbProviderFactories.GetFactory(factoryInvariantName); - } - - internal static DbCommand GetCommand(ConnectionRef connectionRef, string commandText) - { - var dbFactory = CreateProviderFactory(connectionRef); - - DbConnection conn = dbFactory.CreateConnection(); - - if (conn == null) - return null; - - conn.ConnectionString = connectionRef.ConnectionString; - - DbCommand dbCommand = dbFactory.CreateCommand(); - - if (dbCommand == null) - return null; - - dbCommand.Connection = conn; - dbCommand.CommandText = commandText; - - return dbCommand; - } - - internal static DbProviderFactory CreateProviderFactory(ConnectionRef connectionRef) - { - DbProviderFactory dbFactory = connectionRef.ConnectionType != ConnectionRef.ConnectionTypeEnum.AdoNet - ? GetReservedFactory(connectionRef.ConnectionString) - : GetFactory(connectionRef.InvariantType); - return dbFactory; - } - - public static IDTSOutput FindComponentOutput(MainPipe mainPipe, string path) - { - if (mainPipe == null) - { - throw new ArgumentNullException("mainPipe"); - } - - var pathParts = new List(path.Split(new[] { "." }, StringSplitOptions.None)); - if (pathParts.Count != 2 || !pathParts[1].StartsWith("Outputs", StringComparison.Ordinal)) - { - throw new ArgumentException("Path was not a valid SSIS reference path.", "path"); - } - - IDTSComponentMetaData component = FindComponent(mainPipe, pathParts[0]); - string outputName = GetSubStringBetween(pathParts[1], "[", "]"); - foreach (IDTSOutput output in component.OutputCollection) - { - if (output.Name.Equals(outputName, StringComparison.Ordinal)) - { - return output; - } - } - - return null; - } - -#if SQL2005 - public static SecureString ConvertToSecureString(string password) - { - if (password == null) - throw new ArgumentNullException("password"); - - var securePassword = new SecureString(); - - foreach (var character in password) - { - securePassword.AppendChar(character); - } - - securePassword.MakeReadOnly(); - - return securePassword; - } - - public static string ConvertToUnsecureString(SecureString securePassword) - { - if (securePassword == null) - throw new ArgumentNullException("securePassword"); - - IntPtr unmanagedString = IntPtr.Zero; - try - { - unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(securePassword); - - return Marshal.PtrToStringUni(unmanagedString); - } - finally - { - Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString); - } - } -#else - public static SecureString ConvertToSecureString(this string password) - { - if (password == null) - throw new ArgumentNullException("password"); - - var securePassword = new SecureString(); - - foreach (var character in password) - { - securePassword.AppendChar(character); - } - - securePassword.MakeReadOnly(); - - return securePassword; - } - - public static string ConvertToUnsecureString(this SecureString securePassword) - { - if (securePassword == null) - throw new ArgumentNullException("securePassword"); - - IntPtr unmanagedString = IntPtr.Zero; - - try - { - unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(securePassword); - return Marshal.PtrToStringUni(unmanagedString); - } - finally - { - Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString); - } - } -#endif - } +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Security; +using System.Xml; +using Microsoft.SqlServer.Dts.Pipeline.Wrapper; +using Microsoft.SqlServer.Dts.Runtime; +using System.IO; + +using SsisUnit.Packages; +#if SQL2017 || SQL2014 || SQL2012 +using System.Linq; +#endif + +#if !SQL2005 +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; +using IDTSInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInput100; +using IDTSOutput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSOutput100; +using IDTSPath = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSPath100; +#else +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; +using IDTSInput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSInput90; +using IDTSOutput = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSOutput90; +using IDTSPath = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSPath90; +#endif + +namespace SsisUnit +{ + internal static class Helper + { + private const string FactoryOledb = "System.Data.OleDb"; + private const string FactorySql = "System.Data.SqlClient"; + private const string TagOledb = "Provider"; + private const string TagSql = "SqlClient"; + + public static XmlNode GetXmlNodeFromString(string xmlFragment) + { + if (xmlFragment == null) + throw new ArgumentNullException("xmlFragment"); + + var doc = new XmlDocument(); + + XmlDocumentFragment frag = doc.CreateDocumentFragment(); + frag.InnerXml = xmlFragment; + + return frag.ChildNodes[0]; + } + + /// + /// Locate a component in the data flow by it's path. + /// + /// The Data Flow Task to search. + /// The path to the component. + /// The component that matches the path. If no component is found, returns null. + public static IDTSComponentMetaData FindComponent(DtsContainer task, string path) + { + var taskHost = task as TaskHost; + if (taskHost == null) + { + throw new ArgumentException("Task must be a Data Flow task.", "task"); + } + + var mainPipe = taskHost.InnerObject as MainPipe; + if (mainPipe == null) + { + throw new ArgumentException("Task must be a Data Flow task.", "task"); + } + + return FindComponent(mainPipe, path); + } + + /// + /// Locate a component in the data flow by it's path. + /// + /// The Data Flow pipeline object to search. + /// The path to the component. + /// The component that matches the path. If no component is found, returns null. + public static IDTSComponentMetaData FindComponent(MainPipe mainPipe, string path) + { + if (mainPipe == null) + { + throw new ArgumentNullException("mainPipe"); + } + + foreach (IDTSComponentMetaData component in mainPipe.ComponentMetaDataCollection) + { + if (component.Name.Equals(path, StringComparison.Ordinal)) + { + return component; + } + } + + return null; + } + + /// + /// Locate an input in the data flow by it's path. + /// + /// The Data Flow pipeline object to search. + /// The path to the input. + /// The input that matches the path. If no input is found, returns null. + public static IDTSInput FindComponentInput(MainPipe mainPipe, string path) + { + if (mainPipe == null) + { + throw new ArgumentNullException("mainPipe"); + } + + var pathParts = new List(path.Split(new[] { "." }, StringSplitOptions.None)); + if (pathParts.Count != 2 || !pathParts[1].StartsWith("Inputs", StringComparison.Ordinal)) + { + throw new ArgumentException("Path was not a valid SSIS reference path.", "path"); + } + + IDTSComponentMetaData component = FindComponent(mainPipe, pathParts[0]); + string inputName = GetSubStringBetween(pathParts[1], "[", "]"); + + foreach (IDTSInput input in component.InputCollection) + { + if (input.Name.Equals(inputName, StringComparison.Ordinal)) + { + return input; + } + } + + return null; + } + + /// + /// Find an executable in a package. + /// + /// The parent sequence to search + /// The task to find. This can be a task name, a GUID, or a 2012-format RefId. + /// The task or container if found, null if it was not found. + public static DtsContainer FindExecutable(IDTSSequence parentExecutable, string taskId) + { + string remainingPath; + return FindExecutable(parentExecutable, taskId, out remainingPath); + } + + /// + /// Find an executable in a package. + /// + /// The parent sequence to search + /// The task to find. This can be a task name, a GUID, or a 2012-format RefId. + /// Outputs the remaining path. This is used with RefIds which contain data flow components. The remaining path will include the portion of the path after the data flow task. + /// The task or container if found, null if it was not found. + public static DtsContainer FindExecutable(IDTSSequence parentExecutable, string taskId, out string remainingPath) + { + if (taskId.Contains("\\") || taskId.Equals("Package", StringComparison.Ordinal)) + { + return NavigateReferencePath(parentExecutable, taskId, out remainingPath); + } + + remainingPath = string.Empty; + + DtsContainer matchingExecutable; + var parent = (DtsContainer)parentExecutable; + + if (parent.ID == taskId || parent.Name == taskId) + { + return parent; + } + + var provider = parent as EventsProvider; + + if (provider != null) + { + foreach (DtsEventHandler eh in provider.EventHandlers) + { + matchingExecutable = FindExecutable(eh, taskId, out remainingPath); + + if (matchingExecutable != null) + return matchingExecutable; + } + } + + if (parentExecutable.Executables.Contains(taskId)) + { + return (DtsContainer)parentExecutable.Executables[taskId]; + } + + foreach (Executable e in parentExecutable.Executables) + { + var sequence = e as IDTSSequence; + + if (sequence == null) + continue; + + matchingExecutable = FindExecutable(sequence, taskId, out remainingPath); + + if (matchingExecutable != null) + return matchingExecutable; + } + + return null; + } + + private static DtsContainer NavigateReferencePath(IDTSSequence parentExecutable, string taskId, out string remainingPath) + { + // This is a 2012 format path to the task / component. + var pathParts = new Queue(taskId.Split(new[] { "\\" }, StringSplitOptions.RemoveEmptyEntries)); + if (pathParts.Count == 0) + { + throw new ArgumentException( + "TaskId included a backslash (\\) but was not a valid SSIS reference path.", "taskId"); + } + + remainingPath = string.Empty; + + var currentSequence = parentExecutable; + DtsContainer currentExecutable; + + do + { + if (currentSequence == null) + { + return null; + } + + var pathPart = pathParts.Dequeue(); + if (pathPart.Equals("Package", StringComparison.Ordinal) && currentSequence is Package) + { + currentExecutable = currentSequence as DtsContainer; + continue; + } + + if (!currentSequence.Executables.Contains(pathPart)) + { + // Not found + return null; + } + + currentExecutable = currentSequence.Executables[pathPart] as DtsContainer; + currentSequence = currentExecutable as IDTSSequence; + var taskHost = currentExecutable as TaskHost; + if (taskHost != null && taskHost.InnerObject is MainPipe) + { + // This method shouldn't search past the Data Flow Task + + string fullPath = string.Empty; + + foreach (string nextPart in pathParts) + { + if (fullPath == string.Empty) + { + fullPath = nextPart; + + continue; + } + + fullPath += @"\" + nextPart; + } + + remainingPath = fullPath; + + return currentExecutable; + } + } + while (pathParts.Count > 0); + + return currentExecutable; + } + + public static Package LoadPackage(SsisTestSuite testSuite, string packageName, SecureString packagePassword) + { + object loadedProject = null; + + try + { + return LoadPackage(testSuite, packageName, packagePassword, null, out loadedProject); + } + finally + { +#if SQL2017 || SQL2014 || SQL2012 + var project = loadedProject as Project; + + if (project != null) + project.Dispose(); +#else + loadedProject = null; +#endif + } + } + + public static Package LoadPackage(SsisTestSuite testSuite, string packageName, SecureString packagePassword, string projectPath, out object loadedProject) + { + var ssisApp = new Application(); + Package package = null; + PackageRef packageRef = null; + + loadedProject = null; + + bool isPackagePathFilePath = false; + + if (string.IsNullOrEmpty(projectPath) && packageName.Contains(".dtsx")) + { + // Assume that it is a file path. + var fileInfo = new FileInfo(Environment.ExpandEnvironmentVariables(packageName)); + + if (fileInfo.Exists) + { + isPackagePathFilePath = true; + + if (packagePassword != null) ssisApp.PackagePassword = ConvertToUnsecureString(packagePassword); + + try + { + package = ssisApp.LoadPackage(fileInfo.FullName, null); + } + catch (DtsRuntimeException) + { + isPackagePathFilePath = false; + } + } + } + + if (!isPackagePathFilePath) + { + if (testSuite.PackageList.ContainsKey(packageName)) + { + packageRef = testSuite.PackageList[packageName]; + } + else + { + foreach (PackageRef packageReference in testSuite.PackageList.Values) + { + if ((packageReference.Name != null + && string.Compare( + packageReference.Name, + packageName, + StringComparison.OrdinalIgnoreCase) == 0) + || (packageReference.PackagePath != null + && string.Compare( + packageReference.PackagePath, + packageName, + StringComparison.OrdinalIgnoreCase) == 0)) + { + packageRef = packageReference; + + break; + } + } + } + + if (packageRef == null) + { + throw new KeyNotFoundException(string.Format(CultureInfo.CurrentCulture, "{0} was not found in the test suite package references.", packageName)); + } + + package = packageRef.LoadPackage(); + +#if SQL2012 || SQL2014 || SQL2017 + loadedProject = packageRef.Project; +#endif + } + + return package; + } + + internal static void ParseSsisProjectPath(string relativeProjectPath, out string ssisFolderName, out string ssisProjectName) + { + if (string.IsNullOrEmpty(relativeProjectPath)) + throw new ArgumentException(string.Format("The relative project path is invalid: \"{0}\")", relativeProjectPath ?? "NULL")); + + int indx = relativeProjectPath.LastIndexOf('\\'); + + if (indx < 0) + throw new ArgumentException("The relative project path is not valid. SSIS Catalog project paths must contain the folder name and project name (e.g. \\FolderName\\ProjectName)."); + + ssisFolderName = relativeProjectPath.Substring(0, indx); + ssisProjectName = relativeProjectPath.Substring(indx + 1 > relativeProjectPath.Length ? indx : indx + 1); + } + +#if SQL2017 || SQL2014 || SQL2012 + internal static Package LoadPackageFromProject(Project loadedProject, string projectName, string packageName) + { + PackageItem packageItem = loadedProject.PackageItems.FirstOrDefault(x => string.Compare(x.StreamName, packageName, StringComparison.InvariantCultureIgnoreCase) == 0); + + if (packageItem == null) + { + throw new ArgumentException( + string.Format( + CultureInfo.CurrentCulture, + "The package \"{0}\" could not be found within project \"{1}\".", + packageName, + projectName), + "packageName"); + } + + if (packageItem.State != PackageItemState.Loaded) + packageItem.LoadPackage(null); + + Package package = packageItem.Package; + + if (package == null) + throw new Exception(string.Format("The package \"{0}\" could not be loaded from the project \"{1}\".", packageName, projectName)); + + return package; + } +#endif + + private static string GetSubStringBetween(string stringToParse, string startString, string endString) + { + int startPosition = stringToParse.IndexOf(startString, StringComparison.Ordinal) + 1; + int endPosition = stringToParse.IndexOf(endString, StringComparison.Ordinal); + return stringToParse.Substring(startPosition, endPosition - startPosition); + } + + // public static object GetPropertyValue(Package pkg, string propertyPath) + // { + // return null; + // } + // \package.variables[myvariable].Value + // \Package\Sequence Container\Script Task.Properties[Description] + public static IDTSPath FindPath(MainPipe mainPipe, IDTSInput input) + { + foreach (IDTSPath path in mainPipe.PathCollection) + { + if (path.EndPoint.ID == input.ID) + { + return path; + } + } + + return null; + } + + /// + /// Tries to return the appropriate Provider Factory based on the value passed in. Creating the + /// factory depends on having the appropriate provider invariant name. + /// Common invariant names: + /// - SQL Server = System.Data.SqlClient + /// - SQL Server CE = System.Data.SqlServerCe + /// - My SQL = MySql.Data.MySqlClient + /// - Ole DB = System.Data.OleDb + /// - ODBC = System.Data.Odbc + /// - Oracle = System.Data.OracleClient + /// - PostgreSQL = Devart.Data.PostgreSql + /// - DB2 = IBM.Data.DB2 + /// + /// Value that identifies the connection type. + /// A generic provider factory based on the provider invariant name passed in. + internal static DbProviderFactory GetFactory(string factoryInvariantName) + { + return DbProviderFactories.GetFactory(factoryInvariantName); + } + + /// + /// Tries to return the appropriate Provider Factory based on the value passed in. Creating the + /// factory depends on having the appropriate provider invariant name. + /// Common invariant names: + /// - SQL Server = System.Data.SqlClient + /// - SQL Server CE = System.Data.SqlServerCe + /// - My SQL = MySql.Data.MySqlClient + /// - Ole DB = System.Data.OleDb + /// - ODBC = System.Data.Odbc + /// - Oracle = System.Data.OracleClient + /// - PostgreSQL = Devart.Data.PostgreSql + /// - DB2 = IBM.Data.DB2 + /// + /// Value that identifies the connection type. + /// A generic provider factory based on the provider invariant name passed in. + internal static DbProviderFactory GetReservedFactory(string providerType) + { + string factoryInvariantName; + + if (providerType.Contains(TagOledb)) + { + factoryInvariantName = FactoryOledb; + } + else if (providerType.Contains(TagSql)) + { + factoryInvariantName = FactorySql; + } + else + { + throw new ArgumentException("Connection type not supported"); + } + + return DbProviderFactories.GetFactory(factoryInvariantName); + } + + internal static DbCommand GetCommand(ConnectionRef connectionRef, string commandText) + { + var dbFactory = CreateProviderFactory(connectionRef); + + DbConnection conn = dbFactory.CreateConnection(); + + if (conn == null) + return null; + + conn.ConnectionString = connectionRef.ConnectionString; + + DbCommand dbCommand = dbFactory.CreateCommand(); + + if (dbCommand == null) + return null; + + dbCommand.Connection = conn; + dbCommand.CommandText = commandText; + + return dbCommand; + } + + internal static DbProviderFactory CreateProviderFactory(ConnectionRef connectionRef) + { + DbProviderFactory dbFactory = connectionRef.ConnectionType != ConnectionRef.ConnectionTypeEnum.AdoNet + ? GetReservedFactory(connectionRef.ConnectionString) + : GetFactory(connectionRef.InvariantType); + return dbFactory; + } + + public static IDTSOutput FindComponentOutput(MainPipe mainPipe, string path) + { + if (mainPipe == null) + { + throw new ArgumentNullException("mainPipe"); + } + + var pathParts = new List(path.Split(new[] { "." }, StringSplitOptions.None)); + if (pathParts.Count != 2 || !pathParts[1].StartsWith("Outputs", StringComparison.Ordinal)) + { + throw new ArgumentException("Path was not a valid SSIS reference path.", "path"); + } + + IDTSComponentMetaData component = FindComponent(mainPipe, pathParts[0]); + string outputName = GetSubStringBetween(pathParts[1], "[", "]"); + foreach (IDTSOutput output in component.OutputCollection) + { + if (output.Name.Equals(outputName, StringComparison.Ordinal)) + { + return output; + } + } + + return null; + } + +#if SQL2005 + public static SecureString ConvertToSecureString(string password) + { + if (password == null) + throw new ArgumentNullException("password"); + + var securePassword = new SecureString(); + + foreach (var character in password) + { + securePassword.AppendChar(character); + } + + securePassword.MakeReadOnly(); + + return securePassword; + } + + public static string ConvertToUnsecureString(SecureString securePassword) + { + if (securePassword == null) + throw new ArgumentNullException("securePassword"); + + IntPtr unmanagedString = IntPtr.Zero; + try + { + unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(securePassword); + + return Marshal.PtrToStringUni(unmanagedString); + } + finally + { + Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString); + } + } +#else + public static SecureString ConvertToSecureString(this string password) + { + if (password == null) + throw new ArgumentNullException("password"); + + var securePassword = new SecureString(); + + foreach (var character in password) + { + securePassword.AppendChar(character); + } + + securePassword.MakeReadOnly(); + + return securePassword; + } + + public static string ConvertToUnsecureString(this SecureString securePassword) + { + if (securePassword == null) + throw new ArgumentNullException("securePassword"); + + IntPtr unmanagedString = IntPtr.Zero; + + try + { + unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(securePassword); + return Marshal.PtrToStringUni(unmanagedString); + } + finally + { + Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString); + } + } +#endif + } } \ No newline at end of file diff --git a/SsisUnit/ParameterCommand.cs b/SsisUnit/ParameterCommand.cs index 8d43466..f25e6a5 100644 --- a/SsisUnit/ParameterCommand.cs +++ b/SsisUnit/ParameterCommand.cs @@ -1,188 +1,188 @@ -using System; -using System.Xml; -using Microsoft.SqlServer.Dts.Runtime; -using System.ComponentModel; - -using SsisUnit.Enums; - -using SsisUnitBase.Enums; -using SsisUnitBase.EventArgs; - -using Package = Microsoft.SqlServer.Dts.Runtime.Package; - -namespace SsisUnit -{ - public class ParameterCommand : CommandBase - { - private const string PropName = "name"; - private const string PropOperation = "operation"; - private const string PropParameterName = "parameterName"; - private const string PropParameterType = "parameterType"; - private const string PropValue = "value"; - - public ParameterCommand(SsisTestSuite testSuite) - : base(testSuite) - { - InitializeProperties(); - } - - public ParameterCommand(SsisTestSuite testSuite, object parent) - : base(testSuite, parent) - { - InitializeProperties(); - } - - public ParameterCommand(SsisTestSuite testSuite, string commandXml) - : base(testSuite, commandXml) - { - InitializeProperties(); - } - - public ParameterCommand(SsisTestSuite testSuite, object parent, string commandXml) - : base(testSuite, parent, commandXml) - { - InitializeProperties(); - } - - public ParameterCommand(SsisTestSuite testSuite, XmlNode commandXml) - : base(testSuite, commandXml) - { - InitializeProperties(); - } - - public ParameterCommand(SsisTestSuite testSuite, object parent, XmlNode commandXml) - : base(testSuite, parent, commandXml) - { - InitializeProperties(); - } - - public ParameterCommand(SsisTestSuite testSuite, string name, string parameterName, ParameterType parameterType, VariableCommand.VariableOperation operation, string value) - : this(testSuite) - { - Properties[PropOperation] = new CommandProperty(PropOperation, operation.ToString()); - Properties[PropName] = new CommandProperty(PropName, name); - Properties[PropParameterName] = new CommandProperty(PropParameterName, parameterName); - Properties[PropParameterType] = new CommandProperty(PropParameterType, parameterType.ToString()); - Properties[PropValue] = new CommandProperty(PropValue, value); - } - - public ParameterCommand(SsisTestSuite testSuite, object parent, string name, string parameterName, ParameterType parameterType, VariableCommand.VariableOperation operation, string value) - : this(testSuite, parent) - { - Properties[PropOperation] = new CommandProperty(PropOperation, operation.ToString()); - Properties[PropName] = new CommandProperty(PropName, name); - Properties[PropParameterName] = new CommandProperty(PropParameterName, parameterName); - Properties[PropParameterType] = new CommandProperty(PropParameterType, parameterType.ToString()); - Properties[PropValue] = new CommandProperty(PropValue, value); - } - - public override object Execute(Package package, DtsContainer container) - { - return Execute((object)null, package, container); - } - - public override object Execute(object project, Package package, DtsContainer container) - { -#if SQL2012 || SQL2014 - object returnValue; - - CommandParentType commandParentType = GetCommandParentType(); - - try - { - OnCommandStarted(new CommandStartedEventArgs(DateTime.Now, CommandName, null, null, commandParentType)); - - Parameter parameter; - - if (ParameterType == ParameterType.Project) - { - Project currentProject = project as Project; - - if (currentProject == null) - throw new Exception("The package's project was not loaded."); - - parameter = currentProject.Parameters[ParameterName]; - - if (parameter == null) - throw new Exception(string.Format("The project parameter {0} could not be found.", ParameterName ?? "")); - } - else - { - if (package == null) - throw new ArgumentNullException("package", "The package was not passed correctly or loaded."); - - parameter = package.Parameters[ParameterName]; - - if (parameter == null) - throw new Exception(string.Format("The package parameter {0} could not be found.", ParameterName ?? "")); - } - - if (Operation == VariableCommand.VariableOperation.Get) - returnValue = parameter.Value; - else - returnValue = parameter.Value = Convert.ChangeType(Value, parameter.DataType); - - OnCommandCompleted(new CommandCompletedEventArgs(DateTime.Now, CommandName, null, null, string.Format("The {0} command has completed.", CommandName), commandParentType)); - } - catch (Exception ex) - { - OnCommandFailed(new CommandFailedEventArgs(DateTime.Now, CommandName, null, null, ex.Message, commandParentType)); - - throw; - } - - return returnValue; -#else - return null; -#endif - } - - [Description("Determines whether to get or set the variable."), - TypeConverter(typeof(EnumConverter))] - public VariableCommand.VariableOperation Operation - { - get { return (VariableCommand.VariableOperation)Enum.Parse(typeof(VariableCommand.VariableOperation), Properties[PropOperation].Value, true); } - set { Properties[PropOperation].Value = value.ToString(); } - } - - [Description("The name of the parameter to operate on. Do NOT include the namespace, ONLY specify the name of the parameter.")] - public string ParameterName - { - get { return Properties[PropParameterName].Value; } - set { Properties[PropParameterName].Value = value; } - } - - [Description("Determines whether this command interacts with a project or package parameter."), - TypeConverter(typeof(EnumConverter))] - public ParameterType ParameterType - { - get { return (ParameterType)Enum.Parse(typeof(ParameterType), Properties[PropParameterType].Value, true); } - set { Properties[PropParameterType].Value = value.ToString(); } - } - - [Description("The value to set the parameter to.")] - public string Value - { - get { return Properties[PropValue].Value; } - set { Properties[PropValue].Value = value; } - } - - private void InitializeProperties() - { - if (!Properties.ContainsKey(PropName)) - Properties.Add(PropName, new CommandProperty(PropName, string.Empty)); - - if (!Properties.ContainsKey(PropOperation)) - Properties.Add(PropOperation, new CommandProperty(PropOperation, VariableCommand.VariableOperation.Get.ToString())); - - if (!Properties.ContainsKey(PropParameterName)) - Properties.Add(PropParameterName, new CommandProperty(PropParameterName, string.Empty)); - - if (!Properties.ContainsKey(PropParameterType)) - Properties.Add(PropParameterType, new CommandProperty(PropParameterType, ParameterType.Project.ToString())); - - if (!Properties.ContainsKey(PropValue)) - Properties.Add(PropValue, new CommandProperty(PropValue, string.Empty)); - } - } +using System; +using System.Xml; +using Microsoft.SqlServer.Dts.Runtime; +using System.ComponentModel; + +using SsisUnit.Enums; + +using SsisUnitBase.Enums; +using SsisUnitBase.EventArgs; + +using Package = Microsoft.SqlServer.Dts.Runtime.Package; + +namespace SsisUnit +{ + public class ParameterCommand : CommandBase + { + private const string PropName = "name"; + private const string PropOperation = "operation"; + private const string PropParameterName = "parameterName"; + private const string PropParameterType = "parameterType"; + private const string PropValue = "value"; + + public ParameterCommand(SsisTestSuite testSuite) + : base(testSuite) + { + InitializeProperties(); + } + + public ParameterCommand(SsisTestSuite testSuite, object parent) + : base(testSuite, parent) + { + InitializeProperties(); + } + + public ParameterCommand(SsisTestSuite testSuite, string commandXml) + : base(testSuite, commandXml) + { + InitializeProperties(); + } + + public ParameterCommand(SsisTestSuite testSuite, object parent, string commandXml) + : base(testSuite, parent, commandXml) + { + InitializeProperties(); + } + + public ParameterCommand(SsisTestSuite testSuite, XmlNode commandXml) + : base(testSuite, commandXml) + { + InitializeProperties(); + } + + public ParameterCommand(SsisTestSuite testSuite, object parent, XmlNode commandXml) + : base(testSuite, parent, commandXml) + { + InitializeProperties(); + } + + public ParameterCommand(SsisTestSuite testSuite, string name, string parameterName, ParameterType parameterType, VariableCommand.VariableOperation operation, string value) + : this(testSuite) + { + Properties[PropOperation] = new CommandProperty(PropOperation, operation.ToString()); + Properties[PropName] = new CommandProperty(PropName, name); + Properties[PropParameterName] = new CommandProperty(PropParameterName, parameterName); + Properties[PropParameterType] = new CommandProperty(PropParameterType, parameterType.ToString()); + Properties[PropValue] = new CommandProperty(PropValue, value); + } + + public ParameterCommand(SsisTestSuite testSuite, object parent, string name, string parameterName, ParameterType parameterType, VariableCommand.VariableOperation operation, string value) + : this(testSuite, parent) + { + Properties[PropOperation] = new CommandProperty(PropOperation, operation.ToString()); + Properties[PropName] = new CommandProperty(PropName, name); + Properties[PropParameterName] = new CommandProperty(PropParameterName, parameterName); + Properties[PropParameterType] = new CommandProperty(PropParameterType, parameterType.ToString()); + Properties[PropValue] = new CommandProperty(PropValue, value); + } + + public override object Execute(Package package, DtsContainer container) + { + return Execute((object)null, package, container); + } + + public override object Execute(object project, Package package, DtsContainer container) + { +#if SQL2012 || SQL2014 || SQL2017 + object returnValue; + + CommandParentType commandParentType = GetCommandParentType(); + + try + { + OnCommandStarted(new CommandStartedEventArgs(DateTime.Now, CommandName, null, null, commandParentType)); + + Parameter parameter; + + if (ParameterType == ParameterType.Project) + { + Project currentProject = project as Project; + + if (currentProject == null) + throw new Exception("The package's project was not loaded."); + + parameter = currentProject.Parameters[ParameterName]; + + if (parameter == null) + throw new Exception(string.Format("The project parameter {0} could not be found.", ParameterName ?? "")); + } + else + { + if (package == null) + throw new ArgumentNullException("package", "The package was not passed correctly or loaded."); + + parameter = package.Parameters[ParameterName]; + + if (parameter == null) + throw new Exception(string.Format("The package parameter {0} could not be found.", ParameterName ?? "")); + } + + if (Operation == VariableCommand.VariableOperation.Get) + returnValue = parameter.Value; + else + returnValue = parameter.Value = Convert.ChangeType(Value, parameter.DataType); + + OnCommandCompleted(new CommandCompletedEventArgs(DateTime.Now, CommandName, null, null, string.Format("The {0} command has completed.", CommandName), commandParentType)); + } + catch (Exception ex) + { + OnCommandFailed(new CommandFailedEventArgs(DateTime.Now, CommandName, null, null, ex.Message, commandParentType)); + + throw; + } + + return returnValue; +#else + return null; +#endif + } + + [Description("Determines whether to get or set the variable."), + TypeConverter(typeof(EnumConverter))] + public VariableCommand.VariableOperation Operation + { + get { return (VariableCommand.VariableOperation)Enum.Parse(typeof(VariableCommand.VariableOperation), Properties[PropOperation].Value, true); } + set { Properties[PropOperation].Value = value.ToString(); } + } + + [Description("The name of the parameter to operate on. Do NOT include the namespace, ONLY specify the name of the parameter.")] + public string ParameterName + { + get { return Properties[PropParameterName].Value; } + set { Properties[PropParameterName].Value = value; } + } + + [Description("Determines whether this command interacts with a project or package parameter."), + TypeConverter(typeof(EnumConverter))] + public ParameterType ParameterType + { + get { return (ParameterType)Enum.Parse(typeof(ParameterType), Properties[PropParameterType].Value, true); } + set { Properties[PropParameterType].Value = value.ToString(); } + } + + [Description("The value to set the parameter to.")] + public string Value + { + get { return Properties[PropValue].Value; } + set { Properties[PropValue].Value = value; } + } + + private void InitializeProperties() + { + if (!Properties.ContainsKey(PropName)) + Properties.Add(PropName, new CommandProperty(PropName, string.Empty)); + + if (!Properties.ContainsKey(PropOperation)) + Properties.Add(PropOperation, new CommandProperty(PropOperation, VariableCommand.VariableOperation.Get.ToString())); + + if (!Properties.ContainsKey(PropParameterName)) + Properties.Add(PropParameterName, new CommandProperty(PropParameterName, string.Empty)); + + if (!Properties.ContainsKey(PropParameterType)) + Properties.Add(PropParameterType, new CommandProperty(PropParameterType, ParameterType.Project.ToString())); + + if (!Properties.ContainsKey(PropValue)) + Properties.Add(PropValue, new CommandProperty(PropValue, string.Empty)); + } + } } \ No newline at end of file diff --git a/SsisUnit/Properties/AssemblyInfo.cs b/SsisUnit/Properties/AssemblyInfo.cs index c30206d..7b0d349 100644 --- a/SsisUnit/Properties/AssemblyInfo.cs +++ b/SsisUnit/Properties/AssemblyInfo.cs @@ -1,46 +1,49 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("SsisUnit")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("AgileBI.com")] -[assembly: AssemblyProduct("SsisUnit")] -[assembly: AssemblyCopyright("Copyright © AgileBI.com 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a6a7b85f-4079-49e5-9595-b690b454c3d0")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] -[assembly: InternalsVisibleTo("UTssisUnit, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] -#if SQL2005 -[assembly: InternalsVisibleTo("SsisUnit.Design, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] -#elif SQL2008 -[assembly: InternalsVisibleTo("SsisUnit2008.Design, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] -#elif SQL2012 -[assembly: InternalsVisibleTo("SsisUnit.Design.2012, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] -#elif SQL2014 -[assembly: InternalsVisibleTo("SsisUnit.Design.2014, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SsisUnit")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("AgileBI.com")] +[assembly: AssemblyProduct("SsisUnit")] +[assembly: AssemblyCopyright("Copyright © AgileBI.com 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a6a7b85f-4079-49e5-9595-b690b454c3d0")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: InternalsVisibleTo("UTssisUnit, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] +#if SQL2005 +[assembly: InternalsVisibleTo("SsisUnit.Design, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] +#elif SQL2008 +[assembly: InternalsVisibleTo("SsisUnit2008.Design, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] +#elif SQL2012 +[assembly: InternalsVisibleTo("SsisUnit.Design.2012, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] +#elif SQL2014 +[assembly: InternalsVisibleTo("SsisUnit.Design.2014, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] +#elif SQL2017 +[assembly: InternalsVisibleTo("SsisUnit.Design.2017, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cd0c8c9049e8ae2a4e2665f34aad415e66587e19a343aeb1138671262a9f4eee33296545920a87dfd785ed54df26d766634eefd55633e11ae91b501962c69cb227f56ccd450486356ad3a8f854f8037e5a37eb3d674fff96bfc2c1d9f30d1e17570a9dc96b53e1c49da433fa381b9d00e6be0536aae4612e76400862e5127298")] + #endif \ No newline at end of file diff --git a/SsisUnit/SSISUnit.2017.csproj b/SsisUnit/SSISUnit.2017.csproj new file mode 100644 index 0000000..2087cd1 --- /dev/null +++ b/SsisUnit/SSISUnit.2017.csproj @@ -0,0 +1,203 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7} + Library + Properties + SsisUnit + SsisUnit2017 + v4.5 + 512 + SAK + SAK + SAK + SAK + true + SsisUnit.snk + + + + + 3.5 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + true + full + false + bin\Debug\ + TRACE;DEBUG;SQL2017 + prompt + 4 + AllRules.ruleset + false + x86 + + + pdbonly + true + bin\Release\ + TRACE;SQL2017 + prompt + 4 + AllRules.ruleset + false + + + + + True + + + True + + + + + + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + True + True + app.settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SsisUnit.xsd + + + True + True + ssisUnit.settings + + + + + + + + + + + Always + Designer + + + SettingsSingleFileGenerator + app1.Designer.cs + + + + SettingsSingleFileGenerator + ssisUnit.Designer.cs + + + + + + + Designer + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + {e693cce8-9edf-4117-ab7f-eb87b87e29ea} + SsisUnitBase + + + {6c8078e0-99dd-40d0-94da-e17b3fc50679} + SsisUnit.TestComponents.2017 + + + + + \ No newline at end of file diff --git a/SsisUnit/SqlCommand.cs b/SsisUnit/SqlCommand.cs index af03362..33e151f 100644 --- a/SsisUnit/SqlCommand.cs +++ b/SsisUnit/SqlCommand.cs @@ -1,251 +1,258 @@ -using System; -using System.Data.Common; -using System.Xml; -using System.Globalization; -using System.ComponentModel; - -using Microsoft.SqlServer.Dts.Runtime; - -using SsisUnitBase.Enums; -using SsisUnitBase.EventArgs; - -#if SQL2014 || SQL2012 || SQL2008 -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; -#elif SQL2005 -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; -#endif - -namespace SsisUnit -{ - public class SqlCommand : CommandBase - { - // Property constants - private const string PropConnection = "connectionRef"; - private const string PropReturnsValue = "returnsValue"; - - //private const string TagOledb = "Provider"; - //private const string TagSql = "SqlClient"; - //private const string FactoryOledb = "System.Data.OleDb"; - //private const string FactorySql = "System.Data.SqlClient"; - - public SqlCommand(SsisTestSuite testSuite) - : base(testSuite) - { - InitializeProperties(); - } - - public SqlCommand(SsisTestSuite testSuite, object parent) - : base(testSuite, parent) - { - InitializeProperties(); - } - - public SqlCommand(SsisTestSuite testSuite, XmlNode commandXml) - : base(testSuite, commandXml) - { - InitializeProperties(); - } - - public SqlCommand(SsisTestSuite testSuite, object parent, XmlNode commandXml) - : base(testSuite, parent, commandXml) - { - InitializeProperties(); - } - - public SqlCommand(SsisTestSuite testSuite, string commandXml) - : base(testSuite, commandXml) - { - InitializeProperties(); - } - - public SqlCommand(SsisTestSuite testSuite, object parent, string commandXml) - : base(testSuite, parent, commandXml) - { - InitializeProperties(); - } - - public SqlCommand(SsisTestSuite testSuite, string connectionRef, bool returnsValue, string command) - : this(testSuite) - { - Properties[PropConnection] = new CommandProperty(PropConnection, connectionRef); - Properties[PropReturnsValue] = new CommandProperty(PropReturnsValue, returnsValue.ToString().ToLower()); - Body = command; - } - - public SqlCommand(SsisTestSuite testSuite, object parent, string connectionRef, bool returnsValue, string command) - : this(testSuite, parent) - { - Properties[PropConnection] = new CommandProperty(PropConnection, connectionRef); - Properties[PropReturnsValue] = new CommandProperty(PropReturnsValue, returnsValue.ToString().ToLower()); - Body = command; - } - - public override object Execute(object project, Package package, DtsContainer container) - { - return Execute(package, container); - } - - public override object Execute(Package package, DtsContainer container) - { - if (ConnectionReference == null) - { - throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The connectionRef attribute is {0}, which does not reference a valid connection.", Properties[PropConnection].Value)); - } - - object result; - DbCommand dbCommand = null; - - CommandParentType commandParentType = GetCommandParentType(); - - try - { - OnCommandStarted(new CommandStartedEventArgs(DateTime.Now, CommandName, null, null, commandParentType)); - - dbCommand = GetCommand(ConnectionReference, SQLStatement); - - dbCommand.Connection.Open(); - - if (ReturnsValue) - result = dbCommand.ExecuteScalar(); - else - { - dbCommand.ExecuteNonQuery(); - - result = null; - } - - OnCommandCompleted(new CommandCompletedEventArgs(DateTime.Now, CommandName, null, null, string.Format(CultureInfo.CurrentCulture, "The {0} command has completed.", CommandName), commandParentType)); - } - catch (Exception ex) - { - OnCommandFailed(new CommandFailedEventArgs(DateTime.Now, CommandName, null, null, ex.Message, commandParentType)); - - throw; - } - finally - { - if (dbCommand != null) - { - dbCommand.Connection.Close(); - dbCommand.Dispose(); - } - } - - return result; - } - - private void InitializeProperties() - { - // Initialize properties to default values - if (!Properties.ContainsKey(PropConnection)) - Properties.Add(PropConnection, new CommandProperty(PropConnection, string.Empty)); - - if (!Properties.ContainsKey(PropReturnsValue)) - Properties.Add(PropReturnsValue, new CommandProperty(PropReturnsValue, false.ToString().ToLower())); - } - - private DbCommand GetCommand(ConnectionRef connectionRef, string commandText) - { - DbProviderFactory dbFactory = Helper.CreateProviderFactory(connectionRef); - - DbConnection conn = dbFactory.CreateConnection(); - - if (conn == null) - return null; - - conn.ConnectionString = connectionRef.ConnectionString; - - DbCommand dbCommand = dbFactory.CreateCommand(); - - if (dbCommand == null) - return null; - - dbCommand.Connection = conn; - dbCommand.CommandText = commandText; - - return dbCommand; - } - - ///// - ///// Tries to return the appropriate Provider Factory based on the value passed in. Creating - ///// the factory depends on having the appropriate provider name, so this method checks for - ///// common values that indicate what type of connection it is. - ///// - ///// Value that provides a hint on the connection type - ///// A generic provider factory based on the provider type passed in. - //private DbProviderFactory GetFactory(string providerType) - //{ - // string factoryInvariantName; - - // if (providerType.Contains(TagOledb)) - // { - // factoryInvariantName = FactoryOledb; - // } - // else if (providerType.Contains(TagSql)) - // { - // factoryInvariantName = FactorySql; - // } - // else - // { - // throw new ArgumentException("Connection type not supported"); - // } - - // return DbProviderFactories.GetFactory(factoryInvariantName); - //} - -#if SQL2005 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2008 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2012 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2014 - [Description("The Connection that the SQLCommand will use"), - TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#endif - public ConnectionRef ConnectionReference - { - get - { - return TestSuite.ConnectionList.ContainsKey(Properties[PropConnection].Value) ? TestSuite.ConnectionList[Properties[PropConnection].Value] : null; - } - - set - { - Properties[PropConnection].Value = value == null ? string.Empty : value.ReferenceName; - } - } - - [Description("Whether the SQL Statement returns a scalar value"), - DefaultValue(false)] - public bool ReturnsValue - { - get { return Properties[PropReturnsValue].Value == "true"; } - set { Properties[PropReturnsValue].Value = value.ToString().ToLower(); } - } - -#if SQL2005 - [Description("The SQL statement to be executed by the SQLCommand"), - Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#elif SQL2008 - [Description("The SQL statement to be executed by the SQLCommand"), - Editor("SsisUnit.Design.QueryEditor, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#elif SQL2012 - [Description("The SQL statement to be executed by the SQLCommand"), - Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#elif SQL2014 - [Description("The SQL statement to be executed by the SQLCommand"), - Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#endif - // ReSharper disable InconsistentNaming - public string SQLStatement - { - get { return Body; } - set { Body = value; } - } - // ReSharper restore InconsistentNaming - } +using System; +using System.Data.Common; +using System.Xml; +using System.Globalization; +using System.ComponentModel; + +using Microsoft.SqlServer.Dts.Runtime; + +using SsisUnitBase.Enums; +using SsisUnitBase.EventArgs; + +#if SQL2017 || SQL2014 || SQL2012 || SQL2008 +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; +#elif SQL2005 +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; +#endif + +namespace SsisUnit +{ + public class SqlCommand : CommandBase + { + // Property constants + private const string PropConnection = "connectionRef"; + private const string PropReturnsValue = "returnsValue"; + + //private const string TagOledb = "Provider"; + //private const string TagSql = "SqlClient"; + //private const string FactoryOledb = "System.Data.OleDb"; + //private const string FactorySql = "System.Data.SqlClient"; + + public SqlCommand(SsisTestSuite testSuite) + : base(testSuite) + { + InitializeProperties(); + } + + public SqlCommand(SsisTestSuite testSuite, object parent) + : base(testSuite, parent) + { + InitializeProperties(); + } + + public SqlCommand(SsisTestSuite testSuite, XmlNode commandXml) + : base(testSuite, commandXml) + { + InitializeProperties(); + } + + public SqlCommand(SsisTestSuite testSuite, object parent, XmlNode commandXml) + : base(testSuite, parent, commandXml) + { + InitializeProperties(); + } + + public SqlCommand(SsisTestSuite testSuite, string commandXml) + : base(testSuite, commandXml) + { + InitializeProperties(); + } + + public SqlCommand(SsisTestSuite testSuite, object parent, string commandXml) + : base(testSuite, parent, commandXml) + { + InitializeProperties(); + } + + public SqlCommand(SsisTestSuite testSuite, string connectionRef, bool returnsValue, string command) + : this(testSuite) + { + Properties[PropConnection] = new CommandProperty(PropConnection, connectionRef); + Properties[PropReturnsValue] = new CommandProperty(PropReturnsValue, returnsValue.ToString().ToLower()); + Body = command; + } + + public SqlCommand(SsisTestSuite testSuite, object parent, string connectionRef, bool returnsValue, string command) + : this(testSuite, parent) + { + Properties[PropConnection] = new CommandProperty(PropConnection, connectionRef); + Properties[PropReturnsValue] = new CommandProperty(PropReturnsValue, returnsValue.ToString().ToLower()); + Body = command; + } + + public override object Execute(object project, Package package, DtsContainer container) + { + return Execute(package, container); + } + + public override object Execute(Package package, DtsContainer container) + { + if (ConnectionReference == null) + { + throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The connectionRef attribute is {0}, which does not reference a valid connection.", Properties[PropConnection].Value)); + } + + object result; + DbCommand dbCommand = null; + + CommandParentType commandParentType = GetCommandParentType(); + + try + { + OnCommandStarted(new CommandStartedEventArgs(DateTime.Now, CommandName, null, null, commandParentType)); + + dbCommand = GetCommand(ConnectionReference, SQLStatement); + + dbCommand.Connection.Open(); + + if (ReturnsValue) + result = dbCommand.ExecuteScalar(); + else + { + dbCommand.ExecuteNonQuery(); + + result = null; + } + + OnCommandCompleted(new CommandCompletedEventArgs(DateTime.Now, CommandName, null, null, string.Format(CultureInfo.CurrentCulture, "The {0} command has completed.", CommandName), commandParentType)); + } + catch (Exception ex) + { + OnCommandFailed(new CommandFailedEventArgs(DateTime.Now, CommandName, null, null, ex.Message, commandParentType)); + + throw; + } + finally + { + if (dbCommand != null) + { + dbCommand.Connection.Close(); + dbCommand.Dispose(); + } + } + + return result; + } + + private void InitializeProperties() + { + // Initialize properties to default values + if (!Properties.ContainsKey(PropConnection)) + Properties.Add(PropConnection, new CommandProperty(PropConnection, string.Empty)); + + if (!Properties.ContainsKey(PropReturnsValue)) + Properties.Add(PropReturnsValue, new CommandProperty(PropReturnsValue, false.ToString().ToLower())); + } + + private DbCommand GetCommand(ConnectionRef connectionRef, string commandText) + { + DbProviderFactory dbFactory = Helper.CreateProviderFactory(connectionRef); + + DbConnection conn = dbFactory.CreateConnection(); + + if (conn == null) + return null; + + conn.ConnectionString = connectionRef.ConnectionString; + + DbCommand dbCommand = dbFactory.CreateCommand(); + + if (dbCommand == null) + return null; + + dbCommand.Connection = conn; + dbCommand.CommandText = commandText; + + return dbCommand; + } + + ///// + ///// Tries to return the appropriate Provider Factory based on the value passed in. Creating + ///// the factory depends on having the appropriate provider name, so this method checks for + ///// common values that indicate what type of connection it is. + ///// + ///// Value that provides a hint on the connection type + ///// A generic provider factory based on the provider type passed in. + //private DbProviderFactory GetFactory(string providerType) + //{ + // string factoryInvariantName; + + // if (providerType.Contains(TagOledb)) + // { + // factoryInvariantName = FactoryOledb; + // } + // else if (providerType.Contains(TagSql)) + // { + // factoryInvariantName = FactorySql; + // } + // else + // { + // throw new ArgumentException("Connection type not supported"); + // } + + // return DbProviderFactories.GetFactory(factoryInvariantName); + //} + +#if SQL2005 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2008 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2012 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2014 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2017 + [Description("The Connection that the SQLCommand will use"), + TypeConverter("SsisUnit.Design.ConnectionRefConverter, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] + +#endif + public ConnectionRef ConnectionReference + { + get + { + return TestSuite.ConnectionList.ContainsKey(Properties[PropConnection].Value) ? TestSuite.ConnectionList[Properties[PropConnection].Value] : null; + } + + set + { + Properties[PropConnection].Value = value == null ? string.Empty : value.ReferenceName; + } + } + + [Description("Whether the SQL Statement returns a scalar value"), + DefaultValue(false)] + public bool ReturnsValue + { + get { return Properties[PropReturnsValue].Value == "true"; } + set { Properties[PropReturnsValue].Value = value.ToString().ToLower(); } + } + +#if SQL2005 + [Description("The SQL statement to be executed by the SQLCommand"), + Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2008 + [Description("The SQL statement to be executed by the SQLCommand"), + Editor("SsisUnit.Design.QueryEditor, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2012 + [Description("The SQL statement to be executed by the SQLCommand"), + Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2014 + [Description("The SQL statement to be executed by the SQLCommand"), + Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2017 + [Description("The SQL statement to be executed by the SQLCommand"), + Editor("SsisUnit.Design.QueryEditor, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#endif + // ReSharper disable InconsistentNaming + public string SQLStatement + { + get { return Body; } + set { Body = value; } + } + // ReSharper restore InconsistentNaming + } } \ No newline at end of file diff --git a/SsisUnit/SsisTestSuite.cs b/SsisUnit/SsisTestSuite.cs index 163dc82..0e3ca60 100644 --- a/SsisUnit/SsisTestSuite.cs +++ b/SsisUnit/SsisTestSuite.cs @@ -1,780 +1,782 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Text; -using System.Xml; -using System.Xml.Schema; - -using Microsoft.SqlServer.Dts.Runtime; - -using SsisUnit.Packages; - -using SsisUnitBase; -using SsisUnitBase.Enums; -using SsisUnitBase.EventArgs; - -#if SQL2012 || SQL2014 -using System.ComponentModel.Composition; -#endif - -namespace SsisUnit -{ -#if SQL2012 || SQL2014 - [Export(typeof(ISsisTestSuite))] -#endif - public class SsisTestSuite : ISsisTestSuite, IValidate - { - private XmlDocument _testCaseDoc; - private XmlNamespaceManager _namespaceMgr; - - #region Constructors - - private SsisTestSuite(bool isLoadDefaultTest) - { - PackageList = new PackageList(); - ConnectionList = new Dictionary(); - Datasets = new Dictionary(); - Tests = new Tests(); - TestRefs = new Dictionary(); - Statistics = new TestSuiteResults(); - ValidationMessages = string.Empty; - SsisApplication = new Application(); - Parameters = new Dictionary(); - DynamicValues = new DynamicValues.DynamicValues(this); - //Variables = new Dictionary(); - - if (!isLoadDefaultTest) - { - return; - } - - Stream baseTest = GetStreamFromExecutingAssembly("BaseTest.xml"); - - InitializeTestCase(baseTest); - } - - public SsisTestSuite() - : this(true) - { - } - - public SsisTestSuite(string testCaseFile) - : this(false) - { - if (testCaseFile == null) - throw new ArgumentNullException("testCaseFile"); - - InitializeTestCase(testCaseFile); - } - - public SsisTestSuite(Stream testCase) - : this(false) - { - if (testCase == null) - throw new ArgumentNullException("testCase"); - - InitializeTestCase(testCase); - } - - #endregion - - #region Properties - - public int SsisVersion - { - get - { -#if SQL2005 - return 2005; -#elif SQL2008 - return 2008; -#elif SQL2012 - return 2012; -#elif SQL2014 - return 2014; -#endif - } - } - - public TestSuiteResults Statistics { get; private set; } - - public Dictionary ConnectionList { get; private set; } - - public Dictionary Datasets { get; private set; } - - public Tests Tests { get; private set; } - - public Dictionary TestRefs { get; private set; } - - public PackageList PackageList { get; private set; } - - public CommandSet TestSuiteSetup { get; private set; } - - public CommandSet TestSuiteTeardown { get; private set; } - - public CommandSet SetupCommands { get; private set; } - - public CommandSet TeardownCommands { get; private set; } - - internal Application SsisApplication { get; private set; } - - internal SsisTestSuite ParentTestSuite { get; private set; } - - public string ValidationMessages { get; set; } - - public DynamicValues.DynamicValues DynamicValues { get; private set; } - - public Dictionary Parameters { get; private set; } - - //public Dictionary Variables { get; private set; } - - #endregion - - #region Events - - public event EventHandler AssertCompleted; - public event EventHandler CommandCompleted; - public event EventHandler CommandFailed; - public event EventHandler CommandStarted; - public event EventHandler SetupCompleted; - public event EventHandler TeardownCompleted; - public event EventHandler TestCompleted; - public event EventHandler TestStarted; - public event EventHandler TestSuiteCompleted; - public event EventHandler TestSuiteFailed; - public event EventHandler TestSuiteStarted; - - internal virtual void OnRaiseCommandCompleted(object sender, CommandCompletedEventArgs e) - { - EventHandler handler = CommandCompleted; - - if (handler != null) - handler(sender, e); - } - - internal virtual void OnRaiseCommandFailed(object sender, CommandFailedEventArgs e) - { - EventHandler handler = CommandFailed; - - if (handler != null) - handler(sender, e); - } - - internal virtual void OnRaiseCommandStarted(object sender, CommandStartedEventArgs e) - { - EventHandler handler = CommandStarted; - - if (handler != null) - handler(sender, e); - } - - internal virtual void OnRaiseAssertCompleted(AssertCompletedEventArgs e) - { - EventHandler handler = AssertCompleted; - - // Event will be null if there are no subscribers - if (handler != null) - { - handler(this, e); - } - } - - internal virtual void OnRaiseTestCompleted(TestCompletedEventArgs e) - { - EventHandler handler = TestCompleted; - - // Event will be null if there are no subscribers - if (handler != null) - { - handler(this, e); - } - } - - internal virtual void OnRaiseTestStarted(TestStartedEventArgs e) - { - EventHandler handler = TestStarted; - - if (handler != null) - { - handler(this, e); - } - } - - internal virtual void OnRaiseTestSuiteCompleted(TestSuiteCompletedEventArgs e) - { - EventHandler handler = TestSuiteCompleted; - - // Event will be null if there are no subscribers - if (handler != null) - { - handler(this, e); - } - } - - internal virtual void OnRaiseTestSuiteFailed(TestSuiteFailedEventArgs e) - { - EventHandler handler = TestSuiteFailed; - - // Event will be null if there are no subscribers - if (handler != null) - { - handler(this, e); - } - } - - internal virtual void OnRaiseTestSuiteStarted(TestSuiteStartedEventArgs e) - { - EventHandler handler = TestSuiteStarted; - - if (handler != null) - { - handler(this, e); - } - } - - internal virtual void OnRaiseSetupCompleted(SetupCompletedEventArgs e) - { - EventHandler handler = SetupCompleted; - - // Event will be null if there are no subscribers - if (handler != null) - { - handler(this, e); - } - } - - internal virtual void OnRaiseTeardownCompleted(TeardownCompletedEventArgs e) - { - // Make a temporary copy of the event to avoid possibility of - // a race condition if the last subscriber unsubscribes - // immediately after the null check and before the event is raised. - EventHandler handler = TeardownCompleted; - - // Event will be null if there are no subscribers - if (handler != null) - { - handler(this, e); - } - } - - #endregion - - #region ISsisTestSuite Members - - public ISsisTestSuite CreateSsisTestSuite(string testSuiteFilepath) - { - return new SsisTestSuite(testSuiteFilepath); - } - - public void Setup() - { - throw new NotImplementedException(); - } - - public void Test() - { - throw new NotImplementedException(); - } - - public void Teardown() - { - throw new NotImplementedException(); - } - - #endregion - - public Context CreateContext() - { - return new Context(this); - } - - public void Save(string fileName) - { - File.WriteAllText(fileName, PersistToXml(), Encoding.UTF8); - } - - internal string PersistToXml() - { - using (StringWriter stringWriter = new StringWriter()) - { - XmlWriterSettings settings = new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8, ConformanceLevel = ConformanceLevel.Document, OmitXmlDeclaration = false, NewLineOnAttributes = false }; - - using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings)) - { - xmlWriter.WriteProcessingInstruction("xml", @"version=""1.0"" encoding=""utf-8"" "); - xmlWriter.WriteStartElement("TestSuite", "http://tempuri.org/SsisUnit.xsd"); - - xmlWriter.WriteStartElement("ConnectionList"); - - foreach (ConnectionRef conn in ConnectionList.Values) - { - xmlWriter.WriteRaw(conn.PersistToXml()); - } - - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("PackageList"); - - foreach (PackageRef pkg in PackageList.Values) - { - xmlWriter.WriteRaw(pkg.PersistToXml()); - } - - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("DatasetList"); - - foreach (Dataset dataset in Datasets.Values) - { - xmlWriter.WriteRaw(dataset.PersistToXml()); - } - - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("TestSuiteSetup"); - xmlWriter.WriteRaw(TestSuiteSetup.PersistToXml()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("Setup"); - xmlWriter.WriteRaw(SetupCommands.PersistToXml()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("Tests"); - - foreach (Test test in Tests.Values) - { - xmlWriter.WriteRaw(test.PersistToXml()); - } - - foreach (TestRef testRef in TestRefs.Values) - { - xmlWriter.WriteRaw(testRef.PersistToXml()); - } - - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("Teardown"); - xmlWriter.WriteRaw(TeardownCommands.PersistToXml()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("TestSuiteTeardown"); - xmlWriter.WriteRaw(TestSuiteTeardown.PersistToXml()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndDocument(); - - xmlWriter.Close(); - } - - return stringWriter.ToString(); - } - } - - public bool Validate() - { - try - { - Stream strm = GetStreamFromExecutingAssembly("SsisUnit.xsd"); - - using (XmlReader reader = XmlReader.Create(strm)) - { - reader.Read(); - - var settings = new XmlReaderSettings(); - settings.Schemas.Add("http://tempuri.org/SsisUnit.xsd", reader); - settings.ValidationType = ValidationType.Schema; - - var bytes = Encoding.ASCII.GetBytes(PersistToXml()); - - var test = new XmlDocument(); - test.Load(XmlReader.Create(new MemoryStream(bytes), settings)); - - return test.SchemaInfo.Validity == XmlSchemaValidity.Valid; - } - } - catch (XmlSchemaValidationException) - { - return false; - } - catch (Exception ex) - { - throw new ArgumentException("The test case could not be loaded: " + ex.Message); - } - } - - public int Execute(IDictionary parameters) - { - if (parameters != null) - { - foreach (var parameter in parameters) - { - Parameters[parameter.Key] = parameter.Value; - } - } - - return Execute(); - } - - public int Execute() - { - return Execute(CreateContext()); - } - - public int Execute(Context context) - { - if (!Validate()) - { - ValidationMessages += "The test suite does not validate."; - //throw new ApplicationException("The test suite is not in a valid format. It cannot be executed until the errors have been corrected."); - } - - if (ParentTestSuite == null) - { - Statistics.Reset(); - } - -#if !SQL2005 - DynamicValues.Apply(); -#endif - - OnRaiseTestSuiteStarted(new TestSuiteStartedEventArgs()); - - try - { - ExecuteCommandSet(TestSuiteSetup); - } - catch (Exception) - { - OnRaiseTestSuiteFailed(new TestSuiteFailedEventArgs(DateTime.Now, "The test suite setup failed.")); - - throw; - } - - foreach (Test test in Tests.Values) - { - try - { - test.TestStarted += TestStarted; - test.TestCompleted += TestCompleted; - - test.Execute(context); - } - catch (Exception ex) - { - OnRaiseTestCompleted(new TestCompletedEventArgs(DateTime.Now, test.PackageLocation, test.Task, test.Name, ex.Message, false)); - } - finally - { - test.TestCompleted -= TestCompleted; - test.TestStarted -= TestStarted; - } - } - - foreach (TestRef testRef in TestRefs.Values) - { - // TODO: Add context - testRef.Execute(); - } - - try - { - ExecuteCommandSet(TestSuiteTeardown); - } - catch (Exception) - { - OnRaiseTestSuiteFailed(new TestSuiteFailedEventArgs(DateTime.Now, "The test suite teardown failed.")); - - throw; - } - - int totalTests = Statistics.GetStatistic(StatisticEnum.TestCount); - int failedTests = Statistics.GetStatistic(StatisticEnum.TestFailedCount); - int passedTests = Statistics.GetStatistic(StatisticEnum.TestPassedCount); - - string completionMessage; - - if (failedTests < 1) - completionMessage = "The test suite has completed successfully, " + (totalTests == 1 ? "1 unit test has passed." : string.Format("{0} unit tests have passed.", totalTests.ToString("N0"))); - else - completionMessage = string.Format("The test suite has completed with {0} unit test failure{1} and {2} unit test success{3}.", failedTests.ToString("N0"), failedTests == 1 ? string.Empty : "s", passedTests.ToString("N0"), passedTests == 1 ? string.Empty : "es"); - - OnRaiseTestSuiteCompleted(new TestSuiteCompletedEventArgs(DateTime.Now, totalTests, failedTests, passedTests, completionMessage, failedTests < 1)); - - return Statistics.GetStatistic(StatisticEnum.TestCount); - } - - public void Execute(SsisTestSuite ssisTestCase) - { - ParentTestSuite = ssisTestCase; - Statistics = ssisTestCase.Statistics; - - Execute(); - } - - #region Helper Functions - - private static Stream GetStreamFromExecutingAssembly(string resourceName) - { - Assembly asm = Assembly.GetExecutingAssembly(); -#if SQL2005 - Stream resource = asm.GetManifestResourceStream(asm.GetName().Name + "." + resourceName); -#elif SQL2014 || SQL2008 || SQL2012 - Stream resource = asm.GetManifestResourceStream("SsisUnit." + resourceName); -#endif - return resource; - } - - private void InitializeTestCase(string testCaseFile) - { - _testCaseDoc = LoadTestXmlFromFile(testCaseFile); - CommonSetup(); - } - - private void CommonSetup() - { - try - { - _namespaceMgr = new XmlNamespaceManager(_testCaseDoc.NameTable); - _namespaceMgr.AddNamespace("SsisUnit", "http://tempuri.org/SsisUnit.xsd"); - - var xmlPackageReferences = _testCaseDoc.SelectNodes("SsisUnit:TestSuite/SsisUnit:PackageList/SsisUnit:Package", _namespaceMgr); - - if (xmlPackageReferences != null) - { - foreach (XmlNode pkgRef in xmlPackageReferences) - { - if (pkgRef.Attributes == null) - continue; - - PackageList.Add(pkgRef.Attributes["name"].Value, new PackageRef(pkgRef)); - } - } - - ConnectionList = _testCaseDoc.DocumentElement != null ? LoadConnectionRefs(_testCaseDoc.DocumentElement["ConnectionList"]) : new Dictionary(); - - var xmlDatasets = _testCaseDoc.SelectNodes("SsisUnit:TestSuite/SsisUnit:DatasetList/SsisUnit:Dataset", _namespaceMgr); - - if (xmlDatasets != null) - { - foreach (XmlNode xmlDataset in xmlDatasets) - { - if (xmlDataset.Attributes == null) - continue; - - Datasets.Add(xmlDataset.Attributes["name"].Value, new Dataset(this, xmlDataset)); - } - } - - TestSuiteSetup = _testCaseDoc.DocumentElement != null ? new CommandSet("Test Suite Setup", this, _testCaseDoc.DocumentElement["TestSuiteSetup"]) : new CommandSet(this); - TestSuiteTeardown = _testCaseDoc.DocumentElement != null ? new CommandSet("Test Suite Teardown", this, _testCaseDoc.DocumentElement["TestSuiteTeardown"]) : new CommandSet(this); - SetupCommands = _testCaseDoc.DocumentElement != null ? new CommandSet("Unit Test Setup", this, _testCaseDoc.DocumentElement["Setup"]) : new CommandSet(this); - TeardownCommands = _testCaseDoc.DocumentElement != null ? new CommandSet("Unit Test Teardown", this, _testCaseDoc.DocumentElement["Teardown"]) : new CommandSet(this); - - var xmlTests = _testCaseDoc.SelectNodes("SsisUnit:TestSuite/SsisUnit:Tests/SsisUnit:Test", _namespaceMgr); - - if (xmlTests != null) - { - foreach (XmlNode test in xmlTests) - { - if (test.Attributes == null) - continue; - - Test newTest = new Test(this, test); - - newTest.CommandCompleted += OnRaiseCommandCompleted; - newTest.CommandFailed += OnRaiseCommandFailed; - newTest.CommandStarted += OnRaiseCommandStarted; - - Tests.Add(test.Attributes["name"].Value, newTest); - } - } - - var xmlTestReferences = _testCaseDoc.SelectNodes("SsisUnit:TestSuite/SsisUnit:Tests/SsisUnit:TestRef", _namespaceMgr); - - if (xmlTestReferences != null) - { - foreach (XmlNode testRef in xmlTestReferences) - { - if (testRef.Attributes == null) - continue; - - TestRefs.Add(testRef.Attributes["path"].Value, new TestRef(this, testRef)); - } - } - } - catch (Exception ex) - { - throw new ApplicationException(string.Format("The unit test file is malformed or corrupt. Please verify that the file format conforms to the ssisUnit schema, provided in the SsisUnit.xsd file."), ex); - } - } - - private void ExecuteCommandSet(CommandSet commandSet) - { - if (commandSet == null) - throw new ArgumentNullException("commandSet"); - - try - { - commandSet.CommandStarted += OnRaiseCommandStarted; - commandSet.CommandCompleted += OnRaiseCommandCompleted; - commandSet.CommandFailed += OnRaiseCommandFailed; - - commandSet.Execute(); - } - finally - { - commandSet.CommandStarted -= OnRaiseCommandStarted; - commandSet.CommandCompleted -= OnRaiseCommandCompleted; - commandSet.CommandFailed -= OnRaiseCommandFailed; - } - } - - private Dictionary LoadConnectionRefs(XmlNode connections) - { - Dictionary refs = new Dictionary(connections.ChildNodes.Count); - - foreach (XmlNode conn in connections) - { - if (conn.Attributes == null) - continue; - - refs.Add(conn.Attributes["name"].Value, new ConnectionRef(conn)); - } - - return refs; - } - - private void InitializeTestCase(Stream testCase) - { - _testCaseDoc = LoadTestXmlFromStream(testCase); - - CommonSetup(); - } - - /// - /// Loads a test case from an XML file. - /// - /// The complete filename (including path) for the test case. - /// An xml document - static private XmlDocument LoadTestXmlFromFile(string fileName) - { - try - { - if (fileName == null) - { - return null; - } - - return LoadTestXmlFromStream(new StreamReader(fileName).BaseStream); - } - catch (Exception ex) - { - throw new ArgumentException("The test case could not be loaded: " + ex.Message); - } - } - - static internal XmlDocument LoadTestXmlFromStream(Stream file) - { - if (file == null) - { - return null; - } - - try - { - Stream strm = GetStreamFromExecutingAssembly("SsisUnit.xsd"); - - XmlReaderSettings settings = new XmlReaderSettings(); - settings.Schemas.Add("http://tempuri.org/SsisUnit.xsd", XmlReader.Create(strm)); - XmlDocument test = new XmlDocument(); - test.Load(XmlReader.Create(file, settings)); - - return test; - } - catch (XmlSchemaValidationException) - { - throw new XmlSchemaValidationException("The test case is not in a valid format. Please ensure that it conforms to the schema."); - } - catch (Exception ex) - { - throw new ArgumentException("The test case could not be loaded: " + ex.Message); - } - finally - { - file.Close(); - } - } - - internal void RunTestSuite(SsisTestSuite ts) - { - if (ts == null) - throw new ArgumentNullException("ts"); - - try - { - ts.CommandStarted += TestCaseCommandStarted; - ts.CommandCompleted += TestCaseCommandCompleted; - ts.CommandFailed += TestCaseCommandFailed; - ts.SetupCompleted += TestCaseSetupCompleted; - ts.TestCompleted += TestCaseTestCompleted; - ts.TeardownCompleted += TestCaseTeardownCompleted; - ts.AssertCompleted += TestCaseAssertCompleted; - - ts.Execute(this); - } - finally - { - ts.CommandStarted -= TestCaseCommandStarted; - ts.CommandCompleted -= TestCaseCommandCompleted; - ts.CommandFailed -= TestCaseCommandFailed; - ts.SetupCompleted -= TestCaseSetupCompleted; - ts.TestCompleted -= TestCaseTestCompleted; - ts.TeardownCompleted -= TestCaseTeardownCompleted; - ts.AssertCompleted -= TestCaseAssertCompleted; - } - } - - #region Event Handlers - - private void TestCaseCommandCompleted(object sender, CommandCompletedEventArgs e) - { - OnRaiseCommandCompleted(sender, e); - } - - private void TestCaseCommandFailed(object sender, CommandFailedEventArgs e) - { - OnRaiseCommandFailed(sender, e); - } - - private void TestCaseCommandStarted(object sender, CommandStartedEventArgs e) - { - OnRaiseCommandStarted(sender, e); - } - - private void TestCaseTeardownCompleted(object sender, TeardownCompletedEventArgs e) - { - OnRaiseTeardownCompleted(e); - } - - private void TestCaseTestCompleted(object sender, TestCompletedEventArgs e) - { - OnRaiseTestCompleted(e); - } - - private void TestCaseSetupCompleted(object sender, SetupCompletedEventArgs e) - { - OnRaiseSetupCompleted(e); - } - - private void TestCaseAssertCompleted(object sender, AssertCompletedEventArgs e) - { - OnRaiseAssertCompleted(e); - } - - #endregion - - #endregion - } +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using System.Xml; +using System.Xml.Schema; + +using Microsoft.SqlServer.Dts.Runtime; + +using SsisUnit.Packages; + +using SsisUnitBase; +using SsisUnitBase.Enums; +using SsisUnitBase.EventArgs; + +#if SQL2012 || SQL2014 || SQL2017 +using System.ComponentModel.Composition; +#endif + +namespace SsisUnit +{ +#if SQL2012 || SQL2014 || SQL2017 + [Export(typeof(ISsisTestSuite))] +#endif + public class SsisTestSuite : ISsisTestSuite, IValidate + { + private XmlDocument _testCaseDoc; + private XmlNamespaceManager _namespaceMgr; + + #region Constructors + + private SsisTestSuite(bool isLoadDefaultTest) + { + PackageList = new PackageList(); + ConnectionList = new Dictionary(); + Datasets = new Dictionary(); + Tests = new Tests(); + TestRefs = new Dictionary(); + Statistics = new TestSuiteResults(); + ValidationMessages = string.Empty; + SsisApplication = new Application(); + Parameters = new Dictionary(); + DynamicValues = new DynamicValues.DynamicValues(this); + //Variables = new Dictionary(); + + if (!isLoadDefaultTest) + { + return; + } + + Stream baseTest = GetStreamFromExecutingAssembly("BaseTest.xml"); + + InitializeTestCase(baseTest); + } + + public SsisTestSuite() + : this(true) + { + } + + public SsisTestSuite(string testCaseFile) + : this(false) + { + if (testCaseFile == null) + throw new ArgumentNullException("testCaseFile"); + + InitializeTestCase(testCaseFile); + } + + public SsisTestSuite(Stream testCase) + : this(false) + { + if (testCase == null) + throw new ArgumentNullException("testCase"); + + InitializeTestCase(testCase); + } + + #endregion + + #region Properties + + public int SsisVersion + { + get + { +#if SQL2005 + return 2005; +#elif SQL2008 + return 2008; +#elif SQL2012 + return 2012; +#elif SQL2014 + return 2014; +#elif SQL2017 + return 2017; +#endif + } + } + + public TestSuiteResults Statistics { get; private set; } + + public Dictionary ConnectionList { get; private set; } + + public Dictionary Datasets { get; private set; } + + public Tests Tests { get; private set; } + + public Dictionary TestRefs { get; private set; } + + public PackageList PackageList { get; private set; } + + public CommandSet TestSuiteSetup { get; private set; } + + public CommandSet TestSuiteTeardown { get; private set; } + + public CommandSet SetupCommands { get; private set; } + + public CommandSet TeardownCommands { get; private set; } + + internal Application SsisApplication { get; private set; } + + internal SsisTestSuite ParentTestSuite { get; private set; } + + public string ValidationMessages { get; set; } + + public DynamicValues.DynamicValues DynamicValues { get; private set; } + + public Dictionary Parameters { get; private set; } + + //public Dictionary Variables { get; private set; } + + #endregion + + #region Events + + public event EventHandler AssertCompleted; + public event EventHandler CommandCompleted; + public event EventHandler CommandFailed; + public event EventHandler CommandStarted; + public event EventHandler SetupCompleted; + public event EventHandler TeardownCompleted; + public event EventHandler TestCompleted; + public event EventHandler TestStarted; + public event EventHandler TestSuiteCompleted; + public event EventHandler TestSuiteFailed; + public event EventHandler TestSuiteStarted; + + internal virtual void OnRaiseCommandCompleted(object sender, CommandCompletedEventArgs e) + { + EventHandler handler = CommandCompleted; + + if (handler != null) + handler(sender, e); + } + + internal virtual void OnRaiseCommandFailed(object sender, CommandFailedEventArgs e) + { + EventHandler handler = CommandFailed; + + if (handler != null) + handler(sender, e); + } + + internal virtual void OnRaiseCommandStarted(object sender, CommandStartedEventArgs e) + { + EventHandler handler = CommandStarted; + + if (handler != null) + handler(sender, e); + } + + internal virtual void OnRaiseAssertCompleted(AssertCompletedEventArgs e) + { + EventHandler handler = AssertCompleted; + + // Event will be null if there are no subscribers + if (handler != null) + { + handler(this, e); + } + } + + internal virtual void OnRaiseTestCompleted(TestCompletedEventArgs e) + { + EventHandler handler = TestCompleted; + + // Event will be null if there are no subscribers + if (handler != null) + { + handler(this, e); + } + } + + internal virtual void OnRaiseTestStarted(TestStartedEventArgs e) + { + EventHandler handler = TestStarted; + + if (handler != null) + { + handler(this, e); + } + } + + internal virtual void OnRaiseTestSuiteCompleted(TestSuiteCompletedEventArgs e) + { + EventHandler handler = TestSuiteCompleted; + + // Event will be null if there are no subscribers + if (handler != null) + { + handler(this, e); + } + } + + internal virtual void OnRaiseTestSuiteFailed(TestSuiteFailedEventArgs e) + { + EventHandler handler = TestSuiteFailed; + + // Event will be null if there are no subscribers + if (handler != null) + { + handler(this, e); + } + } + + internal virtual void OnRaiseTestSuiteStarted(TestSuiteStartedEventArgs e) + { + EventHandler handler = TestSuiteStarted; + + if (handler != null) + { + handler(this, e); + } + } + + internal virtual void OnRaiseSetupCompleted(SetupCompletedEventArgs e) + { + EventHandler handler = SetupCompleted; + + // Event will be null if there are no subscribers + if (handler != null) + { + handler(this, e); + } + } + + internal virtual void OnRaiseTeardownCompleted(TeardownCompletedEventArgs e) + { + // Make a temporary copy of the event to avoid possibility of + // a race condition if the last subscriber unsubscribes + // immediately after the null check and before the event is raised. + EventHandler handler = TeardownCompleted; + + // Event will be null if there are no subscribers + if (handler != null) + { + handler(this, e); + } + } + + #endregion + + #region ISsisTestSuite Members + + public ISsisTestSuite CreateSsisTestSuite(string testSuiteFilepath) + { + return new SsisTestSuite(testSuiteFilepath); + } + + public void Setup() + { + throw new NotImplementedException(); + } + + public void Test() + { + throw new NotImplementedException(); + } + + public void Teardown() + { + throw new NotImplementedException(); + } + + #endregion + + public Context CreateContext() + { + return new Context(this); + } + + public void Save(string fileName) + { + File.WriteAllText(fileName, PersistToXml(), Encoding.UTF8); + } + + internal string PersistToXml() + { + using (StringWriter stringWriter = new StringWriter()) + { + XmlWriterSettings settings = new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8, ConformanceLevel = ConformanceLevel.Document, OmitXmlDeclaration = false, NewLineOnAttributes = false }; + + using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings)) + { + xmlWriter.WriteProcessingInstruction("xml", @"version=""1.0"" encoding=""utf-8"" "); + xmlWriter.WriteStartElement("TestSuite", "http://tempuri.org/SsisUnit.xsd"); + + xmlWriter.WriteStartElement("ConnectionList"); + + foreach (ConnectionRef conn in ConnectionList.Values) + { + xmlWriter.WriteRaw(conn.PersistToXml()); + } + + xmlWriter.WriteEndElement(); + + xmlWriter.WriteStartElement("PackageList"); + + foreach (PackageRef pkg in PackageList.Values) + { + xmlWriter.WriteRaw(pkg.PersistToXml()); + } + + xmlWriter.WriteEndElement(); + + xmlWriter.WriteStartElement("DatasetList"); + + foreach (Dataset dataset in Datasets.Values) + { + xmlWriter.WriteRaw(dataset.PersistToXml()); + } + + xmlWriter.WriteEndElement(); + + xmlWriter.WriteStartElement("TestSuiteSetup"); + xmlWriter.WriteRaw(TestSuiteSetup.PersistToXml()); + xmlWriter.WriteEndElement(); + + xmlWriter.WriteStartElement("Setup"); + xmlWriter.WriteRaw(SetupCommands.PersistToXml()); + xmlWriter.WriteEndElement(); + + xmlWriter.WriteStartElement("Tests"); + + foreach (Test test in Tests.Values) + { + xmlWriter.WriteRaw(test.PersistToXml()); + } + + foreach (TestRef testRef in TestRefs.Values) + { + xmlWriter.WriteRaw(testRef.PersistToXml()); + } + + xmlWriter.WriteEndElement(); + + xmlWriter.WriteStartElement("Teardown"); + xmlWriter.WriteRaw(TeardownCommands.PersistToXml()); + xmlWriter.WriteEndElement(); + + xmlWriter.WriteStartElement("TestSuiteTeardown"); + xmlWriter.WriteRaw(TestSuiteTeardown.PersistToXml()); + xmlWriter.WriteEndElement(); + + xmlWriter.WriteEndElement(); + xmlWriter.WriteEndDocument(); + + xmlWriter.Close(); + } + + return stringWriter.ToString(); + } + } + + public bool Validate() + { + try + { + Stream strm = GetStreamFromExecutingAssembly("SsisUnit.xsd"); + + using (XmlReader reader = XmlReader.Create(strm)) + { + reader.Read(); + + var settings = new XmlReaderSettings(); + settings.Schemas.Add("http://tempuri.org/SsisUnit.xsd", reader); + settings.ValidationType = ValidationType.Schema; + + var bytes = Encoding.ASCII.GetBytes(PersistToXml()); + + var test = new XmlDocument(); + test.Load(XmlReader.Create(new MemoryStream(bytes), settings)); + + return test.SchemaInfo.Validity == XmlSchemaValidity.Valid; + } + } + catch (XmlSchemaValidationException) + { + return false; + } + catch (Exception ex) + { + throw new ArgumentException("The test case could not be loaded: " + ex.Message); + } + } + + public int Execute(IDictionary parameters) + { + if (parameters != null) + { + foreach (var parameter in parameters) + { + Parameters[parameter.Key] = parameter.Value; + } + } + + return Execute(); + } + + public int Execute() + { + return Execute(CreateContext()); + } + + public int Execute(Context context) + { + if (!Validate()) + { + ValidationMessages += "The test suite does not validate."; + //throw new ApplicationException("The test suite is not in a valid format. It cannot be executed until the errors have been corrected."); + } + + if (ParentTestSuite == null) + { + Statistics.Reset(); + } + +#if !SQL2005 + DynamicValues.Apply(); +#endif + + OnRaiseTestSuiteStarted(new TestSuiteStartedEventArgs()); + + try + { + ExecuteCommandSet(TestSuiteSetup); + } + catch (Exception) + { + OnRaiseTestSuiteFailed(new TestSuiteFailedEventArgs(DateTime.Now, "The test suite setup failed.")); + + throw; + } + + foreach (Test test in Tests.Values) + { + try + { + test.TestStarted += TestStarted; + test.TestCompleted += TestCompleted; + + test.Execute(context); + } + catch (Exception ex) + { + OnRaiseTestCompleted(new TestCompletedEventArgs(DateTime.Now, test.PackageLocation, test.Task, test.Name, ex.Message, false)); + } + finally + { + test.TestCompleted -= TestCompleted; + test.TestStarted -= TestStarted; + } + } + + foreach (TestRef testRef in TestRefs.Values) + { + // TODO: Add context + testRef.Execute(); + } + + try + { + ExecuteCommandSet(TestSuiteTeardown); + } + catch (Exception) + { + OnRaiseTestSuiteFailed(new TestSuiteFailedEventArgs(DateTime.Now, "The test suite teardown failed.")); + + throw; + } + + int totalTests = Statistics.GetStatistic(StatisticEnum.TestCount); + int failedTests = Statistics.GetStatistic(StatisticEnum.TestFailedCount); + int passedTests = Statistics.GetStatistic(StatisticEnum.TestPassedCount); + + string completionMessage; + + if (failedTests < 1) + completionMessage = "The test suite has completed successfully, " + (totalTests == 1 ? "1 unit test has passed." : string.Format("{0} unit tests have passed.", totalTests.ToString("N0"))); + else + completionMessage = string.Format("The test suite has completed with {0} unit test failure{1} and {2} unit test success{3}.", failedTests.ToString("N0"), failedTests == 1 ? string.Empty : "s", passedTests.ToString("N0"), passedTests == 1 ? string.Empty : "es"); + + OnRaiseTestSuiteCompleted(new TestSuiteCompletedEventArgs(DateTime.Now, totalTests, failedTests, passedTests, completionMessage, failedTests < 1)); + + return Statistics.GetStatistic(StatisticEnum.TestCount); + } + + public void Execute(SsisTestSuite ssisTestCase) + { + ParentTestSuite = ssisTestCase; + Statistics = ssisTestCase.Statistics; + + Execute(); + } + + #region Helper Functions + + private static Stream GetStreamFromExecutingAssembly(string resourceName) + { + Assembly asm = Assembly.GetExecutingAssembly(); +#if SQL2005 + Stream resource = asm.GetManifestResourceStream(asm.GetName().Name + "." + resourceName); +#elif SQL2014 || SQL2008 || SQL2012 || SQL2017 + Stream resource = asm.GetManifestResourceStream("SsisUnit." + resourceName); +#endif + return resource; + } + + private void InitializeTestCase(string testCaseFile) + { + _testCaseDoc = LoadTestXmlFromFile(testCaseFile); + CommonSetup(); + } + + private void CommonSetup() + { + try + { + _namespaceMgr = new XmlNamespaceManager(_testCaseDoc.NameTable); + _namespaceMgr.AddNamespace("SsisUnit", "http://tempuri.org/SsisUnit.xsd"); + + var xmlPackageReferences = _testCaseDoc.SelectNodes("SsisUnit:TestSuite/SsisUnit:PackageList/SsisUnit:Package", _namespaceMgr); + + if (xmlPackageReferences != null) + { + foreach (XmlNode pkgRef in xmlPackageReferences) + { + if (pkgRef.Attributes == null) + continue; + + PackageList.Add(pkgRef.Attributes["name"].Value, new PackageRef(pkgRef)); + } + } + + ConnectionList = _testCaseDoc.DocumentElement != null ? LoadConnectionRefs(_testCaseDoc.DocumentElement["ConnectionList"]) : new Dictionary(); + + var xmlDatasets = _testCaseDoc.SelectNodes("SsisUnit:TestSuite/SsisUnit:DatasetList/SsisUnit:Dataset", _namespaceMgr); + + if (xmlDatasets != null) + { + foreach (XmlNode xmlDataset in xmlDatasets) + { + if (xmlDataset.Attributes == null) + continue; + + Datasets.Add(xmlDataset.Attributes["name"].Value, new Dataset(this, xmlDataset)); + } + } + + TestSuiteSetup = _testCaseDoc.DocumentElement != null ? new CommandSet("Test Suite Setup", this, _testCaseDoc.DocumentElement["TestSuiteSetup"]) : new CommandSet(this); + TestSuiteTeardown = _testCaseDoc.DocumentElement != null ? new CommandSet("Test Suite Teardown", this, _testCaseDoc.DocumentElement["TestSuiteTeardown"]) : new CommandSet(this); + SetupCommands = _testCaseDoc.DocumentElement != null ? new CommandSet("Unit Test Setup", this, _testCaseDoc.DocumentElement["Setup"]) : new CommandSet(this); + TeardownCommands = _testCaseDoc.DocumentElement != null ? new CommandSet("Unit Test Teardown", this, _testCaseDoc.DocumentElement["Teardown"]) : new CommandSet(this); + + var xmlTests = _testCaseDoc.SelectNodes("SsisUnit:TestSuite/SsisUnit:Tests/SsisUnit:Test", _namespaceMgr); + + if (xmlTests != null) + { + foreach (XmlNode test in xmlTests) + { + if (test.Attributes == null) + continue; + + Test newTest = new Test(this, test); + + newTest.CommandCompleted += OnRaiseCommandCompleted; + newTest.CommandFailed += OnRaiseCommandFailed; + newTest.CommandStarted += OnRaiseCommandStarted; + + Tests.Add(test.Attributes["name"].Value, newTest); + } + } + + var xmlTestReferences = _testCaseDoc.SelectNodes("SsisUnit:TestSuite/SsisUnit:Tests/SsisUnit:TestRef", _namespaceMgr); + + if (xmlTestReferences != null) + { + foreach (XmlNode testRef in xmlTestReferences) + { + if (testRef.Attributes == null) + continue; + + TestRefs.Add(testRef.Attributes["path"].Value, new TestRef(this, testRef)); + } + } + } + catch (Exception ex) + { + throw new ApplicationException(string.Format("The unit test file is malformed or corrupt. Please verify that the file format conforms to the ssisUnit schema, provided in the SsisUnit.xsd file."), ex); + } + } + + private void ExecuteCommandSet(CommandSet commandSet) + { + if (commandSet == null) + throw new ArgumentNullException("commandSet"); + + try + { + commandSet.CommandStarted += OnRaiseCommandStarted; + commandSet.CommandCompleted += OnRaiseCommandCompleted; + commandSet.CommandFailed += OnRaiseCommandFailed; + + commandSet.Execute(); + } + finally + { + commandSet.CommandStarted -= OnRaiseCommandStarted; + commandSet.CommandCompleted -= OnRaiseCommandCompleted; + commandSet.CommandFailed -= OnRaiseCommandFailed; + } + } + + private Dictionary LoadConnectionRefs(XmlNode connections) + { + Dictionary refs = new Dictionary(connections.ChildNodes.Count); + + foreach (XmlNode conn in connections) + { + if (conn.Attributes == null) + continue; + + refs.Add(conn.Attributes["name"].Value, new ConnectionRef(conn)); + } + + return refs; + } + + private void InitializeTestCase(Stream testCase) + { + _testCaseDoc = LoadTestXmlFromStream(testCase); + + CommonSetup(); + } + + /// + /// Loads a test case from an XML file. + /// + /// The complete filename (including path) for the test case. + /// An xml document + static private XmlDocument LoadTestXmlFromFile(string fileName) + { + try + { + if (fileName == null) + { + return null; + } + + return LoadTestXmlFromStream(new StreamReader(fileName).BaseStream); + } + catch (Exception ex) + { + throw new ArgumentException("The test case could not be loaded: " + ex.Message); + } + } + + static internal XmlDocument LoadTestXmlFromStream(Stream file) + { + if (file == null) + { + return null; + } + + try + { + Stream strm = GetStreamFromExecutingAssembly("SsisUnit.xsd"); + + XmlReaderSettings settings = new XmlReaderSettings(); + settings.Schemas.Add("http://tempuri.org/SsisUnit.xsd", XmlReader.Create(strm)); + XmlDocument test = new XmlDocument(); + test.Load(XmlReader.Create(file, settings)); + + return test; + } + catch (XmlSchemaValidationException) + { + throw new XmlSchemaValidationException("The test case is not in a valid format. Please ensure that it conforms to the schema."); + } + catch (Exception ex) + { + throw new ArgumentException("The test case could not be loaded: " + ex.Message); + } + finally + { + file.Close(); + } + } + + internal void RunTestSuite(SsisTestSuite ts) + { + if (ts == null) + throw new ArgumentNullException("ts"); + + try + { + ts.CommandStarted += TestCaseCommandStarted; + ts.CommandCompleted += TestCaseCommandCompleted; + ts.CommandFailed += TestCaseCommandFailed; + ts.SetupCompleted += TestCaseSetupCompleted; + ts.TestCompleted += TestCaseTestCompleted; + ts.TeardownCompleted += TestCaseTeardownCompleted; + ts.AssertCompleted += TestCaseAssertCompleted; + + ts.Execute(this); + } + finally + { + ts.CommandStarted -= TestCaseCommandStarted; + ts.CommandCompleted -= TestCaseCommandCompleted; + ts.CommandFailed -= TestCaseCommandFailed; + ts.SetupCompleted -= TestCaseSetupCompleted; + ts.TestCompleted -= TestCaseTestCompleted; + ts.TeardownCompleted -= TestCaseTeardownCompleted; + ts.AssertCompleted -= TestCaseAssertCompleted; + } + } + + #region Event Handlers + + private void TestCaseCommandCompleted(object sender, CommandCompletedEventArgs e) + { + OnRaiseCommandCompleted(sender, e); + } + + private void TestCaseCommandFailed(object sender, CommandFailedEventArgs e) + { + OnRaiseCommandFailed(sender, e); + } + + private void TestCaseCommandStarted(object sender, CommandStartedEventArgs e) + { + OnRaiseCommandStarted(sender, e); + } + + private void TestCaseTeardownCompleted(object sender, TeardownCompletedEventArgs e) + { + OnRaiseTeardownCompleted(e); + } + + private void TestCaseTestCompleted(object sender, TestCompletedEventArgs e) + { + OnRaiseTestCompleted(e); + } + + private void TestCaseSetupCompleted(object sender, SetupCompletedEventArgs e) + { + OnRaiseSetupCompleted(e); + } + + private void TestCaseAssertCompleted(object sender, AssertCompletedEventArgs e) + { + OnRaiseAssertCompleted(e); + } + + #endregion + + #endregion + } } \ No newline at end of file diff --git a/SsisUnit/Test.cs b/SsisUnit/Test.cs index 20572a2..5fc5c8c 100644 --- a/SsisUnit/Test.cs +++ b/SsisUnit/Test.cs @@ -1,686 +1,698 @@ -using System; -using System.Collections.Generic; -using System.Security; -using System.Text; -using System.Xml; - -using Microsoft.SqlServer.Dts.Runtime; -using System.Globalization; -using System.ComponentModel; - -using SsisUnitBase; -using SsisUnitBase.Enums; -using SsisUnitBase.EventArgs; - -#if !SQL2005 -using System.Linq; -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; -#else -using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; -#endif - -namespace SsisUnit -{ - public class Test : SsisUnitBaseObject - { - internal Package InternalPackage; - - private Context _context; - - public event EventHandler CommandCompleted; - public event EventHandler CommandFailed; - public event EventHandler CommandStarted; - public event EventHandler TestStarted; - public event EventHandler TestCompleted; - - private string _taskName; - - private List _packageErrors; - - private SecureString _securePassword; - - // TODO: Add Context to all parents, children - internal Test(Context context, SsisTestSuite testSuite, string name, string package, string password, string task) - : this(testSuite, name, null, package, password, task, DTSExecResult.Success) - { - _context = context; - } - - public Test(SsisTestSuite testSuite, string name, string package, string password, string task) - : this(testSuite, name, null, package, password, task, DTSExecResult.Success) { } - - public Test(SsisTestSuite testSuite, string name, string project, string package, string password, string task) - : this(testSuite, name, project, package, password, task, DTSExecResult.Success) { } - - public Test(SsisTestSuite testSuite, string name, string package, string password, string task, DTSExecResult taskResult) - : this(testSuite, name, null, package, password, task, taskResult) { } - - public Test(SsisTestSuite testSuite, string name, string project, string package, string password, string task, DTSExecResult taskResult) - { - Asserts = new Asserts(_context, this); - TestSuite = testSuite; - Name = name; - Task = task; - PackageLocation = package; - - if (password != null) - _securePassword = Helper.ConvertToSecureString(password); - - ProjectLocation = project; - TestSetup = new CommandSet(string.IsNullOrEmpty(Name) ? "Setup" : Name + " Setup", TestSuite); - TestTeardown = new CommandSet(string.IsNullOrEmpty(Name) ? "Teardown" : Name + " Teardown", TestSuite); - TaskResult = taskResult; - } - - public Test(SsisTestSuite testSuite, XmlNode testXml) - { - TaskResult = DTSExecResult.Success; - Asserts = new Asserts(_context, this); - TestSuite = testSuite; - - LoadFromXml(testXml); - } - - public Test(SsisTestSuite testSuite, string testXml) - { - TaskResult = DTSExecResult.Success; - Asserts = new Asserts(_context, this); - TestSuite = testSuite; - - LoadFromXml(testXml); - } - - #region Properties - - [Browsable(false)] - public SsisTestSuite TestSuite { get; private set; } - - /// - /// The task's GUID ID or Name to execute during the execution of the . - /// If a task's name is specified, the first encountered task with the specified name will be executed. - /// If there is more than one task with the same name, use the task's GUID instead. - /// -#if SQL2005 - [Description("The task that this test will run against."), - TypeConverter("SsisUnit.Design.TaskConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), - Editor("SsisUnit.Design.PackageBrowserEditor, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#elif SQL2008 - [Description("The task that this test will run against."), - TypeConverter("SsisUnit.Design.TaskConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), - Editor("SsisUnit.Design.PackageBrowserEditor, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#elif SQL2012 - [Description("The task that this test will run against."), - TypeConverter("SsisUnit.Design.TaskConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), - Editor("SsisUnit.Design.PackageBrowserEditor, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#elif SQL2014 - [Description("The task that this test will run against."), - TypeConverter("SsisUnit.Design.TaskConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), - Editor("SsisUnit.Design.PackageBrowserEditor, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] -#endif - public string Task { get; set; } - -#if SQL2005 - [Description("The package that this test will run against."), - TypeConverter("SsisUnit.Design.PackageRefConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2008 - [Description("The package that this test will run against."), - TypeConverter("SsisUnit.Design.PackageRefConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2012 - [Description("The package that this test will run against."), - TypeConverter("SsisUnit.Design.PackageRefConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#elif SQL2014 - [Description("The package that this test will run against."), - TypeConverter("SsisUnit.Design.PackageRefConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] -#endif - public string PackageLocation { get; set; } - - [Browsable(false)] - internal SecureString StoredPassword - { - get - { - return _securePassword; - } - } - - /* - #if SQL2005 - [Description("The package that this test will run against."), - TypeConverter("SsisUnit.Design.ProjectRefConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] - #elif SQL2008 - [Description("The package that this test will run against."), - TypeConverter("SsisUnit.Design.ProjectRefConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] - #elif SQL2012 - [Description("The package that this test will run against."), - TypeConverter("SsisUnit.Design.ProjectRefConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] - #elif SQL2014 - [Description("The package that this test will run against."), - TypeConverter("SsisUnit.Design.ProjectRefConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] - #endif - */ - [Browsable(false)] - public string ProjectLocation { get; set; } - - [Browsable(false)] - public Asserts Asserts { get; private set; } - - [Browsable(false)] - public CommandSet TestSetup { get; private set; } - - [Browsable(false)] - public CommandSet TestTeardown { get; private set; } - - [Description("Determines the expected result of the task."), TypeConverter(typeof(EnumConverter))] - public DTSExecResult TaskResult { get; set; } - - #endregion - - public bool Execute() - { - return Execute(TestSuite.CreateContext()); - } - - /// - /// Execute the setup, asserts, and teardown associated with this test. - /// - /// True if the test was executed with no errors, false if it encountered errors. - public bool Execute(Context context) - { - _packageErrors = new List(); - var testLog = new Log { ItemName = string.Format(CultureInfo.CurrentCulture, "Test: {0}", this.Name) }; - context.Log.Find(new Log { ItemName = "TestSuite" }).Add(testLog); - testLog.Messages.Add("Test Started"); - - OnRaiseTestStarted(new TestStartedEventArgs()); - - TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestCount); - - bool returnValue = false; - - object loadedProject = null; - - try - { - Package packageToTest; - DtsContainer taskHost; - - try - { - LoadPackageAndTask(PackageLocation, StoredPassword, ProjectLocation, Task, out packageToTest, out taskHost, out loadedProject); - } - catch (Exception) - { - TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); - - throw; - } - - InternalPackage = packageToTest; - - string setupResults = string.Empty; - bool setupSucceeded; - _taskName = taskHost.Name; - - var setupLog = new Log(); - context.Log.Find(testLog).Add(setupLog); - setupLog.ItemName = string.Format(CultureInfo.CurrentCulture, "{0} Setup", Name); - try - { - ExecuteCommandSet(TestSuite.SetupCommands, loadedProject, packageToTest, taskHost); - ExecuteCommandSet(TestSetup, loadedProject, packageToTest, taskHost); - - setupResults = "Setup succeeded."; - setupLog.Messages.Add(setupResults); - - setupSucceeded = true; - } - catch (Exception ex) - { - setupResults = "Setup failed: " + ex.Message; - setupLog.Messages.Add(string.Format(CultureInfo.CurrentCulture, "Setup failed: {0}", ex)); - - if (ex.InnerException != null) - setupResults += " : " + ex.InnerException; - - setupSucceeded = false; - - TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); - } - finally - { - TestSuite.OnRaiseSetupCompleted(new SetupCompletedEventArgs(DateTime.Now, Name, PackageLocation, _taskName, setupResults)); - } - - if (!setupSucceeded) - return false; - - string resultMessage = string.Empty; - - var preExecAssertLog = new Log(); - context.Log.Find(testLog).Add(preExecAssertLog); - preExecAssertLog.ItemName = string.Format(CultureInfo.CurrentCulture, "{0} Pre Execution Asserts", Name); - - var execLog = new Log(); - context.Log.Find(testLog).Add(execLog); - execLog.ItemName = string.Format(CultureInfo.CurrentCulture, "{0} Task Execution", Name); - - var assertLog = new Log(); - context.Log.Find(testLog).Add(assertLog); - assertLog.ItemName = string.Format(CultureInfo.CurrentCulture, "{0} Post Execution Asserts", Name); - - try - { - // Pre execution Asserts - ProcessAsserts(loadedProject, packageToTest, taskHost, true, preExecAssertLog); - - var events = new SsisEvents(_packageErrors); - -#if SQL2012 || SQL2014 - if (packageToTest.Project != null) - { - packageToTest.Project.EnsureConnectionsAreLoaded(); - } -#endif - taskHost.Execute(packageToTest.Connections, taskHost.Variables, events, null, null); - - DTSExecResult result = taskHost.ExecutionResult; - - TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertCount); - - if (TaskResult == DTSExecResult.Success) - { - // User expects success - if (result == TaskResult) - { - if (_packageErrors.Count > 0) - { - TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, - new TestResult(DateTime.Now, PackageLocation, _taskName, Name, - "Task Completed: There were validation or execution errors.", false))); - TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertFailedCount); - foreach (var packageError in _packageErrors) - { - execLog.Messages.Add(string.Format("Package Error: {0}.", packageError)); - TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, new TestResult(DateTime.Now, PackageLocation, _taskName, Name, "Task Error: " + packageError.Replace(Environment.NewLine, string.Empty), false))); - } - } - else - { - execLog.Messages.Add( - string.Format( - "Task Execution: Actual result ({0}) was equal to the expected result ({1}).", - result, TaskResult)); - TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, - new TestResult(DateTime.Now, PackageLocation, _taskName, Name, - string.Format( - "Task Completed: Actual result ({0}) was equal to the expected result ({1}).", - result, TaskResult), true))); - TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertPassedCount); - - // Post Execution Asserts - ProcessAsserts(loadedProject, packageToTest, taskHost, false, assertLog); - - resultMessage = "All asserts were completed."; - returnValue = true; - - TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestPassedCount); - } - } - else - { - execLog.Messages.Add(string.Format("Task Execution: Actual result ({0}) was not equal to the expected result ({1}).", result, TaskResult)); - foreach (var packageError in _packageErrors) - { - execLog.Messages.Add(string.Format("Package Error: {0}.", packageError)); - } - TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, new TestResult(DateTime.Now, PackageLocation, _taskName, Name, string.Format("Task Completed: Actual result ({0}) was not equal to the expected result ({1}).", result.ToString(), TaskResult.ToString()), false))); - TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertFailedCount); - - foreach (DtsError err in packageToTest.Errors) - { - execLog.Messages.Add(string.Format("Package Error: {0}.", err.Description)); - TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, new TestResult(DateTime.Now, PackageLocation, _taskName, Name, "Task Error: " + err.Description.Replace(Environment.NewLine, string.Empty), false))); - } - - resultMessage = "The task " + _taskName + " did not execute successfully."; - - TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); - } - } - if (TaskResult == DTSExecResult.Failure) - { - // User expects failure - if (result == TaskResult || _packageErrors.Count > 0) - { - execLog.Messages.Add( - string.Format( - "Task Execution: Actual result ({0}) was equal to the expected result ({1}).", - result, TaskResult)); - TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, - new TestResult(DateTime.Now, PackageLocation, _taskName, Name, - string.Format( - "Task Completed: Actual result ({0}) was equal to the expected result ({1}).", - result, TaskResult), true))); - TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertPassedCount); - - // Post Execution Asserts - ProcessAsserts(loadedProject, packageToTest, taskHost, false, assertLog); - - resultMessage = "All asserts were completed."; - returnValue = true; - - TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestPassedCount); - } - else - { - execLog.Messages.Add(string.Format("Task Execution: Actual result ({0}) was not equal to the expected result ({1}).", result, TaskResult)); - foreach (var packageError in _packageErrors) - { - execLog.Messages.Add(string.Format("Package Error: {0}.", packageError)); - } - TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, new TestResult(DateTime.Now, PackageLocation, _taskName, Name, string.Format("Task Completed: Actual result ({0}) was not equal to the expected result ({1}).", result.ToString(), TaskResult.ToString()), false))); - TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertFailedCount); - - foreach (DtsError err in packageToTest.Errors) - { - execLog.Messages.Add(string.Format("Package Error: {0}.", err.Description)); - TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, new TestResult(DateTime.Now, PackageLocation, _taskName, Name, "Task Error: " + err.Description.Replace(Environment.NewLine, string.Empty), false))); - } - - resultMessage = "The task " + _taskName + " did not execute successfully."; - - TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); - } - } - } - catch (Exception ex) - { - TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); - returnValue = false; - resultMessage = "Exception occurred: " + ex.Message; - } - finally - { - TestSuite.OnRaiseTestCompleted(new TestCompletedEventArgs(DateTime.Now, PackageLocation, _taskName, Name, resultMessage, returnValue)); - } - - if (!returnValue) - return false; - - string teardownResults = string.Empty; - - try - { - ExecuteCommandSet(TestTeardown, loadedProject, packageToTest, taskHost); - ExecuteCommandSet(TestSuite.TeardownCommands, loadedProject, packageToTest, taskHost); - - teardownResults = "Teardown succeeded."; - } - catch (Exception ex) - { - teardownResults = "Teardown failed: " + ex.Message; - - if (ex.InnerException != null) - teardownResults += " : " + ex.InnerException; - - returnValue = false; - - TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); - } - finally - { - TestSuite.OnRaiseTeardownCompleted(new TeardownCompletedEventArgs(DateTime.Now, Name, PackageLocation, _taskName, teardownResults)); - } - - return returnValue; - } - finally - { -#if SQL2012 || SQL2014 - Project project = loadedProject as Project; - - if (project != null) - project.Dispose(); -#else - loadedProject = null; -#endif - - OnRaiseTestCompleted(new TestCompletedEventArgs(DateTime.Now, Name, PackageLocation, _taskName, string.Format("The {0} unit test has completed.", Name), returnValue)); - } - } - - private void ProcessAsserts(object loadedProject, Package packageToTest, DtsContainer taskHost, bool preExecuteAsserts, Log assertLog) - { - // TODO: Log asserts - foreach (SsisAssert assert in Asserts.Values) - { - if (assert.TestBefore == preExecuteAsserts) - { - assert.Execute(loadedProject, packageToTest, taskHost, assertLog); - } - } - } - - private void ExecuteCommandSet(CommandSet commandSet, object project, Package packageToTest, DtsContainer taskHost) - { - if (commandSet == null) - throw new ArgumentNullException("commandSet"); - - if (packageToTest == null) - throw new ArgumentNullException("packageToTest"); - - if (taskHost == null) - throw new ArgumentNullException("taskHost"); - - try - { - commandSet.CommandStarted += CommandOnCommandStarted; - commandSet.CommandCompleted += CommandOnCommandCompleted; - commandSet.CommandFailed += CommandOnCommandFailed; - - commandSet.Execute(project, packageToTest, taskHost); - } - finally - { - commandSet.CommandStarted -= CommandOnCommandStarted; - commandSet.CommandCompleted -= CommandOnCommandCompleted; - commandSet.CommandFailed -= CommandOnCommandFailed; - } - } - - private void CommandOnCommandStarted(object sender, CommandStartedEventArgs e) - { - EventHandler handler = CommandStarted; - - if (handler != null) - handler(sender, e); - } - - private void CommandOnCommandCompleted(object sender, CommandCompletedEventArgs e) - { - EventHandler handler = CommandCompleted; - - if (handler != null) - handler(sender, e); - } - - private void CommandOnCommandFailed(object sender, CommandFailedEventArgs e) - { - EventHandler handler = CommandFailed; - - if (handler != null) - handler(sender, e); - } - - private void OnRaiseTestCompleted(TestCompletedEventArgs e) - { - EventHandler handler = TestCompleted; - - if (handler != null) - { - handler(this, e); - } - } - - private void OnRaiseTestStarted(TestStartedEventArgs e) - { - EventHandler handler = this.TestStarted; - - if (handler != null) - { - handler(this, e); - } - } - - private void LoadPackageAndTask(string packagePath, SecureString packagePassword, string projectPath, string taskId, out Package package, out DtsContainer taskHost, out object loadedProject) - { - try - { - package = Helper.LoadPackage(TestSuite, packagePath, packagePassword, projectPath, out loadedProject); - string remainingPath; - taskHost = Helper.FindExecutable(package, taskId, out remainingPath); - if (taskHost == null) - { - throw new Exception("The task host was not found."); - } - } - catch (DtsPackageStoreException) - { - throw; - } - catch (KeyNotFoundException) - { - throw new KeyNotFoundException(string.Format(CultureInfo.CurrentCulture, "The package attribute is {0}, which does not reference a valid package.", packagePath)); - } - catch (Exception ex) - { - throw new ArgumentException(string.Format("The package path ({0}) or the task host ({1}) is not valid. {2}", string.IsNullOrEmpty(packagePath) ? "" : packagePath, taskId, ex.Message)); - } - } - - public override string PersistToXml() - { - var xml = new StringBuilder(); - var writerSettings = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Fragment, OmitXmlDeclaration = true }; - - XmlWriter xmlWriter = XmlWriter.Create(xml, writerSettings); - xmlWriter.WriteStartElement("Test"); - xmlWriter.WriteAttributeString("name", Name); - xmlWriter.WriteAttributeString("package", PackageLocation); - xmlWriter.WriteAttributeString("task", Task); - xmlWriter.WriteAttributeString("taskResult", TaskResult.ToString()); - - if (TestSetup.Commands.Count > 0) - { - xmlWriter.WriteStartElement("TestSetup"); - xmlWriter.WriteRaw(TestSetup.PersistToXml()); - xmlWriter.WriteEndElement(); - } - - foreach (SsisAssert assert in Asserts.Values) - { - xmlWriter.WriteRaw(assert.PersistToXml()); - } - - if (TestTeardown.Commands.Count > 0) - { - xmlWriter.WriteStartElement("TestTeardown"); - xmlWriter.WriteRaw(TestTeardown.PersistToXml()); - xmlWriter.WriteEndElement(); - } - - xmlWriter.WriteEndElement(); - xmlWriter.Close(); - return xml.ToString(); - } - - public override sealed void LoadFromXml(string testXml) - { - LoadFromXml(Helper.GetXmlNodeFromString(testXml)); - } - - public override sealed void LoadFromXml(XmlNode testXml) - { - if (testXml.Name != "Test") - { - throw new ArgumentException(string.Format("The Xml does not contain the correct type ({0}).", "Test")); - } - - Name = testXml.Attributes != null && testXml.Attributes["name"] != null ? testXml.Attributes["name"].Value : null; - PackageLocation = testXml.Attributes != null && testXml.Attributes["package"] != null ? testXml.Attributes["package"].Value : null; - Task = testXml.Attributes != null && testXml.Attributes["task"] != null ? testXml.Attributes["task"].Value : null; - Asserts = LoadAsserts(testXml); - TestSetup = new CommandSet(string.IsNullOrEmpty(Name) ? "Setup" : Name + " Setup", TestSuite, testXml["TestSetup"]); - TestTeardown = new CommandSet(string.IsNullOrEmpty(Name) ? "Teardown" : Name + " Teardown", TestSuite, testXml["TestTeardown"]); - - XmlNode xmlNode = testXml.Attributes != null ? testXml.Attributes.GetNamedItem("taskResult") : null; - - if (xmlNode == null) - { - TaskResult = DTSExecResult.Success; - } - else - { - TaskResult = (DTSExecResult)Enum.Parse(typeof(DTSExecResult), xmlNode.Value, true); - } - } - - public override bool Validate() - { - ValidationMessages = string.Empty; - - if (Asserts.Count >= 1) - return true; - - ValidationMessages += "There must be one or more asserts for each test." + Environment.NewLine; - - return false; - } - - private Asserts LoadAsserts(XmlNode asserts) - { - if (asserts == null) - { - return new Asserts(_context, this); - } - - var returnValue = new Asserts(_context, this); - - foreach (XmlNode assert in asserts) - { - if (assert.Name == "Assert") - { - if (assert.Attributes == null) - continue; - - returnValue.Add(assert.Attributes["name"].Value, new SsisAssert(TestSuite, this, assert)); - } - } - - return returnValue; - } - - private class SsisEvents : DefaultEvents - { - private readonly List _packageErrors; - - public SsisEvents(List packageErrors) - { - _packageErrors = packageErrors; - } - public override bool OnError(DtsObject source, int errorCode, string subComponent, string description, string helpFile, int helpContext, string idofInterfaceWithError) - { - _packageErrors.Add( - string.Format( - CultureInfo.CurrentCulture, - "Source: {0} | Error Code: {1} | Sub Component: {2} | Description: {3}", - source, - errorCode, - subComponent, - description)); - - return true; - } - } - } +using System; +using System.Collections.Generic; +using System.Security; +using System.Text; +using System.Xml; + +using Microsoft.SqlServer.Dts.Runtime; +using System.Globalization; +using System.ComponentModel; + +using SsisUnitBase; +using SsisUnitBase.Enums; +using SsisUnitBase.EventArgs; + +#if !SQL2005 +using System.Linq; +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData100; +#else +using IDTSComponentMetaData = Microsoft.SqlServer.Dts.Pipeline.Wrapper.IDTSComponentMetaData90; +#endif + +namespace SsisUnit +{ + public class Test : SsisUnitBaseObject + { + internal Package InternalPackage; + + private Context _context; + + public event EventHandler CommandCompleted; + public event EventHandler CommandFailed; + public event EventHandler CommandStarted; + public event EventHandler TestStarted; + public event EventHandler TestCompleted; + + private string _taskName; + + private List _packageErrors; + + private SecureString _securePassword; + + // TODO: Add Context to all parents, children + internal Test(Context context, SsisTestSuite testSuite, string name, string package, string password, string task) + : this(testSuite, name, null, package, password, task, DTSExecResult.Success) + { + _context = context; + } + + public Test(SsisTestSuite testSuite, string name, string package, string password, string task) + : this(testSuite, name, null, package, password, task, DTSExecResult.Success) { } + + public Test(SsisTestSuite testSuite, string name, string project, string package, string password, string task) + : this(testSuite, name, project, package, password, task, DTSExecResult.Success) { } + + public Test(SsisTestSuite testSuite, string name, string package, string password, string task, DTSExecResult taskResult) + : this(testSuite, name, null, package, password, task, taskResult) { } + + public Test(SsisTestSuite testSuite, string name, string project, string package, string password, string task, DTSExecResult taskResult) + { + Asserts = new Asserts(_context, this); + TestSuite = testSuite; + Name = name; + Task = task; + PackageLocation = package; + + if (password != null) + _securePassword = Helper.ConvertToSecureString(password); + + ProjectLocation = project; + TestSetup = new CommandSet(string.IsNullOrEmpty(Name) ? "Setup" : Name + " Setup", TestSuite); + TestTeardown = new CommandSet(string.IsNullOrEmpty(Name) ? "Teardown" : Name + " Teardown", TestSuite); + TaskResult = taskResult; + } + + public Test(SsisTestSuite testSuite, XmlNode testXml) + { + TaskResult = DTSExecResult.Success; + Asserts = new Asserts(_context, this); + TestSuite = testSuite; + + LoadFromXml(testXml); + } + + public Test(SsisTestSuite testSuite, string testXml) + { + TaskResult = DTSExecResult.Success; + Asserts = new Asserts(_context, this); + TestSuite = testSuite; + + LoadFromXml(testXml); + } + + #region Properties + + [Browsable(false)] + public SsisTestSuite TestSuite { get; private set; } + + /// + /// The task's GUID ID or Name to execute during the execution of the . + /// If a task's name is specified, the first encountered task with the specified name will be executed. + /// If there is more than one task with the same name, use the task's GUID instead. + /// +#if SQL2005 + [Description("The task that this test will run against."), + TypeConverter("SsisUnit.Design.TaskConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), + Editor("SsisUnit.Design.PackageBrowserEditor, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2008 + [Description("The task that this test will run against."), + TypeConverter("SsisUnit.Design.TaskConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), + Editor("SsisUnit.Design.PackageBrowserEditor, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2012 + [Description("The task that this test will run against."), + TypeConverter("SsisUnit.Design.TaskConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), + Editor("SsisUnit.Design.PackageBrowserEditor, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2014 + [Description("The task that this test will run against."), + TypeConverter("SsisUnit.Design.TaskConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), + Editor("SsisUnit.Design.PackageBrowserEditor, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] +#elif SQL2017 + [Description("The task that this test will run against."), + TypeConverter("SsisUnit.Design.TaskConverter, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab"), + Editor("SsisUnit.Design.PackageBrowserEditor, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] + +#endif + public string Task { get; set; } + +#if SQL2005 + [Description("The package that this test will run against."), + TypeConverter("SsisUnit.Design.PackageRefConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2008 + [Description("The package that this test will run against."), + TypeConverter("SsisUnit.Design.PackageRefConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2012 + [Description("The package that this test will run against."), + TypeConverter("SsisUnit.Design.PackageRefConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2014 + [Description("The package that this test will run against."), + TypeConverter("SsisUnit.Design.PackageRefConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#elif SQL2017 + [Description("The package that this test will run against."), + TypeConverter("SsisUnit.Design.PackageRefConverter, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] +#endif + public string PackageLocation { get; set; } + + [Browsable(false)] + internal SecureString StoredPassword + { + get + { + return _securePassword; + } + } + + /* + #if SQL2005 + [Description("The package that this test will run against."), + TypeConverter("SsisUnit.Design.ProjectRefConverter, SsisUnit.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] + #elif SQL2008 + [Description("The package that this test will run against."), + TypeConverter("SsisUnit.Design.ProjectRefConverter, SsisUnit2008.Design, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] + #elif SQL2012 + [Description("The package that this test will run against."), + TypeConverter("SsisUnit.Design.ProjectRefConverter, SsisUnit.Design.2012, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] + #elif SQL2014 + [Description("The package that this test will run against."), + TypeConverter("SsisUnit.Design.ProjectRefConverter, SsisUnit.Design.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] + #elif SQL2017 + [Description("The package that this test will run against."), + TypeConverter("SsisUnit.Design.ProjectRefConverter, SsisUnit.Design.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fbed22cbef36cab")] + + #endif + */ + [Browsable(false)] + public string ProjectLocation { get; set; } + + [Browsable(false)] + public Asserts Asserts { get; private set; } + + [Browsable(false)] + public CommandSet TestSetup { get; private set; } + + [Browsable(false)] + public CommandSet TestTeardown { get; private set; } + + [Description("Determines the expected result of the task."), TypeConverter(typeof(EnumConverter))] + public DTSExecResult TaskResult { get; set; } + + #endregion + + public bool Execute() + { + return Execute(TestSuite.CreateContext()); + } + + /// + /// Execute the setup, asserts, and teardown associated with this test. + /// + /// True if the test was executed with no errors, false if it encountered errors. + public bool Execute(Context context) + { + _packageErrors = new List(); + var testLog = new Log { ItemName = string.Format(CultureInfo.CurrentCulture, "Test: {0}", this.Name) }; + context.Log.Find(new Log { ItemName = "TestSuite" }).Add(testLog); + testLog.Messages.Add("Test Started"); + + OnRaiseTestStarted(new TestStartedEventArgs()); + + TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestCount); + + bool returnValue = false; + + object loadedProject = null; + + try + { + Package packageToTest; + DtsContainer taskHost; + + try + { + LoadPackageAndTask(PackageLocation, StoredPassword, ProjectLocation, Task, out packageToTest, out taskHost, out loadedProject); + } + catch (Exception) + { + TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); + + throw; + } + + InternalPackage = packageToTest; + + string setupResults = string.Empty; + bool setupSucceeded; + _taskName = taskHost.Name; + + var setupLog = new Log(); + context.Log.Find(testLog).Add(setupLog); + setupLog.ItemName = string.Format(CultureInfo.CurrentCulture, "{0} Setup", Name); + try + { + ExecuteCommandSet(TestSuite.SetupCommands, loadedProject, packageToTest, taskHost); + ExecuteCommandSet(TestSetup, loadedProject, packageToTest, taskHost); + + setupResults = "Setup succeeded."; + setupLog.Messages.Add(setupResults); + + setupSucceeded = true; + } + catch (Exception ex) + { + setupResults = "Setup failed: " + ex.Message; + setupLog.Messages.Add(string.Format(CultureInfo.CurrentCulture, "Setup failed: {0}", ex)); + + if (ex.InnerException != null) + setupResults += " : " + ex.InnerException; + + setupSucceeded = false; + + TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); + } + finally + { + TestSuite.OnRaiseSetupCompleted(new SetupCompletedEventArgs(DateTime.Now, Name, PackageLocation, _taskName, setupResults)); + } + + if (!setupSucceeded) + return false; + + string resultMessage = string.Empty; + + var preExecAssertLog = new Log(); + context.Log.Find(testLog).Add(preExecAssertLog); + preExecAssertLog.ItemName = string.Format(CultureInfo.CurrentCulture, "{0} Pre Execution Asserts", Name); + + var execLog = new Log(); + context.Log.Find(testLog).Add(execLog); + execLog.ItemName = string.Format(CultureInfo.CurrentCulture, "{0} Task Execution", Name); + + var assertLog = new Log(); + context.Log.Find(testLog).Add(assertLog); + assertLog.ItemName = string.Format(CultureInfo.CurrentCulture, "{0} Post Execution Asserts", Name); + + try + { + // Pre execution Asserts + ProcessAsserts(loadedProject, packageToTest, taskHost, true, preExecAssertLog); + + var events = new SsisEvents(_packageErrors); + +#if SQL2012 || SQL2014 || SQL2017 + if (packageToTest.Project != null) + { + packageToTest.Project.EnsureConnectionsAreLoaded(); + } +#endif + taskHost.Execute(packageToTest.Connections, taskHost.Variables, events, null, null); + + DTSExecResult result = taskHost.ExecutionResult; + + TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertCount); + + if (TaskResult == DTSExecResult.Success) + { + // User expects success + if (result == TaskResult) + { + if (_packageErrors.Count > 0) + { + TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, + new TestResult(DateTime.Now, PackageLocation, _taskName, Name, + "Task Completed: There were validation or execution errors.", false))); + TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertFailedCount); + foreach (var packageError in _packageErrors) + { + execLog.Messages.Add(string.Format("Package Error: {0}.", packageError)); + TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, new TestResult(DateTime.Now, PackageLocation, _taskName, Name, "Task Error: " + packageError.Replace(Environment.NewLine, string.Empty), false))); + } + } + else + { + execLog.Messages.Add( + string.Format( + "Task Execution: Actual result ({0}) was equal to the expected result ({1}).", + result, TaskResult)); + TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, + new TestResult(DateTime.Now, PackageLocation, _taskName, Name, + string.Format( + "Task Completed: Actual result ({0}) was equal to the expected result ({1}).", + result, TaskResult), true))); + TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertPassedCount); + + // Post Execution Asserts + ProcessAsserts(loadedProject, packageToTest, taskHost, false, assertLog); + + resultMessage = "All asserts were completed."; + returnValue = true; + + TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestPassedCount); + } + } + else + { + execLog.Messages.Add(string.Format("Task Execution: Actual result ({0}) was not equal to the expected result ({1}).", result, TaskResult)); + foreach (var packageError in _packageErrors) + { + execLog.Messages.Add(string.Format("Package Error: {0}.", packageError)); + } + TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, new TestResult(DateTime.Now, PackageLocation, _taskName, Name, string.Format("Task Completed: Actual result ({0}) was not equal to the expected result ({1}).", result.ToString(), TaskResult.ToString()), false))); + TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertFailedCount); + + foreach (DtsError err in packageToTest.Errors) + { + execLog.Messages.Add(string.Format("Package Error: {0}.", err.Description)); + TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, new TestResult(DateTime.Now, PackageLocation, _taskName, Name, "Task Error: " + err.Description.Replace(Environment.NewLine, string.Empty), false))); + } + + resultMessage = "The task " + _taskName + " did not execute successfully."; + + TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); + } + } + if (TaskResult == DTSExecResult.Failure) + { + // User expects failure + if (result == TaskResult || _packageErrors.Count > 0) + { + execLog.Messages.Add( + string.Format( + "Task Execution: Actual result ({0}) was equal to the expected result ({1}).", + result, TaskResult)); + TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, + new TestResult(DateTime.Now, PackageLocation, _taskName, Name, + string.Format( + "Task Completed: Actual result ({0}) was equal to the expected result ({1}).", + result, TaskResult), true))); + TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertPassedCount); + + // Post Execution Asserts + ProcessAsserts(loadedProject, packageToTest, taskHost, false, assertLog); + + resultMessage = "All asserts were completed."; + returnValue = true; + + TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestPassedCount); + } + else + { + execLog.Messages.Add(string.Format("Task Execution: Actual result ({0}) was not equal to the expected result ({1}).", result, TaskResult)); + foreach (var packageError in _packageErrors) + { + execLog.Messages.Add(string.Format("Package Error: {0}.", packageError)); + } + TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, new TestResult(DateTime.Now, PackageLocation, _taskName, Name, string.Format("Task Completed: Actual result ({0}) was not equal to the expected result ({1}).", result.ToString(), TaskResult.ToString()), false))); + TestSuite.Statistics.IncrementStatistic(StatisticEnum.AssertFailedCount); + + foreach (DtsError err in packageToTest.Errors) + { + execLog.Messages.Add(string.Format("Package Error: {0}.", err.Description)); + TestSuite.OnRaiseAssertCompleted(new AssertCompletedEventArgs(null, new TestResult(DateTime.Now, PackageLocation, _taskName, Name, "Task Error: " + err.Description.Replace(Environment.NewLine, string.Empty), false))); + } + + resultMessage = "The task " + _taskName + " did not execute successfully."; + + TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); + } + } + } + catch (Exception ex) + { + TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); + returnValue = false; + resultMessage = "Exception occurred: " + ex.Message; + } + finally + { + TestSuite.OnRaiseTestCompleted(new TestCompletedEventArgs(DateTime.Now, PackageLocation, _taskName, Name, resultMessage, returnValue)); + } + + if (!returnValue) + return false; + + string teardownResults = string.Empty; + + try + { + ExecuteCommandSet(TestTeardown, loadedProject, packageToTest, taskHost); + ExecuteCommandSet(TestSuite.TeardownCommands, loadedProject, packageToTest, taskHost); + + teardownResults = "Teardown succeeded."; + } + catch (Exception ex) + { + teardownResults = "Teardown failed: " + ex.Message; + + if (ex.InnerException != null) + teardownResults += " : " + ex.InnerException; + + returnValue = false; + + TestSuite.Statistics.IncrementStatistic(StatisticEnum.TestFailedCount); + } + finally + { + TestSuite.OnRaiseTeardownCompleted(new TeardownCompletedEventArgs(DateTime.Now, Name, PackageLocation, _taskName, teardownResults)); + } + + return returnValue; + } + finally + { +#if SQL2012 || SQL2014 || SQL2017 + Project project = loadedProject as Project; + + if (project != null) + project.Dispose(); +#else + loadedProject = null; +#endif + + OnRaiseTestCompleted(new TestCompletedEventArgs(DateTime.Now, Name, PackageLocation, _taskName, string.Format("The {0} unit test has completed.", Name), returnValue)); + } + } + + private void ProcessAsserts(object loadedProject, Package packageToTest, DtsContainer taskHost, bool preExecuteAsserts, Log assertLog) + { + // TODO: Log asserts + foreach (SsisAssert assert in Asserts.Values) + { + if (assert.TestBefore == preExecuteAsserts) + { + assert.Execute(loadedProject, packageToTest, taskHost, assertLog); + } + } + } + + private void ExecuteCommandSet(CommandSet commandSet, object project, Package packageToTest, DtsContainer taskHost) + { + if (commandSet == null) + throw new ArgumentNullException("commandSet"); + + if (packageToTest == null) + throw new ArgumentNullException("packageToTest"); + + if (taskHost == null) + throw new ArgumentNullException("taskHost"); + + try + { + commandSet.CommandStarted += CommandOnCommandStarted; + commandSet.CommandCompleted += CommandOnCommandCompleted; + commandSet.CommandFailed += CommandOnCommandFailed; + + commandSet.Execute(project, packageToTest, taskHost); + } + finally + { + commandSet.CommandStarted -= CommandOnCommandStarted; + commandSet.CommandCompleted -= CommandOnCommandCompleted; + commandSet.CommandFailed -= CommandOnCommandFailed; + } + } + + private void CommandOnCommandStarted(object sender, CommandStartedEventArgs e) + { + EventHandler handler = CommandStarted; + + if (handler != null) + handler(sender, e); + } + + private void CommandOnCommandCompleted(object sender, CommandCompletedEventArgs e) + { + EventHandler handler = CommandCompleted; + + if (handler != null) + handler(sender, e); + } + + private void CommandOnCommandFailed(object sender, CommandFailedEventArgs e) + { + EventHandler handler = CommandFailed; + + if (handler != null) + handler(sender, e); + } + + private void OnRaiseTestCompleted(TestCompletedEventArgs e) + { + EventHandler handler = TestCompleted; + + if (handler != null) + { + handler(this, e); + } + } + + private void OnRaiseTestStarted(TestStartedEventArgs e) + { + EventHandler handler = this.TestStarted; + + if (handler != null) + { + handler(this, e); + } + } + + private void LoadPackageAndTask(string packagePath, SecureString packagePassword, string projectPath, string taskId, out Package package, out DtsContainer taskHost, out object loadedProject) + { + try + { + package = Helper.LoadPackage(TestSuite, packagePath, packagePassword, projectPath, out loadedProject); + string remainingPath; + taskHost = Helper.FindExecutable(package, taskId, out remainingPath); + if (taskHost == null) + { + throw new Exception("The task host was not found."); + } + } + catch (DtsPackageStoreException) + { + throw; + } + catch (KeyNotFoundException) + { + throw new KeyNotFoundException(string.Format(CultureInfo.CurrentCulture, "The package attribute is {0}, which does not reference a valid package.", packagePath)); + } + catch (Exception ex) + { + throw new ArgumentException(string.Format("The package path ({0}) or the task host ({1}) is not valid. {2}", string.IsNullOrEmpty(packagePath) ? "" : packagePath, taskId, ex.Message)); + } + } + + public override string PersistToXml() + { + var xml = new StringBuilder(); + var writerSettings = new XmlWriterSettings { ConformanceLevel = ConformanceLevel.Fragment, OmitXmlDeclaration = true }; + + XmlWriter xmlWriter = XmlWriter.Create(xml, writerSettings); + xmlWriter.WriteStartElement("Test"); + xmlWriter.WriteAttributeString("name", Name); + xmlWriter.WriteAttributeString("package", PackageLocation); + xmlWriter.WriteAttributeString("task", Task); + xmlWriter.WriteAttributeString("taskResult", TaskResult.ToString()); + + if (TestSetup.Commands.Count > 0) + { + xmlWriter.WriteStartElement("TestSetup"); + xmlWriter.WriteRaw(TestSetup.PersistToXml()); + xmlWriter.WriteEndElement(); + } + + foreach (SsisAssert assert in Asserts.Values) + { + xmlWriter.WriteRaw(assert.PersistToXml()); + } + + if (TestTeardown.Commands.Count > 0) + { + xmlWriter.WriteStartElement("TestTeardown"); + xmlWriter.WriteRaw(TestTeardown.PersistToXml()); + xmlWriter.WriteEndElement(); + } + + xmlWriter.WriteEndElement(); + xmlWriter.Close(); + return xml.ToString(); + } + + public override sealed void LoadFromXml(string testXml) + { + LoadFromXml(Helper.GetXmlNodeFromString(testXml)); + } + + public override sealed void LoadFromXml(XmlNode testXml) + { + if (testXml.Name != "Test") + { + throw new ArgumentException(string.Format("The Xml does not contain the correct type ({0}).", "Test")); + } + + Name = testXml.Attributes != null && testXml.Attributes["name"] != null ? testXml.Attributes["name"].Value : null; + PackageLocation = testXml.Attributes != null && testXml.Attributes["package"] != null ? testXml.Attributes["package"].Value : null; + Task = testXml.Attributes != null && testXml.Attributes["task"] != null ? testXml.Attributes["task"].Value : null; + Asserts = LoadAsserts(testXml); + TestSetup = new CommandSet(string.IsNullOrEmpty(Name) ? "Setup" : Name + " Setup", TestSuite, testXml["TestSetup"]); + TestTeardown = new CommandSet(string.IsNullOrEmpty(Name) ? "Teardown" : Name + " Teardown", TestSuite, testXml["TestTeardown"]); + + XmlNode xmlNode = testXml.Attributes != null ? testXml.Attributes.GetNamedItem("taskResult") : null; + + if (xmlNode == null) + { + TaskResult = DTSExecResult.Success; + } + else + { + TaskResult = (DTSExecResult)Enum.Parse(typeof(DTSExecResult), xmlNode.Value, true); + } + } + + public override bool Validate() + { + ValidationMessages = string.Empty; + + if (Asserts.Count >= 1) + return true; + + ValidationMessages += "There must be one or more asserts for each test." + Environment.NewLine; + + return false; + } + + private Asserts LoadAsserts(XmlNode asserts) + { + if (asserts == null) + { + return new Asserts(_context, this); + } + + var returnValue = new Asserts(_context, this); + + foreach (XmlNode assert in asserts) + { + if (assert.Name == "Assert") + { + if (assert.Attributes == null) + continue; + + returnValue.Add(assert.Attributes["name"].Value, new SsisAssert(TestSuite, this, assert)); + } + } + + return returnValue; + } + + private class SsisEvents : DefaultEvents + { + private readonly List _packageErrors; + + public SsisEvents(List packageErrors) + { + _packageErrors = packageErrors; + } + public override bool OnError(DtsObject source, int errorCode, string subComponent, string description, string helpFile, int helpContext, string idofInterfaceWithError) + { + _packageErrors.Add( + string.Format( + CultureInfo.CurrentCulture, + "Source: {0} | Error Code: {1} | Sub Component: {2} | Description: {3}", + source, + errorCode, + subComponent, + description)); + + return true; + } + } + } } \ No newline at end of file diff --git a/SsisUnit/app.Designer.cs b/SsisUnit/app.Designer.cs index b300688..5b24ac5 100644 --- a/SsisUnit/app.Designer.cs +++ b/SsisUnit/app.Designer.cs @@ -1,44 +1,52 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18444 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace SsisUnit { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] - internal sealed partial class app : global::System.Configuration.ApplicationSettingsBase { - - private static app defaultInstance = ((app)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new app()))); - - public static app Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("5")] - public int ProcessCheckForExitDelay { - get { - return ((int)(this["ProcessCheckForExitDelay"])); - } - } - - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("1")] - public int ProcessTimeout { - get { - return ((int)(this["ProcessTimeout"])); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace SsisUnit +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class app : global::System.Configuration.ApplicationSettingsBase + { + + private static app defaultInstance = ((app)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new app()))); + + public static app Default + { + get + { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("5")] + public int ProcessCheckForExitDelay + { + get + { + return ((int)(this["ProcessCheckForExitDelay"])); + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("1")] + public int ProcessTimeout + { + get + { + return ((int)(this["ProcessTimeout"])); + } + } + } +} diff --git a/SsisUnit/app.config b/SsisUnit/app.config index 7b78afe..7cc6f56 100644 --- a/SsisUnit/app.config +++ b/SsisUnit/app.config @@ -1,32 +1,32 @@ - - - - - - -
-
- - - - - - 5 - - - 1 - - - - - 1 - - - 20 - - - - - - - + + + + + + +
+
+ + + + + + 5 + + + 1 + + + + + 1 + + + 20 + + + + + + + diff --git a/SsisUnit/ssisUnit.Designer.cs b/SsisUnit/ssisUnit.Designer.cs index e425603..ccf5cd0 100644 --- a/SsisUnit/ssisUnit.Designer.cs +++ b/SsisUnit/ssisUnit.Designer.cs @@ -1,44 +1,44 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18010 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace SsisUnit { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class ssisUnit : global::System.Configuration.ApplicationSettingsBase { - - private static ssisUnit defaultInstance = ((ssisUnit)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new ssisUnit()))); - - public static ssisUnit Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("1")] - public int ProcessTimeout { - get { - return ((int)(this["ProcessTimeout"])); - } - } - - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("20")] - public int ProcessCheckForExitDelay { - get { - return ((int)(this["ProcessCheckForExitDelay"])); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace SsisUnit { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class ssisUnit : global::System.Configuration.ApplicationSettingsBase { + + private static ssisUnit defaultInstance = ((ssisUnit)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new ssisUnit()))); + + public static ssisUnit Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("1")] + public int ProcessTimeout { + get { + return ((int)(this["ProcessTimeout"])); + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("20")] + public int ProcessCheckForExitDelay { + get { + return ((int)(this["ProcessCheckForExitDelay"])); + } + } + } +} diff --git a/SsisUnitDesign/SsisUnit.Design_SQL2017.csproj b/SsisUnitDesign/SsisUnit.Design_SQL2017.csproj new file mode 100644 index 0000000..35d92ca --- /dev/null +++ b/SsisUnitDesign/SsisUnit.Design_SQL2017.csproj @@ -0,0 +1,151 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {3B38F252-0DE8-4639-9AF9-AB8B216B685C} + Library + Properties + SsisUnit.Design + SsisUnit.Design.2017 + v4.5 + 512 + SAK + SAK + SAK + SAK + true + SsisUnit.snk + + + + + 3.5 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + true + full + false + bin\Debug\ + TRACE;DEBUG;SQL2017 + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE;SQL2017 + prompt + 4 + false + + + + + + 3.5 + + + + + + + + + + + + Form + + + ConnectionStringBuilder.cs + + + + + + Form + + + PackageBrowser.cs + + + + + Form + + + QueryBuilder.cs + + + + + + ConnectionStringBuilder.cs + + + PackageBrowser.cs + + + QueryBuilder.cs + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + + + {e693cce8-9edf-4117-ab7f-eb87b87e29ea} + SsisUnitBase + + + {8c839f0e-0afd-4d9a-8dee-5c7963e3e6c7} + SSISUnit.2017 + + + + + + "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\gacutil.exe" -u $(TargetFileName) + "C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\gacutil.exe" -i $(TargetPath) + + \ No newline at end of file diff --git a/SsisUnitTestRunner/SsisUnit.TestRunner.2017.csproj b/SsisUnitTestRunner/SsisUnit.TestRunner.2017.csproj new file mode 100644 index 0000000..88a7034 --- /dev/null +++ b/SsisUnitTestRunner/SsisUnit.TestRunner.2017.csproj @@ -0,0 +1,127 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0} + Exe + Properties + ssisUnitTestRunner + ssisUnitTestRunner2017 + v4.5 + 512 + SAK + SAK + SAK + SAK + + + + + 3.5 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + + true + full + false + bin\Debug\ + TRACE;DEBUG;SQL2017 + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE;SQL2017 + prompt + 4 + false + + + true + bin\x86\Debug\ + TRACE;DEBUG;SQL2017 + full + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + bin\x86\Release\ + TRACE;SQL2017 + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + + + 3.5 + + + + + + + + + + + {e693cce8-9edf-4117-ab7f-eb87b87e29ea} + SsisUnitBase + + + {8c839f0e-0afd-4d9a-8dee-5c7963e3e6c7} + SSISUnit.2017 + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + + + Designer + + + + + \ No newline at end of file diff --git a/SsisUnitTestRunner/app.config b/SsisUnitTestRunner/app.config index 51cd80a..bce633a 100644 --- a/SsisUnitTestRunner/app.config +++ b/SsisUnitTestRunner/app.config @@ -1,6 +1,6 @@ - - - - - - + + + + + + diff --git a/SsisUnitTestRunnerUI/Properties/Resources.Designer.cs b/SsisUnitTestRunnerUI/Properties/Resources.Designer.cs index 24c080d..9929fd2 100644 --- a/SsisUnitTestRunnerUI/Properties/Resources.Designer.cs +++ b/SsisUnitTestRunnerUI/Properties/Resources.Designer.cs @@ -1,63 +1,63 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18444 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ssisUnitTestRunnerUI.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ssisUnitTestRunnerUI.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ssisUnitTestRunnerUI.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ssisUnitTestRunnerUI.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/SsisUnitTestRunnerUI/Properties/Settings.Designer.cs b/SsisUnitTestRunnerUI/Properties/Settings.Designer.cs index 68bd7c4..7cd59a5 100644 --- a/SsisUnitTestRunnerUI/Properties/Settings.Designer.cs +++ b/SsisUnitTestRunnerUI/Properties/Settings.Designer.cs @@ -1,26 +1,26 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18444 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ssisUnitTestRunnerUI.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ssisUnitTestRunnerUI.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/SsisUnitTestRunnerUI/TestBuilder.cs b/SsisUnitTestRunnerUI/TestBuilder.cs index 3fd9a97..c9d55ff 100644 --- a/SsisUnitTestRunnerUI/TestBuilder.cs +++ b/SsisUnitTestRunnerUI/TestBuilder.cs @@ -1,364 +1,368 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Windows.Forms; -using SsisUnit; -using Microsoft.SqlServer.Dts.Runtime; -using SsisUnit.Design; -using System.IO; -using System.Xml; - -using SsisUnit.Enums; -using SsisUnit.Packages; - -using SsisUnitBase; - -namespace ssisUnitTestRunnerUI -{ - public partial class testSuiteUI : Form - { - private readonly Microsoft.SqlServer.Dts.Runtime.Application _ssisApp = new Microsoft.SqlServer.Dts.Runtime.Application(); - - private string _currentFileName = string.Empty; - - public testSuiteUI(string testCaseFile) - { - InitializeComponent(); - - LoadCommands(); - - if (testCaseFile == string.Empty || !File.Exists(testCaseFile)) - return; - - _currentFileName = testCaseFile; - testBrowser1.AddTestSuite(testCaseFile); - } - - private void LoadCommands() - { - foreach (Type t in System.Reflection.Assembly.GetAssembly(typeof(CommandBase)).GetTypes()) - { - if (!typeof(CommandBase).IsAssignableFrom(t) || ReferenceEquals(t, typeof(CommandBase)) || t.IsAbstract) - continue; - - ToolStripMenuItem addGenericCommandToolStripMenuItem = new ToolStripMenuItem(t.Name); - addGenericCommandToolStripMenuItem.Name = t.Name; - addGenericCommandToolStripMenuItem.Click += addGenericCommandToolStripMenuItem_Click; - addCommandToolStripMenuItem.DropDownItems.Add(addGenericCommandToolStripMenuItem); - } - } - - private void Form1_Load(object sender, EventArgs e) - { - string titleText = "Test Suite Builder"; - -#if SQL2012 - titleText += " (SSIS 2012)"; -#elif SQL2014 - titleText += " (SSIS 2014)"; -#elif SQL2008 - titleText += " (SSIS 2008)"; -#elif SQL2005 - titleText += " (SSIS 2005)"; -#endif - - Text = titleText; - } - - private void testBrowser1_NodeSelected(object sender, NodeSelectedEventArgs e) - { - propertyGrid1.SelectedObject = e.NewItem; - EnableMenuItems(e.NewItem); - - ISsisUnitPersist item = e.NewItem as ISsisUnitPersist; - - txtXML.Text = item != null ? FormatXml(item.PersistToXml()) : string.Empty; - - // ConnectionRef connectionRef = e.NewItem as ConnectionRef; - - // if (connectionRef != null) - // connectionRef.RefreshInvariantTypeAccessiblity(); - } - - public static string FormatXml(string xml) - { - XmlDocument doc = new XmlDocument(); - XmlDocumentFragment frag = doc.CreateDocumentFragment(); - frag.InnerXml = xml; - - XmlWriterSettings settings = new XmlWriterSettings { OmitXmlDeclaration = true, ConformanceLevel = ConformanceLevel.Fragment, Indent = true }; - MemoryStream memoryStream = new MemoryStream(); - XmlWriter xw = XmlWriter.Create(memoryStream, settings); - - frag.WriteTo(xw); - xw.Flush(); - xw.Close(); - - memoryStream.Position = 0; - StreamReader streamReader = new StreamReader(memoryStream); - - return streamReader.ReadToEnd(); - } - - private void EnableMenuItems(object p) - { - if (p is CommandSet || p is SsisAssert) - addCommandToolStripMenuItem.Enabled = true; - else - addCommandToolStripMenuItem.Enabled = false; - - if (p is Test) - addAssertToolStripMenuItem.Enabled = true; - else - addAssertToolStripMenuItem.Enabled = false; - } - - private void openToolStripMenuItem_Click(object sender, EventArgs e) - { - OpenTestSuite(); - } - - private void OpenTestSuite() - { - string fileName = string.Empty; - - if (UIHelper.ShowOpen(ref fileName, UIHelper.FileFilter.SsisUnit, true) != DialogResult.OK) - return; - - _currentFileName = fileName; - testBrowser1.AddTestSuite(fileName); - } - - private void saveToolStripMenuItem_Click(object sender, EventArgs e) - { - SaveTestSuite(); - } - - private void SaveTestSuite() - { - if (File.Exists(_currentFileName)) - testBrowser1.SaveTestSuite(_currentFileName); - else if (UIHelper.ShowSaveAs(ref _currentFileName, UIHelper.FileFilter.SsisUnit, false) == DialogResult.OK) - testBrowser1.SaveTestSuite(_currentFileName); - } - - private void exitToolStripMenuItem_Click(object sender, EventArgs e) - { - Close(); - } - - private void newToolStripMenuItem_Click(object sender, EventArgs e) - { - CreateTestSuite(); - } - - private void CreateTestSuite() - { - _currentFileName = string.Empty; - testBrowser1.CreateTest(); - } - - private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) - { - if (UIHelper.ShowSaveAs(ref _currentFileName, UIHelper.FileFilter.SsisUnit, false) == DialogResult.OK) - testBrowser1.SaveTestSuite(_currentFileName); - } - - private void testBrowser1_TestSuiteSelected(object sender, TestSuiteSelectedEventArgs e) - { - _currentFileName = e.CurrentFile; - - string titleText = "Test Suite Builder"; - -#if SQL2012 - titleText += " (SSIS 2012)"; -#elif SQL2014 - titleText += " (SSIS 2014)"; -#elif SQL2008 - titleText += " (SSIS 2008)"; -#elif SQL2005 - titleText += " (SSIS 2005)"; -#endif - - Text = titleText + " - " + _currentFileName; - } - - private void addTestToolStripMenuItem_Click(object sender, EventArgs e) - { - testBrowser1.AddTest(); - } - - private void addGenericCommandToolStripMenuItem_Click(object sender, EventArgs e) - { - ToolStripMenuItem tsItem = (ToolStripMenuItem)sender; - testBrowser1.AddCommand(tsItem.Name); - } - - private void addConnectionRefToolStripMenuItem_Click(object sender, EventArgs e) - { - testBrowser1.AddConnectionRef(); - } - - private void deleteSelectedItemToolStripMenuItem_Click(object sender, EventArgs e) - { - testBrowser1.DeleteItem(); - } - - private void addAssertToolStripMenuItem_Click(object sender, EventArgs e) - { - testBrowser1.AddAssert(); - } - - private void addPackageRefToolStripMenuItem_Click(object sender, EventArgs e) - { - testBrowser1.AddPackageRef(); - } - - private void newFromPackageToolStripMenuItem_Click(object sender, EventArgs e) - { - string packageFileName = string.Empty; - - if (UIHelper.ShowOpen(ref packageFileName, UIHelper.FileFilter.DTSX, true) != DialogResult.OK) - return; - - SsisTestSuite ts = CreateTestFromPackage(packageFileName); - - if (ts != null) - testBrowser1.AddTestSuite(ts); - } - - private SsisTestSuite CreateTestFromPackage(string fileName) - { - SsisTestSuite ts = null; - - Package package = _ssisApp.LoadPackage(fileName, null); - PackageBrowser pb = new PackageBrowser { MultiSelect = true }; - - if (pb.ShowDialog(package) == DialogResult.OK) - { - ts = new SsisTestSuite(); - - AddConnectionRefs(ts, package); - AddPackageRefs(ts, package, fileName); - AddTests(ts, package, pb.SelectedTasks); - } - - return ts; - } - - private void AddTests(SsisTestSuite ts, IDTSName package, IEnumerable taskItemList) - { - foreach (TaskItem item in taskItemList) - { - int counter = 1; - string testName = item.Name; - - while (ts.Tests.ContainsKey(testName)) - { - testName = item.Name + counter.ToString(CultureInfo.InvariantCulture); - counter++; - } - - ts.Tests.Add(testName, new Test(ts, testName, package.Name, null, item.ID)); - } - } - - private void AddPackageRefs(SsisTestSuite ts, IDTSName package, string location) - { - if (!ts.PackageList.ContainsKey(package.Name)) - ts.PackageList.Add(package.Name, new PackageRef(package.Name, location, PackageStorageType.FileSystem)); - } - - private void AddConnectionRefs(SsisTestSuite ts, Package package) - { - foreach (ConnectionManager cm in package.Connections) - { - if ((cm.CreationName == "OLEDB" || cm.CreationName.StartsWith("ADO.NET")) && !ts.ConnectionList.ContainsKey(cm.Name)) - ts.ConnectionList.Add(cm.Name, new ConnectionRef(cm.Name, cm.ConnectionString, ConnectionRef.ConnectionTypeEnum.ConnectionString)); - } - } - - private void aboutToolStripMenuItem_Click(object sender, EventArgs e) - { - ShowHelp(); - } - - private void ShowHelp() - { - System.Diagnostics.Process.Start("http://www.codeplex.com/ssisUnit"); - } - - private void runSuiteToolStripMenuItem_Click(object sender, EventArgs e) - { - testBrowser1.RunSuite(); - } - - private void runSelectedTestToolStripMenuItem_Click(object sender, EventArgs e) - { - testBrowser1.RunSelectedTest(); - } - - private void btnRefresh_Click(object sender, EventArgs e) - { - CommandBase commandBase = testBrowser1.SelectedItem as CommandBase; - - if (commandBase != null) - txtXML.Text = commandBase.PersistToXml(); - } - - private void addTestFromPackageToolStripMenuItem_Click(object sender, EventArgs e) - { - string packageFileName = string.Empty; - - if (UIHelper.ShowOpen(ref packageFileName, UIHelper.FileFilter.DTSX, true) == DialogResult.OK) - AddTestFromPackage(packageFileName); - } - - private void AddTestFromPackage(string fileName) - { - Package package = _ssisApp.LoadPackage(fileName, null); - PackageBrowser pb = new PackageBrowser { MultiSelect = true }; - - if (pb.ShowDialog(package) == DialogResult.OK) - { - AddConnectionRefs(testBrowser1.TestSuite, package); - AddPackageRefs(testBrowser1.TestSuite, package, fileName); - AddTests(testBrowser1.TestSuite, package, pb.SelectedTasks); - } - - testBrowser1.RefreshTestSuite(); - } - - private void newToolStripButton_Click(object sender, EventArgs e) - { - CreateTestSuite(); - } - - private void openToolStripButton_Click(object sender, EventArgs e) - { - OpenTestSuite(); - } - - private void saveToolStripButton_Click(object sender, EventArgs e) - { - SaveTestSuite(); - } - - private void runTestSuiteTtoolStripButton_Click(object sender, EventArgs e) - { - try - { - testBrowser1.RunSuite(); - } - catch (Exception ex) - { - MessageBox.Show("An error occurred when performing this operation. " + ex.Message); - } - } - - private void addDatasetToolStripMenuItem_Click(object sender, EventArgs e) - { - testBrowser1.AddDataset(); - } - } +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Windows.Forms; +using SsisUnit; +using Microsoft.SqlServer.Dts.Runtime; +using SsisUnit.Design; +using System.IO; +using System.Xml; + +using SsisUnit.Enums; +using SsisUnit.Packages; + +using SsisUnitBase; + +namespace ssisUnitTestRunnerUI +{ + public partial class testSuiteUI : Form + { + private readonly Microsoft.SqlServer.Dts.Runtime.Application _ssisApp = new Microsoft.SqlServer.Dts.Runtime.Application(); + + private string _currentFileName = string.Empty; + + public testSuiteUI(string testCaseFile) + { + InitializeComponent(); + + LoadCommands(); + + if (testCaseFile == string.Empty || !File.Exists(testCaseFile)) + return; + + _currentFileName = testCaseFile; + testBrowser1.AddTestSuite(testCaseFile); + } + + private void LoadCommands() + { + foreach (Type t in System.Reflection.Assembly.GetAssembly(typeof(CommandBase)).GetTypes()) + { + if (!typeof(CommandBase).IsAssignableFrom(t) || ReferenceEquals(t, typeof(CommandBase)) || t.IsAbstract) + continue; + + ToolStripMenuItem addGenericCommandToolStripMenuItem = new ToolStripMenuItem(t.Name); + addGenericCommandToolStripMenuItem.Name = t.Name; + addGenericCommandToolStripMenuItem.Click += addGenericCommandToolStripMenuItem_Click; + addCommandToolStripMenuItem.DropDownItems.Add(addGenericCommandToolStripMenuItem); + } + } + + private void Form1_Load(object sender, EventArgs e) + { + string titleText = "Test Suite Builder"; + +#if SQL2012 + titleText += " (SSIS 2012)"; +#elif SQL2014 + titleText += " (SSIS 2014)"; +#elif SQL2017 + titleText += " (SSIS 2017)"; +#elif SQL2008 + titleText += " (SSIS 2008)"; +#elif SQL2005 + titleText += " (SSIS 2005)"; +#endif + + Text = titleText; + } + + private void testBrowser1_NodeSelected(object sender, NodeSelectedEventArgs e) + { + propertyGrid1.SelectedObject = e.NewItem; + EnableMenuItems(e.NewItem); + + ISsisUnitPersist item = e.NewItem as ISsisUnitPersist; + + txtXML.Text = item != null ? FormatXml(item.PersistToXml()) : string.Empty; + + // ConnectionRef connectionRef = e.NewItem as ConnectionRef; + + // if (connectionRef != null) + // connectionRef.RefreshInvariantTypeAccessiblity(); + } + + public static string FormatXml(string xml) + { + XmlDocument doc = new XmlDocument(); + XmlDocumentFragment frag = doc.CreateDocumentFragment(); + frag.InnerXml = xml; + + XmlWriterSettings settings = new XmlWriterSettings { OmitXmlDeclaration = true, ConformanceLevel = ConformanceLevel.Fragment, Indent = true }; + MemoryStream memoryStream = new MemoryStream(); + XmlWriter xw = XmlWriter.Create(memoryStream, settings); + + frag.WriteTo(xw); + xw.Flush(); + xw.Close(); + + memoryStream.Position = 0; + StreamReader streamReader = new StreamReader(memoryStream); + + return streamReader.ReadToEnd(); + } + + private void EnableMenuItems(object p) + { + if (p is CommandSet || p is SsisAssert) + addCommandToolStripMenuItem.Enabled = true; + else + addCommandToolStripMenuItem.Enabled = false; + + if (p is Test) + addAssertToolStripMenuItem.Enabled = true; + else + addAssertToolStripMenuItem.Enabled = false; + } + + private void openToolStripMenuItem_Click(object sender, EventArgs e) + { + OpenTestSuite(); + } + + private void OpenTestSuite() + { + string fileName = string.Empty; + + if (UIHelper.ShowOpen(ref fileName, UIHelper.FileFilter.SsisUnit, true) != DialogResult.OK) + return; + + _currentFileName = fileName; + testBrowser1.AddTestSuite(fileName); + } + + private void saveToolStripMenuItem_Click(object sender, EventArgs e) + { + SaveTestSuite(); + } + + private void SaveTestSuite() + { + if (File.Exists(_currentFileName)) + testBrowser1.SaveTestSuite(_currentFileName); + else if (UIHelper.ShowSaveAs(ref _currentFileName, UIHelper.FileFilter.SsisUnit, false) == DialogResult.OK) + testBrowser1.SaveTestSuite(_currentFileName); + } + + private void exitToolStripMenuItem_Click(object sender, EventArgs e) + { + Close(); + } + + private void newToolStripMenuItem_Click(object sender, EventArgs e) + { + CreateTestSuite(); + } + + private void CreateTestSuite() + { + _currentFileName = string.Empty; + testBrowser1.CreateTest(); + } + + private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (UIHelper.ShowSaveAs(ref _currentFileName, UIHelper.FileFilter.SsisUnit, false) == DialogResult.OK) + testBrowser1.SaveTestSuite(_currentFileName); + } + + private void testBrowser1_TestSuiteSelected(object sender, TestSuiteSelectedEventArgs e) + { + _currentFileName = e.CurrentFile; + + string titleText = "Test Suite Builder"; + +#if SQL2012 + titleText += " (SSIS 2012)"; +#elif SQL2014 + titleText += " (SSIS 2014)"; +#elif SQL2017 + titleText += " (SSIS 2017)"; +#elif SQL2008 + titleText += " (SSIS 2008)"; +#elif SQL2005 + titleText += " (SSIS 2005)"; +#endif + + Text = titleText + " - " + _currentFileName; + } + + private void addTestToolStripMenuItem_Click(object sender, EventArgs e) + { + testBrowser1.AddTest(); + } + + private void addGenericCommandToolStripMenuItem_Click(object sender, EventArgs e) + { + ToolStripMenuItem tsItem = (ToolStripMenuItem)sender; + testBrowser1.AddCommand(tsItem.Name); + } + + private void addConnectionRefToolStripMenuItem_Click(object sender, EventArgs e) + { + testBrowser1.AddConnectionRef(); + } + + private void deleteSelectedItemToolStripMenuItem_Click(object sender, EventArgs e) + { + testBrowser1.DeleteItem(); + } + + private void addAssertToolStripMenuItem_Click(object sender, EventArgs e) + { + testBrowser1.AddAssert(); + } + + private void addPackageRefToolStripMenuItem_Click(object sender, EventArgs e) + { + testBrowser1.AddPackageRef(); + } + + private void newFromPackageToolStripMenuItem_Click(object sender, EventArgs e) + { + string packageFileName = string.Empty; + + if (UIHelper.ShowOpen(ref packageFileName, UIHelper.FileFilter.DTSX, true) != DialogResult.OK) + return; + + SsisTestSuite ts = CreateTestFromPackage(packageFileName); + + if (ts != null) + testBrowser1.AddTestSuite(ts); + } + + private SsisTestSuite CreateTestFromPackage(string fileName) + { + SsisTestSuite ts = null; + + Package package = _ssisApp.LoadPackage(fileName, null); + PackageBrowser pb = new PackageBrowser { MultiSelect = true }; + + if (pb.ShowDialog(package) == DialogResult.OK) + { + ts = new SsisTestSuite(); + + AddConnectionRefs(ts, package); + AddPackageRefs(ts, package, fileName); + AddTests(ts, package, pb.SelectedTasks); + } + + return ts; + } + + private void AddTests(SsisTestSuite ts, IDTSName package, IEnumerable taskItemList) + { + foreach (TaskItem item in taskItemList) + { + int counter = 1; + string testName = item.Name; + + while (ts.Tests.ContainsKey(testName)) + { + testName = item.Name + counter.ToString(CultureInfo.InvariantCulture); + counter++; + } + + ts.Tests.Add(testName, new Test(ts, testName, package.Name, null, item.ID)); + } + } + + private void AddPackageRefs(SsisTestSuite ts, IDTSName package, string location) + { + if (!ts.PackageList.ContainsKey(package.Name)) + ts.PackageList.Add(package.Name, new PackageRef(package.Name, location, PackageStorageType.FileSystem)); + } + + private void AddConnectionRefs(SsisTestSuite ts, Package package) + { + foreach (ConnectionManager cm in package.Connections) + { + if ((cm.CreationName == "OLEDB" || cm.CreationName.StartsWith("ADO.NET")) && !ts.ConnectionList.ContainsKey(cm.Name)) + ts.ConnectionList.Add(cm.Name, new ConnectionRef(cm.Name, cm.ConnectionString, ConnectionRef.ConnectionTypeEnum.ConnectionString)); + } + } + + private void aboutToolStripMenuItem_Click(object sender, EventArgs e) + { + ShowHelp(); + } + + private void ShowHelp() + { + System.Diagnostics.Process.Start("http://www.codeplex.com/ssisUnit"); + } + + private void runSuiteToolStripMenuItem_Click(object sender, EventArgs e) + { + testBrowser1.RunSuite(); + } + + private void runSelectedTestToolStripMenuItem_Click(object sender, EventArgs e) + { + testBrowser1.RunSelectedTest(); + } + + private void btnRefresh_Click(object sender, EventArgs e) + { + CommandBase commandBase = testBrowser1.SelectedItem as CommandBase; + + if (commandBase != null) + txtXML.Text = commandBase.PersistToXml(); + } + + private void addTestFromPackageToolStripMenuItem_Click(object sender, EventArgs e) + { + string packageFileName = string.Empty; + + if (UIHelper.ShowOpen(ref packageFileName, UIHelper.FileFilter.DTSX, true) == DialogResult.OK) + AddTestFromPackage(packageFileName); + } + + private void AddTestFromPackage(string fileName) + { + Package package = _ssisApp.LoadPackage(fileName, null); + PackageBrowser pb = new PackageBrowser { MultiSelect = true }; + + if (pb.ShowDialog(package) == DialogResult.OK) + { + AddConnectionRefs(testBrowser1.TestSuite, package); + AddPackageRefs(testBrowser1.TestSuite, package, fileName); + AddTests(testBrowser1.TestSuite, package, pb.SelectedTasks); + } + + testBrowser1.RefreshTestSuite(); + } + + private void newToolStripButton_Click(object sender, EventArgs e) + { + CreateTestSuite(); + } + + private void openToolStripButton_Click(object sender, EventArgs e) + { + OpenTestSuite(); + } + + private void saveToolStripButton_Click(object sender, EventArgs e) + { + SaveTestSuite(); + } + + private void runTestSuiteTtoolStripButton_Click(object sender, EventArgs e) + { + try + { + testBrowser1.RunSuite(); + } + catch (Exception ex) + { + MessageBox.Show("An error occurred when performing this operation. " + ex.Message); + } + } + + private void addDatasetToolStripMenuItem_Click(object sender, EventArgs e) + { + testBrowser1.AddDataset(); + } + } } \ No newline at end of file diff --git a/SsisUnitTestRunnerUI/app.config b/SsisUnitTestRunnerUI/app.config index 4ec54e5..b041bd5 100644 --- a/SsisUnitTestRunnerUI/app.config +++ b/SsisUnitTestRunnerUI/app.config @@ -1,5 +1,5 @@ - - - - - + + + + + diff --git a/SsisUnitTestRunnerUI/ssisUnitTestRunnerUI.2017.csproj b/SsisUnitTestRunnerUI/ssisUnitTestRunnerUI.2017.csproj new file mode 100644 index 0000000..11eb67e --- /dev/null +++ b/SsisUnitTestRunnerUI/ssisUnitTestRunnerUI.2017.csproj @@ -0,0 +1,207 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {A943E51D-D0CC-4EF1-875B-937D0B179241} + WinExe + Properties + ssisUnitTestRunnerUI + ssisUnitTestRunnerUI2017 + v4.5 + 512 + SAK + SAK + SAK + SAK + false + + + + + 3.5 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + true + full + false + bin\Debug\ + TRACE;DEBUG;SQL2017 + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE;SQL2017 + prompt + 4 + false + + + ssisUnitRunner.ico + + + true + bin\x86\Debug\ + TRACE;DEBUG;SQL2017 + full + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + bin\x86\Release\ + TRACE;SQL2017 + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + false + + + + + + + 3.5 + + + + + + + + + + + Form + + + TestBuilder.cs + + + + + TestBuilder.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + TestBrowser.cs + Designer + + + TestResults.cs + + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + UserControl + + + TestBrowser.cs + + + Form + + + TestResults.cs + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + {e693cce8-9edf-4117-ab7f-eb87b87e29ea} + SsisUnitBase + + + {3b38f252-0de8-4639-9af9-ab8b216b685c} + SsisUnit.Design_SQL2017 + + + {8c839f0e-0afd-4d9a-8dee-5c7963e3e6c7} + SSISUnit.2017 + False + + + + + + + + \ No newline at end of file diff --git a/ssisUnit2012Setup/ssisUnit2017Setup.isl b/ssisUnit2012Setup/ssisUnit2017Setup.isl new file mode 100644 index 0000000..96bdde6 --- /dev/null +++ b/ssisUnit2012Setup/ssisUnit2017Setup.isl @@ -0,0 +1,5779 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + 1252 + Installation Database + ##ID_STRING5## + ##ID_STRING4## + Installer,MSI,Database + Contact: Your local administrator + + Administrator + {81F7C34E-8395-4524-AC6F-AAE5AC9E8DC8} + + 06/21/1999 09:00 + 07/14/2000 12:50 + 200 + 0 + + InstallShield Express + 1 + + + + Action + Description + Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advertise##IDS_ACTIONTEXT_Advertising## + AllocateRegistrySpace##IDS_ACTIONTEXT_AllocatingRegistry####IDS_ACTIONTEXT_FreeSpace##AppSearch##IDS_ACTIONTEXT_SearchInstalled####IDS_ACTIONTEXT_PropertySignature##BindImage##IDS_ACTIONTEXT_BindingExes####IDS_ACTIONTEXT_File##CCPSearch##IDS_ACTIONTEXT_UnregisterModules## + CostFinalize##IDS_ACTIONTEXT_ComputingSpace3## + CostInitialize##IDS_ACTIONTEXT_ComputingSpace## + CreateFolders##IDS_ACTIONTEXT_CreatingFolders####IDS_ACTIONTEXT_Folder##CreateShortcuts##IDS_ACTIONTEXT_CreatingShortcuts####IDS_ACTIONTEXT_Shortcut##DeleteServices##IDS_ACTIONTEXT_DeletingServices####IDS_ACTIONTEXT_Service##DuplicateFiles##IDS_ACTIONTEXT_CreatingDuplicate####IDS_ACTIONTEXT_FileDirectorySize##FileCost##IDS_ACTIONTEXT_ComputingSpace2## + FindRelatedProducts##IDS_ACTIONTEXT_SearchForRelated####IDS_ACTIONTEXT_FoundApp##GenerateScript##IDS_ACTIONTEXT_GeneratingScript####IDS_ACTIONTEXT_1##ISLockPermissionsCost##IDS_ACTIONTEXT_ISLockPermissionsCost## + ISLockPermissionsInstall##IDS_ACTIONTEXT_ISLockPermissionsInstall## + InstallAdminPackage##IDS_ACTIONTEXT_CopyingNetworkFiles####IDS_ACTIONTEXT_FileDirSize##InstallFiles##IDS_ACTIONTEXT_CopyingNewFiles####IDS_ACTIONTEXT_FileDirSize2##InstallODBC##IDS_ACTIONTEXT_InstallODBC## + InstallSFPCatalogFile##IDS_ACTIONTEXT_InstallingSystemCatalog####IDS_ACTIONTEXT_FileDependencies##InstallServices##IDS_ACTIONTEXT_InstallServices####IDS_ACTIONTEXT_Service2##InstallValidate##IDS_ACTIONTEXT_Validating## + LaunchConditions##IDS_ACTIONTEXT_EvaluateLaunchConditions## + MigrateFeatureStates##IDS_ACTIONTEXT_MigratingFeatureStates####IDS_ACTIONTEXT_Application##MoveFiles##IDS_ACTIONTEXT_MovingFiles####IDS_ACTIONTEXT_FileDirSize3##PatchFiles##IDS_ACTIONTEXT_PatchingFiles####IDS_ACTIONTEXT_FileDirSize4##ProcessComponents##IDS_ACTIONTEXT_UpdateComponentRegistration## + PublishComponents##IDS_ACTIONTEXT_PublishingQualifiedComponents####IDS_ACTIONTEXT_ComponentIDQualifier##PublishFeatures##IDS_ACTIONTEXT_PublishProductFeatures####IDS_ACTIONTEXT_FeatureColon##PublishProduct##IDS_ACTIONTEXT_PublishProductInfo## + RMCCPSearch##IDS_ACTIONTEXT_SearchingQualifyingProducts## + RegisterClassInfo##IDS_ACTIONTEXT_RegisterClassServer####IDS_ACTIONTEXT_ClassId##RegisterComPlus##IDS_ACTIONTEXT_RegisteringComPlus####IDS_ACTIONTEXT_AppIdAppTypeRSN##RegisterExtensionInfo##IDS_ACTIONTEXT_RegisterExtensionServers####IDS_ACTIONTEXT_Extension2##RegisterFonts##IDS_ACTIONTEXT_RegisterFonts####IDS_ACTIONTEXT_Font##RegisterMIMEInfo##IDS_ACTIONTEXT_RegisterMimeInfo####IDS_ACTIONTEXT_ContentTypeExtension##RegisterProduct##IDS_ACTIONTEXT_RegisteringProduct####IDS_ACTIONTEXT_1b##RegisterProgIdInfo##IDS_ACTIONTEXT_RegisteringProgIdentifiers####IDS_ACTIONTEXT_ProgID2##RegisterTypeLibraries##IDS_ACTIONTEXT_RegisterTypeLibs####IDS_ACTIONTEXT_LibId##RegisterUser##IDS_ACTIONTEXT_RegUser####IDS_ACTIONTEXT_1c##RemoveDuplicateFiles##IDS_ACTIONTEXT_RemovingDuplicates####IDS_ACTIONTEXT_FileDir##RemoveEnvironmentStrings##IDS_ACTIONTEXT_UpdateEnvironmentStrings####IDS_ACTIONTEXT_NameValueAction2##RemoveExistingProducts##IDS_ACTIONTEXT_RemoveApps####IDS_ACTIONTEXT_AppCommandLine##RemoveFiles##IDS_ACTIONTEXT_RemovingFiles####IDS_ACTIONTEXT_FileDir2##RemoveFolders##IDS_ACTIONTEXT_RemovingFolders####IDS_ACTIONTEXT_Folder1##RemoveIniValues##IDS_ACTIONTEXT_RemovingIni####IDS_ACTIONTEXT_FileSectionKeyValue##RemoveODBC##IDS_ACTIONTEXT_RemovingODBC## + RemoveRegistryValues##IDS_ACTIONTEXT_RemovingRegistry####IDS_ACTIONTEXT_KeyName##RemoveShortcuts##IDS_ACTIONTEXT_RemovingShortcuts####IDS_ACTIONTEXT_Shortcut1##Rollback##IDS_ACTIONTEXT_RollingBack####IDS_ACTIONTEXT_1d##RollbackCleanup##IDS_ACTIONTEXT_RemovingBackup####IDS_ACTIONTEXT_File2##SelfRegModules##IDS_ACTIONTEXT_RegisteringModules####IDS_ACTIONTEXT_FileFolder##SelfUnregModules##IDS_ACTIONTEXT_UnregisterModules####IDS_ACTIONTEXT_FileFolder2##SetODBCFolders##IDS_ACTIONTEXT_InitializeODBCDirs## + StartServices##IDS_ACTIONTEXT_StartingServices####IDS_ACTIONTEXT_Service3##StopServices##IDS_ACTIONTEXT_StoppingServices####IDS_ACTIONTEXT_Service4##UnmoveFiles##IDS_ACTIONTEXT_RemovingMoved####IDS_ACTIONTEXT_FileDir3##UnpublishComponents##IDS_ACTIONTEXT_UnpublishQualified####IDS_ACTIONTEXT_ComponentIdQualifier2##UnpublishFeatures##IDS_ACTIONTEXT_UnpublishProductFeatures####IDS_ACTIONTEXT_Feature##UnpublishProduct##IDS_ACTIONTEXT_UnpublishingProductInfo## + UnregisterClassInfo##IDS_ACTIONTEXT_UnregisterClassServers####IDS_ACTIONTEXT_ClsID##UnregisterComPlus##IDS_ACTIONTEXT_UnregisteringComPlus####IDS_ACTIONTEXT_AppId##UnregisterExtensionInfo##IDS_ACTIONTEXT_UnregisterExtensionServers####IDS_ACTIONTEXT_Extension##UnregisterFonts##IDS_ACTIONTEXT_UnregisteringFonts####IDS_ACTIONTEXT_Font2##UnregisterMIMEInfo##IDS_ACTIONTEXT_UnregisteringMimeInfo####IDS_ACTIONTEXT_ContentTypeExtension2##UnregisterProgIdInfo##IDS_ACTIONTEXT_UnregisteringProgramIds####IDS_ACTIONTEXT_ProgID##UnregisterTypeLibraries##IDS_ACTIONTEXT_UnregTypeLibs####IDS_ACTIONTEXT_Libid2##WriteEnvironmentStrings##IDS_ACTIONTEXT_EnvironmentStrings####IDS_ACTIONTEXT_NameValueAction##WriteIniValues##IDS_ACTIONTEXT_WritingINI####IDS_ACTIONTEXT_FileSectionKeyValue2##WriteRegistryValues##IDS_ACTIONTEXT_WritingRegistry####IDS_ACTIONTEXT_KeyNameValue##
+ + + Action + Condition + Sequence + ISComments + ISAttributes +
CostFinalize1000CostFinalize + CostInitialize800CostInitialize + FileCost900FileCost + InstallAdminPackage3900InstallAdminPackage + InstallFiles4000InstallFiles + InstallFinalize6600InstallFinalize + InstallInitialize1500InstallInitialize + InstallValidate1400InstallValidate + ScheduleRebootISSCHEDULEREBOOT4010ScheduleReboot +
+ + + Action + Condition + Sequence + ISComments + ISAttributes +
AdminWelcome1010AdminWelcome + CostFinalize1000CostFinalize + CostInitialize800CostInitialize + ExecuteAction1300ExecuteAction + FileCost900FileCost + SetupCompleteError-3SetupCompleteError + SetupCompleteSuccess-1SetupCompleteSuccess + SetupInitialization50SetupInitialization + SetupInterrupted-2SetupInterrupted + SetupProgress1020SetupProgress +
+ + + Action + Condition + Sequence + ISComments + ISAttributes +
CostFinalize1000CostFinalize + CostInitialize800CostInitialize + CreateShortcuts4500CreateShortcuts + InstallFinalize6600InstallFinalize + InstallInitialize1500InstallInitialize + InstallValidate1400InstallValidate + MsiPublishAssemblies6250MsiPublishAssemblies + PublishComponents6200PublishComponents + PublishFeatures6300PublishFeatures + PublishProduct6400PublishProduct + RegisterClassInfo4600RegisterClassInfo + RegisterExtensionInfo4700RegisterExtensionInfo + RegisterMIMEInfo4900RegisterMIMEInfo + RegisterProgIdInfo4800RegisterProgIdInfo + RegisterTypeLibraries4910RegisterTypeLibraries + ScheduleRebootISSCHEDULEREBOOT6410ScheduleReboot +
+ + + Action + Condition + Sequence + ISComments + ISAttributes +
+ + + AppId + RemoteServerName + LocalService + ServiceParameters + DllSurrogate + ActivateAtStorage + RunAsInteractiveUser +
+ + + Property + Signature_ + +
DOTNETVERSION40FULLDotNet40Full
+ + + Billboard_ + BBControl + Type + X + Y + Width + Height + Attributes + Text +
+ + + Billboard + Feature_ + Action + Ordering +
+ + + Name + Data + ISBuildSourcePath + + + + + + + + + + + + + + + + + + + + + +
ISExpHlp.dll<ISRedistPlatformDependentFolder>\ISExpHlp.dllISSELFREG.DLL<ISRedistPlatformDependentFolder>\isregsvr.dllNewBinary1<ISProductFolder>\Support\Themes\InstallShield Blue Theme\banner.jpgNewBinary10<ISProductFolder>\Redist\Language Independent\OS Independent\CompleteSetupIco.ibdNewBinary11<ISProductFolder>\Redist\Language Independent\OS Independent\CustomSetupIco.ibdNewBinary12<ISProductFolder>\Redist\Language Independent\OS Independent\DestIcon.ibdNewBinary13<ISProductFolder>\Redist\Language Independent\OS Independent\NetworkInstall.icoNewBinary14<ISProductFolder>\Redist\Language Independent\OS Independent\DontInstall.icoNewBinary15<ISProductFolder>\Redist\Language Independent\OS Independent\Install.icoNewBinary16<ISProductFolder>\Redist\Language Independent\OS Independent\InstallFirstUse.icoNewBinary17<ISProductFolder>\Redist\Language Independent\OS Independent\InstallPartial.icoNewBinary18<ISProductFolder>\Redist\Language Independent\OS Independent\InstallStateMenu.icoNewBinary2<ISProductFolder>\Redist\Language Independent\OS Independent\New.ibdNewBinary3<ISProductFolder>\Redist\Language Independent\OS Independent\Up.ibdNewBinary4<ISProductFolder>\Redist\Language Independent\OS Independent\WarningIcon.ibdNewBinary5<ISProductFolder>\Support\Themes\InstallShield Blue Theme\welcome.jpgNewBinary6<ISProductFolder>\Redist\Language Independent\OS Independent\CustomSetupIco.ibdNewBinary7<ISProductFolder>\Redist\Language Independent\OS Independent\ReinstIco.ibdNewBinary8<ISProductFolder>\Redist\Language Independent\OS Independent\RemoveIco.ibdNewBinary9<ISProductFolder>\Redist\Language Independent\OS Independent\SetupIcon.ibdSetAllUsers.dll<ISRedistPlatformDependentFolder>\SetAllUsers.dll
+ + + File_ + Path +
+ + + Signature_ +
+ + + Property + Value + + + +
ISCHECKFORPRODUCTUPDATES1LAUNCHPROGRAM1LAUNCHREADME1
+ + + CLSID + Context + Component_ + ProgId_Default + Description + AppId_ + FileTypeMask + Icon_ + IconIndex + DefInprocHandler + Argument + Feature_ + Attributes +
+ + + Property + Order + Value + Text +
+ + + Signature_ + ComponentId + Type +
+ + + Component_ + ExpType +
+ + + Component + ComponentId + Directory_ + Attributes + Condition + KeyPath + ISAttributes + ISComments + ISScanAtBuildFile + ISRegFileToMergeAtBuild + ISDotNetInstallerArgsInstall + ISDotNetInstallerArgsCommit + ISDotNetInstallerArgsUninstall + ISDotNetInstallerArgsRollback + + + + + + + +
ISX_DEFAULTCOMPONENT{A5828B7A-687C-403E-B446-00DB421EE3F6}INSTALLDIR217/LogFile=/LogFile=/LogFile=/LogFile=SSISUnit.2017.Primary_output{CE620135-FCB3-4DC7-B679-768C2B559E50}INSTALLDIR2ssisunit.2017.primary_output17/LogFile=/LogFile=/LogFile=/LogFile=SsisUnit.Design_SQL2017.Primary_output{C566E602-204B-4D66-951C-EB2B59BE3A8D}INSTALLDIR2ssisunit.design_sql2017.prim17/LogFile=/LogFile=/LogFile=/LogFile=SsisUnit.TestComponents.2017.Primary_output{B3B79EDB-56AC-4024-8532-B834C1410507}INSTALLDIR2ssisunit.testcomponents.201717/LogFile=/LogFile=/LogFile=/LogFile=SsisUnitBase.Primary_output{1C683364-6D50-4479-AD42-9A9126CDE5AF}INSTALLDIR2ssisunitbase.primary_output17/LogFile=/LogFile=/LogFile=/LogFile=ssisUnit.TestRunner.2017.Primary_output{D57BFEBA-B967-46CE-81DA-7774330729BD}INSTALLDIR2ssisunit.testrunner.2017.pri17/LogFile=/LogFile=/LogFile=/LogFile=ssisUnitTestRunnerUI.2017.Primary_output{0F12F548-68AD-47F0-BC1D-36ECBD66F013}INSTALLDIR2ssisunittestrunnerui.2017.pr17/LogFile=/LogFile=/LogFile=/LogFile=
+ + + Feature_ + Level + Condition +
+ + + Dialog_ + Control + Type + X + Y + Width + Height + Attributes + Property + Text + Control_Next + Help + ISWindowStyle + ISControlId + ISBuildSourcePath + Binary_ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdminChangeFolderBannerBitmap003744410NewBinary1AdminChangeFolderBannerLineLine044374010 + AdminChangeFolderBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + AdminChangeFolderBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + AdminChangeFolderCancelPushButton30124366173##IDS_CANCEL##ComboText0 + AdminChangeFolderComboDirectoryCombo216427780458755TARGETDIR##IDS__IsAdminInstallBrowse_4##Up0 + AdminChangeFolderComboTextText215099143##IDS__IsAdminInstallBrowse_LookIn##Combo0 + AdminChangeFolderDlgDescText21232922565539##IDS__IsAdminInstallBrowse_BrowseDestination##0 + AdminChangeFolderDlgLineLine48234326010 + AdminChangeFolderDlgTitleText1362922565539##IDS__IsAdminInstallBrowse_ChangeDestination##0 + AdminChangeFolderListDirectoryList2190332977TARGETDIR##IDS__IsAdminInstallBrowse_8##TailText0 + AdminChangeFolderNewFolderPushButton3356619193670019List##IDS__IsAdminInstallBrowse_CreateFolder##0NewBinary2AdminChangeFolderOKPushButton23024366173##IDS_OK##Cancel0 + AdminChangeFolderTailPathEdit21207332173TARGETDIR##IDS__IsAdminInstallBrowse_11##OK0 + AdminChangeFolderTailTextText2119399133##IDS__IsAdminInstallBrowse_FolderName##Tail0 + AdminChangeFolderUpPushButton3106619193670019NewFolder##IDS__IsAdminInstallBrowse_UpOneLevel##0NewBinary3AdminNetworkLocationBackPushButton16424366173##IDS_BACK##InstallNow0 + AdminNetworkLocationBannerBitmap003744410NewBinary1AdminNetworkLocationBannerLineLine044374010 + AdminNetworkLocationBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + AdminNetworkLocationBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + AdminNetworkLocationBrowsePushButton28612466173##IDS__IsAdminInstallPoint_Change##Back0 + AdminNetworkLocationCancelPushButton30124366173##IDS_CANCEL##SetupPathEdit0 + AdminNetworkLocationDlgDescText21232922565539##IDS__IsAdminInstallPoint_SpecifyNetworkLocation##0 + AdminNetworkLocationDlgLineLine48234326010 + AdminNetworkLocationDlgTextText215132640131075##IDS__IsAdminInstallPoint_EnterNetworkLocation##0 + AdminNetworkLocationDlgTitleText1362922565539##IDS__IsAdminInstallPoint_NetworkLocationFormatted##0 + AdminNetworkLocationInstallNowPushButton23024366173##IDS__IsAdminInstallPoint_Install##Cancel0 + AdminNetworkLocationLBBrowseText2190100103##IDS__IsAdminInstallPoint_NetworkLocation##0 + AdminNetworkLocationSetupPathEditPathEdit21102330173TARGETDIRBrowse0 + AdminWelcomeBackPushButton16424366171##IDS_BACK##Next0 + AdminWelcomeCancelPushButton30124366173##IDS_CANCEL##Back0 + AdminWelcomeDlgLineLine0234326010 + AdminWelcomeImageBitmap0037423410NewBinary5AdminWelcomeNextPushButton23024366173##IDS_NEXT##Cancel0 + AdminWelcomeTextLine1Text135822545196611##IDS__IsAdminInstallPointWelcome_Wizard##0 + AdminWelcomeTextLine2Text1355522845196611##IDS__IsAdminInstallPointWelcome_ServerImage##0 + CancelSetupIconIcon1515242452428810NewBinary4CancelSetupNoPushButton1355766173##IDS__IsCancelDlg_No##Yes0 + CancelSetupTextText481519430131075##IDS__IsCancelDlg_ConfirmCancel##0 + CancelSetupYesPushButton625766173##IDS__IsCancelDlg_Yes##No0 + CustomSetupBackPushButton16424366173##IDS_BACK##Next0 + CustomSetupBannerBitmap003744410NewBinary1CustomSetupBannerLineLine044374010 + CustomSetupBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + CustomSetupBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + CustomSetupCancelPushButton30124366173##IDS_CANCEL##Tree0 + CustomSetupChangeFolderPushButton30120366173##IDS__IsCustomSelectionDlg_Change##Help0 + CustomSetupDetailsPushButton9324366173##IDS__IsCustomSelectionDlg_Space##Back0 + CustomSetupDlgDescText17232922565539##IDS__IsCustomSelectionDlg_SelectFeatures##0 + CustomSetupDlgLineLine48234326010 + CustomSetupDlgTextText951360103##IDS__IsCustomSelectionDlg_ClickFeatureIcon##0 + CustomSetupDlgTitleText962922565539##IDS__IsCustomSelectionDlg_CustomSetup##0 + CustomSetupFeatureGroupGroupBox235671311201##IDS__IsCustomSelectionDlg_FeatureDescription##0 + CustomSetupHelpPushButton2224366173##IDS__IsCustomSelectionDlg_Help##Details0 + CustomSetupInstallLabelText8190360103##IDS__IsCustomSelectionDlg_InstallTo##0 + CustomSetupItemDescriptionText24180120503##IDS__IsCustomSelectionDlg_MultilineDescription##0 + CustomSetupLocationText8203291203##IDS__IsCustomSelectionDlg_FeaturePath##0 + CustomSetupNextPushButton23024366173##IDS_NEXT##Cancel0 + CustomSetupSizeText241133120503##IDS__IsCustomSelectionDlg_FeatureSize##0 + CustomSetupTreeSelectionTree8702201187_BrowsePropertyChangeFolder0 + CustomSetupTipsBannerBitmap003744410NewBinary1CustomSetupTipsBannerLineLine044374010 + CustomSetupTipsBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + CustomSetupTipsBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + CustomSetupTipsDlgDescText21232922565539##IDS_SetupTips_CustomSetupDescription##0 + CustomSetupTipsDlgLineLine48234326010 + CustomSetupTipsDlgTitleText1362922565539##IDS_SetupTips_CustomSetup##0 + CustomSetupTipsDontInstallIcon21155242452428810NewBinary14CustomSetupTipsDontInstallTextText60155300203##IDS_SetupTips_WillNotBeInstalled##0 + CustomSetupTipsFirstInstallTextText60180300203##IDS_SetupTips_Advertise##0 + CustomSetupTipsInstallIcon21105242452428810NewBinary15CustomSetupTipsInstallFirstUseIcon21180242452428810NewBinary16CustomSetupTipsInstallPartialIcon21130242452428810NewBinary17CustomSetupTipsInstallStateMenuIcon2152242452428810NewBinary18CustomSetupTipsInstallStateTextText2191300103##IDS_SetupTips_InstallState##00 + CustomSetupTipsInstallTextText60105300203##IDS_SetupTips_AllInstalledLocal##0 + CustomSetupTipsMenuTextText5052300363##IDS_SetupTips_IconInstallState##0 + CustomSetupTipsNetworkInstallIcon21205242452428810NewBinary13CustomSetupTipsNetworkInstallTextText60205300203##IDS_SetupTips_Network##0 + CustomSetupTipsOKPushButton30124366173##IDS_SetupTips_OK##0 + CustomSetupTipsPartialTextText60130300203##IDS_SetupTips_SubFeaturesInstalledLocal##0 + CustomerInformationBackPushButton16424366173##IDS_BACK##Next0 + CustomerInformationBannerBitmap003744410NewBinary1CustomerInformationBannerLineLine044374010 + CustomerInformationBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + CustomerInformationBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + CustomerInformationCancelPushButton30124366173##IDS_CANCEL##NameLabel0 + CustomerInformationCompanyEditEdit21100237173COMPANYNAME##IDS__IsRegisterUserDlg_Tahoma80##SerialLabel0 + CustomerInformationCompanyLabelText218975103##IDS__IsRegisterUserDlg_Organization##CompanyEdit0 + CustomerInformationDlgDescText21232922565539##IDS__IsRegisterUserDlg_PleaseEnterInfo##0 + CustomerInformationDlgLineLine48234326010 + CustomerInformationDlgRadioGroupTextText21161300142##IDS__IsRegisterUserDlg_InstallFor##0 + CustomerInformationDlgTitleText1362922565539##IDS__IsRegisterUserDlg_CustomerInformation##0 + CustomerInformationNameEditEdit2163237173USERNAME##IDS__IsRegisterUserDlg_Tahoma50##CompanyLabel0 + CustomerInformationNameLabelText215275103##IDS__IsRegisterUserDlg_UserName##NameEdit0 + CustomerInformationNextPushButton23024366173##IDS_NEXT##Cancel0 + CustomerInformationRadioGroupRadioButtonGroup63170300502ApplicationUsers##IDS__IsRegisterUserDlg_16##Back0 + CustomerInformationSerialLabelText21127109102##IDS__IsRegisterUserDlg_SerialNumber##SerialNumber0 + CustomerInformationSerialNumberMaskedEdit21138237172ISX_SERIALNUMRadioGroup0 + DatabaseFolderBackPushButton16424366173##IDS_BACK##Next0 + DatabaseFolderBannerBitmap003744410NewBinary1DatabaseFolderBannerLineLine044374010 + DatabaseFolderBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + DatabaseFolderBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + DatabaseFolderCancelPushButton30124366173##IDS_CANCEL##ChangeFolder0 + DatabaseFolderChangeFolderPushButton3016566173##IDS_CHANGE##Back0 + DatabaseFolderDatabaseFolderIcon2152242452428810NewBinary12DatabaseFolderDlgDescText21232922565539##IDS__DatabaseFolder_ChangeFolder##0 + DatabaseFolderDlgLineLine48234326010 + DatabaseFolderDlgTitleText1362922565539##IDS__DatabaseFolder_DatabaseFolder##0 + DatabaseFolderLocLabelText575229010131075##IDS_DatabaseFolder_InstallDatabaseTo##0 + DatabaseFolderLocationText5765240403_BrowseProperty##IDS__DatabaseFolder_DatabaseDir##0 + DatabaseFolderNextPushButton23024366173##IDS_NEXT##Cancel0 + DestinationFolderBackPushButton16424366173##IDS_BACK##Next0 + DestinationFolderBannerBitmap003744410NewBinary1DestinationFolderBannerLineLine044374010 + DestinationFolderBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + DestinationFolderBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + DestinationFolderCancelPushButton30124366173##IDS_CANCEL##ChangeFolder0 + DestinationFolderChangeFolderPushButton3016566173##IDS__DestinationFolder_Change##Back0 + DestinationFolderDestFolderIcon2152242452428810NewBinary12DestinationFolderDlgDescText21232922565539##IDS__DestinationFolder_ChangeFolder##0 + DestinationFolderDlgLineLine48234326010 + DestinationFolderDlgTitleText1362922565539##IDS__DestinationFolder_DestinationFolder##0 + DestinationFolderLocLabelText575229010131075##IDS__DestinationFolder_InstallTo##0 + DestinationFolderLocationText5765240403_BrowseProperty##IDS_INSTALLDIR##0 + DestinationFolderNextPushButton23024366173##IDS_NEXT##Cancel0 + DiskSpaceRequirementsBannerBitmap003744410NewBinary1DiskSpaceRequirementsBannerLineLine044374010 + DiskSpaceRequirementsBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + DiskSpaceRequirementsBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + DiskSpaceRequirementsDlgDescText17232922565539##IDS__IsFeatureDetailsDlg_SpaceRequired##0 + DiskSpaceRequirementsDlgLineLine48234326010 + DiskSpaceRequirementsDlgTextText10185358413##IDS__IsFeatureDetailsDlg_VolumesTooSmall##0 + DiskSpaceRequirementsDlgTitleText962922565539##IDS__IsFeatureDetailsDlg_DiskSpaceRequirements##0 + DiskSpaceRequirementsListVolumeCostList855358125393223##IDS__IsFeatureDetailsDlg_Numbers##0 + DiskSpaceRequirementsOKPushButton30124366173##IDS__IsFeatureDetailsDlg_OK##0 + FilesInUseBannerBitmap003744410NewBinary1FilesInUseBannerLineLine044374010 + FilesInUseBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + FilesInUseBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + FilesInUseDlgDescText21232922565539##IDS__IsFilesInUse_FilesInUseMessage##0 + FilesInUseDlgLineLine48234326010 + FilesInUseDlgTextText2151348333##IDS__IsFilesInUse_ApplicationsUsingFiles##0 + FilesInUseDlgTitleText1362922565539##IDS__IsFilesInUse_FilesInUse##0 + FilesInUseExitPushButton30124366173##IDS__IsFilesInUse_Exit##List0 + FilesInUseIgnorePushButton23024366173##IDS__IsFilesInUse_Ignore##Exit0 + FilesInUseListListBox21873311357FileInUseProcessRetry0 + FilesInUseRetryPushButton16424366173##IDS__IsFilesInUse_Retry##Ignore0 + InstallChangeFolderBannerBitmap003744410NewBinary1InstallChangeFolderBannerLineLine044374010 + InstallChangeFolderBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + InstallChangeFolderBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + InstallChangeFolderCancelPushButton30124366173##IDS_CANCEL##ComboText0 + InstallChangeFolderComboDirectoryCombo2164277804128779_BrowseProperty##IDS__IsBrowseFolderDlg_4##Up0 + InstallChangeFolderComboTextText215099143##IDS__IsBrowseFolderDlg_LookIn##Combo0 + InstallChangeFolderDlgDescText21232922565539##IDS__IsBrowseFolderDlg_BrowseDestFolder##0 + InstallChangeFolderDlgLineLine48234326010 + InstallChangeFolderDlgTitleText1362922565539##IDS__IsBrowseFolderDlg_ChangeCurrentFolder##0 + InstallChangeFolderListDirectoryList21903329715_BrowseProperty##IDS__IsBrowseFolderDlg_8##TailText0 + InstallChangeFolderNewFolderPushButton3356619193670019List##IDS__IsBrowseFolderDlg_CreateFolder##0NewBinary2InstallChangeFolderOKPushButton23024366173##IDS__IsBrowseFolderDlg_OK##Cancel0 + InstallChangeFolderTailPathEdit212073321715_BrowseProperty##IDS__IsBrowseFolderDlg_11##OK0 + InstallChangeFolderTailTextText2119399133##IDS__IsBrowseFolderDlg_FolderName##Tail0 + InstallChangeFolderUpPushButton3106619193670019NewFolder##IDS__IsBrowseFolderDlg_UpOneLevel##0NewBinary3InstallWelcomeBackPushButton16424366171##IDS_BACK##Copyright0 + InstallWelcomeCancelPushButton30124366173##IDS_CANCEL##Back0 + InstallWelcomeCopyrightText1351442287365539##IDS__IsWelcomeDlg_WarningCopyright##Next0 + InstallWelcomeDlgLineLine0234374010 + InstallWelcomeImageBitmap0037423410NewBinary5InstallWelcomeNextPushButton23024366173##IDS_NEXT##Cancel0 + InstallWelcomeTextLine1Text135822545196611##IDS__IsWelcomeDlg_WelcomeProductName##0 + InstallWelcomeTextLine2Text1355522845196611##IDS__IsWelcomeDlg_InstallProductName##0 + LicenseAgreementAgreeRadioButtonGroup8190291403AgreeToLicenseBack0 + LicenseAgreementBackPushButton16424366173##IDS_BACK##Next0 + LicenseAgreementBannerBitmap003744410NewBinary1LicenseAgreementBannerLineLine044374010 + LicenseAgreementBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + LicenseAgreementBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + LicenseAgreementCancelPushButton30124366173##IDS_CANCEL##ISPrintButton0 + LicenseAgreementDlgDescText21232922565539##IDS__IsLicenseDlg_ReadLicenseAgreement##0 + LicenseAgreementDlgLineLine48234326010 + LicenseAgreementDlgTitleText1362922565539##IDS__IsLicenseDlg_LicenseAgreement##0 + LicenseAgreementISPrintButtonPushButton30118865173##IDS_PRINT_BUTTON##Agree0 + LicenseAgreementMemoScrollableText85535813070C:\Projects\ssisUnit\MAIN\SsisUnit\Eula.rtf + LicenseAgreementNextPushButton23024366173##IDS_NEXT##Cancel0 + MaintenanceTypeBackPushButton16424366173##IDS_BACK##Next0 + MaintenanceTypeBannerBitmap003744410NewBinary1MaintenanceTypeBannerLineLine044374010 + MaintenanceTypeBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + MaintenanceTypeBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + MaintenanceTypeCancelPushButton30124366173##IDS_CANCEL##RadioGroup0 + MaintenanceTypeDlgDescText21232922565539##IDS__IsMaintenanceDlg_MaitenanceOptions##0 + MaintenanceTypeDlgLineLine48234326010 + MaintenanceTypeDlgTitleText1362922565539##IDS__IsMaintenanceDlg_ProgramMaintenance##0 + MaintenanceTypeIco1Icon3575242452428810NewBinary6MaintenanceTypeIco2Icon35135242452428810NewBinary7MaintenanceTypeIco3Icon35195242452428810NewBinary8MaintenanceTypeNextPushButton23024366173##IDS_NEXT##Cancel0 + MaintenanceTypeRadioGroupRadioButtonGroup21552901703_IsMaintenanceBack0 + MaintenanceTypeText1Text8072260353##IDS__IsMaintenanceDlg_ChangeFeatures##0 + MaintenanceTypeText2Text80135260353##IDS__IsMaintenanceDlg_RepairMessage##0 + MaintenanceTypeText3Text8019226035131075##IDS__IsMaintenanceDlg_RemoveProductName##0 + MaintenanceWelcomeBackPushButton16424366171##IDS_BACK##Next0 + MaintenanceWelcomeCancelPushButton30124366173##IDS_CANCEL##Back0 + MaintenanceWelcomeDlgLineLine0234374010 + MaintenanceWelcomeImageBitmap0037423410NewBinary5MaintenanceWelcomeNextPushButton23024366173##IDS_NEXT##Cancel0 + MaintenanceWelcomeTextLine1Text135822545196611##IDS__IsMaintenanceWelcome_WizardWelcome##0 + MaintenanceWelcomeTextLine2Text1355522850196611##IDS__IsMaintenanceWelcome_MaintenanceOptionsDescription##0 + MsiRMFilesInUseBannerBitmap003744410NewBinary1MsiRMFilesInUseBannerLineLine044374010 + MsiRMFilesInUseBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + MsiRMFilesInUseBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + MsiRMFilesInUseCancelPushButton30124366173##IDS_CANCEL##Restart0 + MsiRMFilesInUseDlgDescText21232922565539##IDS__IsFilesInUse_FilesInUseMessage##0 + MsiRMFilesInUseDlgLineLine48234326010 + MsiRMFilesInUseDlgTextText2151348143##IDS__IsMsiRMFilesInUse_ApplicationsUsingFiles##0 + MsiRMFilesInUseDlgTitleText1362922565539##IDS__IsFilesInUse_FilesInUse##0 + MsiRMFilesInUseListListBox21663311303FileInUseProcessOK0 + MsiRMFilesInUseOKPushButton23024366173##IDS_OK##Cancel0 + MsiRMFilesInUseRestartRadioButtonGroup19187343403RestartManagerOptionList0 + OutOfSpaceBannerBitmap003744410NewBinary1OutOfSpaceBannerLineLine044374010 + OutOfSpaceBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + OutOfSpaceBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + OutOfSpaceDlgDescText21232922565539##IDS__IsDiskSpaceDlg_DiskSpace##0 + OutOfSpaceDlgLineLine48234326010 + OutOfSpaceDlgTextText2151326433##IDS__IsDiskSpaceDlg_HighlightedVolumes##0 + OutOfSpaceDlgTitleText1362922565539##IDS__IsDiskSpaceDlg_OutOfDiskSpace##0 + OutOfSpaceListVolumeCostList2195332120393223##IDS__IsDiskSpaceDlg_Numbers##0 + OutOfSpaceResumePushButton30124366173##IDS__IsDiskSpaceDlg_OK##0 + PatchWelcomeBackPushButton16424366171##IDS_BACK##Next0 + PatchWelcomeCancelPushButton30124366173##IDS_CANCEL##Back0 + PatchWelcomeDlgLineLine0234374010 + PatchWelcomeImageBitmap0037423410NewBinary5PatchWelcomeNextPushButton23024366173##IDS__IsPatchDlg_Update##Cancel0 + PatchWelcomeTextLine1Text135822545196611##IDS__IsPatchDlg_WelcomePatchWizard##0 + PatchWelcomeTextLine2Text1355422845196611##IDS__IsPatchDlg_PatchClickUpdate##0 + ReadmeInformationBackPushButton16424366171048579##IDS_BACK##Next0 + ReadmeInformationBannerBitmap00374443DlgTitle0NewBinary1ReadmeInformationBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##00 + ReadmeInformationBranding2Text3228501365537##IDS_INSTALLSHIELD##00 + ReadmeInformationCancelPushButton30124366171048579##IDS__IsReadmeDlg_Cancel##Readme0 + ReadmeInformationDlgDescText21232321665539##IDS__IsReadmeDlg_PleaseReadInfo##Back00 + ReadmeInformationDlgLineLine482343260300 + ReadmeInformationDlgTitleText1361931365539##IDS__IsReadmeDlg_ReadMeInfo##DlgDesc0 + ReadmeInformationNextPushButton23024366171048579##IDS_NEXT##Cancel0 + ReadmeInformationReadmeScrollableText10553531663Banner0<ISProductFolder>\Redist\0409\Readme.rtf + ReadyToInstallBackPushButton16424366173##IDS_BACK##GroupBox10 + ReadyToInstallBannerBitmap003744410NewBinary1ReadyToInstallBannerLineLine044374010 + ReadyToInstallBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + ReadyToInstallBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + ReadyToInstallCancelPushButton30124366173##IDS_CANCEL##Back0 + ReadyToInstallCompanyNameTextText3819821193##IDS__IsVerifyReadyDlg_Company##SerialNumberText0 + ReadyToInstallCurrentSettingsTextText198081103##IDS__IsVerifyReadyDlg_CurrentSettings##InstallNow0 + ReadyToInstallDlgDescText21232922565539##IDS__IsVerifyReadyDlg_WizardReady##0 + ReadyToInstallDlgLineLine482343260100 + ReadyToInstallDlgText1Text2154330243##IDS__IsVerifyReadyDlg_BackOrCancel##0 + ReadyToInstallDlgText2Text2199330202##IDS__IsRegisterUserDlg_InstallFor##0 + ReadyToInstallDlgTitleText1362922565538##IDS__IsVerifyReadyDlg_ModifyReady##0 + ReadyToInstallDlgTitle2Text1362922565538##IDS__IsVerifyReadyDlg_ReadyRepair##0 + ReadyToInstallDlgTitle3Text1362922565538##IDS__IsVerifyReadyDlg_ReadyInstall##0 + ReadyToInstallGroupBox1Text199233013365541SetupTypeText10 + ReadyToInstallInstallNowPushButton23024366178388611##IDS__IsVerifyReadyDlg_Install##InstallPerMachine0 + ReadyToInstallInstallPerMachinePushButton63123248178388610##IDS__IsRegisterUserDlg_Anyone##InstallPerUser0 + ReadyToInstallInstallPerUserPushButton63143248172##IDS__IsRegisterUserDlg_OnlyMe##Cancel0 + ReadyToInstallSerialNumberTextText3821130693##IDS__IsVerifyReadyDlg_Serial##CurrentSettingsText0 + ReadyToInstallSetupTypeText1Text2397306133##IDS__IsVerifyReadyDlg_SetupType##SetupTypeText20 + ReadyToInstallSetupTypeText2Text37114306143##IDS__IsVerifyReadyDlg_SelectedSetupType##TargetFolderText10 + ReadyToInstallTargetFolderText1Text24136306113##IDS__IsVerifyReadyDlg_DestFolder##TargetFolderText20 + ReadyToInstallTargetFolderText2Text37151306133##IDS__IsVerifyReadyDlg_Installdir##UserInformationText0 + ReadyToInstallUserInformationTextText23171306133##IDS__IsVerifyReadyDlg_UserInfo##UserNameText0 + ReadyToInstallUserNameTextText3818430693##IDS__IsVerifyReadyDlg_UserName##CompanyNameText0 + ReadyToRemoveBackPushButton16424366173##IDS_BACK##RemoveNow0 + ReadyToRemoveBannerBitmap003744410NewBinary1ReadyToRemoveBannerLineLine044374010 + ReadyToRemoveBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + ReadyToRemoveBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + ReadyToRemoveCancelPushButton30124366173##IDS_CANCEL##Back0 + ReadyToRemoveDlgDescText21232922565539##IDS__IsVerifyRemoveAllDlg_ChoseRemoveProgram##0 + ReadyToRemoveDlgLineLine48234326010 + ReadyToRemoveDlgTextText215132624131075##IDS__IsVerifyRemoveAllDlg_ClickRemove##0 + ReadyToRemoveDlgText1Text2179330233##IDS__IsVerifyRemoveAllDlg_ClickBack##0 + ReadyToRemoveDlgText2Text211023302430 + ReadyToRemoveDlgTitleText1362922565539##IDS__IsVerifyRemoveAllDlg_RemoveProgram##0 + ReadyToRemoveRemoveNowPushButton23024366178388611##IDS__IsVerifyRemoveAllDlg_Remove##Cancel0 + SetupCompleteErrorBackPushButton16424366171##IDS_BACK##Finish0 + SetupCompleteErrorCancelPushButton30124366171##IDS_CANCEL##Back0 + SetupCompleteErrorCheckShowMsiLogCheckBox1511721092ISSHOWMSILOGCancel0 + SetupCompleteErrorDlgLineLine0234374010 + SetupCompleteErrorFinishPushButton23024366173##IDS__IsFatalError_Finish##Image0 + SetupCompleteErrorFinishText1Text135802285065539##IDS__IsFatalError_NotModified##0 + SetupCompleteErrorFinishText2Text1351352282565539##IDS__IsFatalError_ClickFinish##0 + SetupCompleteErrorImageBitmap003742341CheckShowMsiLog0NewBinary5SetupCompleteErrorRestContText1Text135802285065539##IDS__IsFatalError_KeepOrRestore##0 + SetupCompleteErrorRestContText2Text1351352282565539##IDS__IsFatalError_RestoreOrContinueLater##0 + SetupCompleteErrorShowMsiLogTextText1641721981065538##IDS__IsSetupComplete_ShowMsiLog##0 + SetupCompleteErrorTextLine1Text13582254565539##IDS__IsFatalError_WizardCompleted##0 + SetupCompleteErrorTextLine2Text1355522825196611##IDS__IsFatalError_WizardInterrupted##0 + SetupCompleteSuccessBackPushButton16424366171##IDS_BACK##OK0 + SetupCompleteSuccessCancelPushButton30124366171##IDS_CANCEL##Image0 + SetupCompleteSuccessCheckBoxUpdatesCheckBox1351641092ISCHECKFORPRODUCTUPDATESCheckBox1CheckShowMsiLog0 + SetupCompleteSuccessCheckForUpdatesTextText1521621903065538##IDS__IsExitDialog_Update_YesCheckForUpdates##0 + SetupCompleteSuccessCheckLaunchProgramCheckBox1511141092LAUNCHPROGRAMCheckLaunchReadme0 + SetupCompleteSuccessCheckLaunchReadmeCheckBox1511481092LAUNCHREADMECheckBoxUpdates0 + SetupCompleteSuccessCheckShowMsiLogCheckBox1511821092ISSHOWMSILOGBack0 + SetupCompleteSuccessDlgLineLine0234374010 + SetupCompleteSuccessImageBitmap003742341CheckLaunchProgram0NewBinary5SetupCompleteSuccessLaunchProgramTextText164112981565538##IDS__IsExitDialog_LaunchProgram##00 + SetupCompleteSuccessLaunchReadmeTextText1641481201365538##IDS__IsExitDialog_ShowReadMe##00 + SetupCompleteSuccessOKPushButton23024366173##IDS__IsExitDialog_Finish##Cancel0 + SetupCompleteSuccessShowMsiLogTextText1641821981065538##IDS__IsSetupComplete_ShowMsiLog##0 + SetupCompleteSuccessTextLine1Text13582254565539##IDS__IsExitDialog_WizardCompleted##0 + SetupCompleteSuccessTextLine2Text1355522845196610##IDS__IsExitDialog_InstallSuccess##0 + SetupCompleteSuccessTextLine3Text1355522845196610##IDS__IsExitDialog_UninstallSuccess##0 + SetupCompleteSuccessUpdateTextLine1Text1353022845196610##IDS__IsExitDialog_Update_SetupFinished##0 + SetupCompleteSuccessUpdateTextLine2Text1358022845196610##IDS__IsExitDialog_Update_PossibleUpdates##0 + SetupCompleteSuccessUpdateTextLine3Text1351202284565538##IDS__IsExitDialog_Update_InternetConnection##0 + SetupErrorAPushButton1928066173##IDS__IsErrorDlg_Abort##0 + SetupErrorCPushButton1928066173##IDS_CANCEL2##0 + SetupErrorErrorIconIcon1515242452428810NewBinary4SetupErrorErrorTextText501520050131075##IDS__IsErrorDlg_ErrorText##0 + SetupErrorIPushButton1928066173##IDS__IsErrorDlg_Ignore##0 + SetupErrorNPushButton1928066173##IDS__IsErrorDlg_NO##0 + SetupErrorOPushButton1928066173##IDS__IsErrorDlg_OK##0 + SetupErrorRPushButton1928066173##IDS__IsErrorDlg_Retry##0 + SetupErrorYPushButton1928066173##IDS__IsErrorDlg_Yes##0 + SetupInitializationActionDataText1351252281265539##IDS__IsInitDlg_1##0 + SetupInitializationActionTextText1351092203665539##IDS__IsInitDlg_2##0 + SetupInitializationBackPushButton16424366171##IDS_BACK##0 + SetupInitializationCancelPushButton30124366173##IDS_CANCEL##0 + SetupInitializationDlgLineLine0234374010 + SetupInitializationImageBitmap0037423410NewBinary5SetupInitializationNextPushButton23024366171##IDS_NEXT##0 + SetupInitializationTextLine1Text135822545196611##IDS__IsInitDlg_WelcomeWizard##0 + SetupInitializationTextLine2Text1355522830196611##IDS__IsInitDlg_PreparingWizard##0 + SetupInterruptedBackPushButton16424366171##IDS_BACK##Finish0 + SetupInterruptedCancelPushButton30124366171##IDS_CANCEL##Image0 + SetupInterruptedCheckShowMsiLogCheckBox1511721092ISSHOWMSILOGBack0 + SetupInterruptedDlgLineLine0234374010 + SetupInterruptedFinishPushButton23024366173##IDS__IsUserExit_Finish##Cancel0 + SetupInterruptedFinishText1Text135802285065539##IDS__IsUserExit_NotModified##0 + SetupInterruptedFinishText2Text1351352282565539##IDS__IsUserExit_ClickFinish##0 + SetupInterruptedImageBitmap003742341CheckShowMsiLog0NewBinary5SetupInterruptedRestContText1Text135802285065539##IDS__IsUserExit_KeepOrRestore##0 + SetupInterruptedRestContText2Text1351352282565539##IDS__IsUserExit_RestoreOrContinue##0 + SetupInterruptedShowMsiLogTextText1641721981065538##IDS__IsSetupComplete_ShowMsiLog##0 + SetupInterruptedTextLine1Text13582254565539##IDS__IsUserExit_WizardCompleted##0 + SetupInterruptedTextLine2Text1355522825196611##IDS__IsUserExit_WizardInterrupted##0 + SetupProgressActionProgress95ProgressBar591132751265537##IDS__IsProgressDlg_ProgressDone##0 + SetupProgressActionTextText59100275123##IDS__IsProgressDlg_2##0 + SetupProgressBackPushButton16424366171##IDS_BACK##Next0 + SetupProgressBannerBitmap003744410NewBinary1SetupProgressBannerLineLine044374010 + SetupProgressBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + SetupProgressBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + SetupProgressCancelPushButton30124366173##IDS_CANCEL##Back0 + SetupProgressDlgDescText21232922565538##IDS__IsProgressDlg_UninstallingFeatures2##0 + SetupProgressDlgDesc2Text21232922565538##IDS__IsProgressDlg_UninstallingFeatures##0 + SetupProgressDlgLineLine48234326010 + SetupProgressDlgTextText595127530196610##IDS__IsProgressDlg_WaitUninstall2##0 + SetupProgressDlgText2Text595127530196610##IDS__IsProgressDlg_WaitUninstall##0 + SetupProgressDlgTitleText13629225196610##IDS__IsProgressDlg_InstallingProductName##0 + SetupProgressDlgTitle2Text13629225196610##IDS__IsProgressDlg_Uninstalling##0 + SetupProgressLbSecText19213932122##IDS__IsProgressDlg_SecHidden##0 + SetupProgressLbStatusText598570123##IDS__IsProgressDlg_Status##0 + SetupProgressNextPushButton23024366171##IDS_NEXT##Cancel0 + SetupProgressSetupIconIcon2151242452428810NewBinary9SetupProgressShowTimeText17013917122##IDS__IsProgressDlg_Hidden##0 + SetupProgressTextTimeText59139110122##IDS__IsProgressDlg_HiddenTimeRemaining##0 + SetupResumeBackPushButton16424366171##IDS_BACK##Next0 + SetupResumeCancelPushButton30124366173##IDS_CANCEL##Back0 + SetupResumeDlgLineLine0234374010 + SetupResumeImageBitmap0037423410NewBinary5SetupResumeNextPushButton23024366173##IDS_NEXT##Cancel0 + SetupResumePreselectedTextText1355522845196611##IDS__IsResumeDlg_WizardResume##0 + SetupResumeResumeTextText1354622845196611##IDS__IsResumeDlg_ResumeSuspended##0 + SetupResumeTextLine1Text135822545196611##IDS__IsResumeDlg_Resuming##0 + SetupTypeBackPushButton16424366173##IDS_BACK##Next0 + SetupTypeBannerBitmap003744410NewBinary1SetupTypeBannerLineLine044374010 + SetupTypeBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + SetupTypeBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + SetupTypeCancelPushButton30124366173##IDS_CANCEL##RadioGroup0 + SetupTypeCompTextText8080246303##IDS__IsSetupTypeMinDlg_AllFeatures##0 + SetupTypeCompleteIcoIcon3480242452428810NewBinary10SetupTypeCustTextText80171246302##IDS__IsSetupTypeMinDlg_ChooseFeatures##0 + SetupTypeCustomIcoIcon34171242452428800NewBinary11SetupTypeDlgDescText21232922565539##IDS__IsSetupTypeMinDlg_ChooseSetupType##0 + SetupTypeDlgLineLine48234326010 + SetupTypeDlgTextText2249326103##IDS__IsSetupTypeMinDlg_SelectSetupType##00 + SetupTypeDlgTitleText1362922565539##IDS__IsSetupTypeMinDlg_SetupType##0 + SetupTypeMinIcoIcon34125242452428800NewBinary11SetupTypeMinTextText80125246302##IDS__IsSetupTypeMinDlg_MinimumFeatures##0 + SetupTypeNextPushButton23024366173##IDS_NEXT##Cancel0 + SetupTypeRadioGroupRadioButtonGroup20592641391048579_IsSetupTypeMinBack00 + SplashBitmapBackPushButton16424366171##IDS_BACK##Next0 + SplashBitmapBranding1Text422950133##IDS_INSTALLSHIELD_FORMATTED##0 + SplashBitmapBranding2Text3228501365537##IDS_INSTALLSHIELD##0 + SplashBitmapCancelPushButton30124366173##IDS_CANCEL##Back0 + SplashBitmapDlgLineLine48234326010 + SplashBitmapImageBitmap131234921110NewBinary5SplashBitmapNextPushButton23024366173##IDS_NEXT##Cancel0 +
+ + + Dialog_ + Control_ + Action + Condition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CustomSetupChangeFolderHideInstalledCustomSetupDetailsHideInstalledCustomSetupInstallLabelHideInstalledCustomerInformationDlgRadioGroupTextHideNOT PrivilegedCustomerInformationDlgRadioGroupTextHideProductState > 0CustomerInformationDlgRadioGroupTextHideVersion9XCustomerInformationDlgRadioGroupTextHideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledCustomerInformationRadioGroupHideNOT PrivilegedCustomerInformationRadioGroupHideProductState > 0CustomerInformationRadioGroupHideVersion9XCustomerInformationRadioGroupHideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledCustomerInformationSerialLabelShowSERIALNUMSHOWCustomerInformationSerialNumberShowSERIALNUMSHOWInstallWelcomeCopyrightHideSHOWCOPYRIGHT="No"InstallWelcomeCopyrightShowSHOWCOPYRIGHT="Yes"LicenseAgreementNextDisableAgreeToLicense <> "Yes"LicenseAgreementNextEnableAgreeToLicense = "Yes"ReadyToInstallCompanyNameTextHideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallCurrentSettingsTextHideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallDlgText2HideVersionNT < "601" OR NOT ISSupportPerUser OR InstalledReadyToInstallDlgText2ShowVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallDlgTitleShowProgressType0="Modify"ReadyToInstallDlgTitle2ShowProgressType0="Repair"ReadyToInstallDlgTitle3ShowProgressType0="install"ReadyToInstallGroupBox1HideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallInstallNowDisableVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallInstallNowEnableVersionNT < "601" OR NOT ISSupportPerUser OR InstalledReadyToInstallInstallPerMachineHideVersionNT < "601" OR NOT ISSupportPerUser OR InstalledReadyToInstallInstallPerMachineShowVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallInstallPerUserHideVersionNT < "601" OR NOT ISSupportPerUser OR InstalledReadyToInstallInstallPerUserShowVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallSerialNumberTextHideNOT SERIALNUMSHOWReadyToInstallSerialNumberTextHideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallSetupTypeText1HideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallSetupTypeText2HideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallTargetFolderText1HideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallTargetFolderText2HideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallUserInformationTextHideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledReadyToInstallUserNameTextHideVersionNT >= "601" AND ISSupportPerUser AND NOT InstalledSetupCompleteErrorBackDefaultUpdateStartedSetupCompleteErrorBackDisableNOT UpdateStartedSetupCompleteErrorBackEnableUpdateStartedSetupCompleteErrorCancelDisableNOT UpdateStartedSetupCompleteErrorCancelEnableUpdateStartedSetupCompleteErrorCheckShowMsiLogShowMsiLogFileLocationSetupCompleteErrorFinishDefaultNOT UpdateStartedSetupCompleteErrorFinishText1HideUpdateStartedSetupCompleteErrorFinishText1ShowNOT UpdateStartedSetupCompleteErrorFinishText2HideUpdateStartedSetupCompleteErrorFinishText2ShowNOT UpdateStartedSetupCompleteErrorRestContText1HideNOT UpdateStartedSetupCompleteErrorRestContText1ShowUpdateStartedSetupCompleteErrorRestContText2HideNOT UpdateStartedSetupCompleteErrorRestContText2ShowUpdateStartedSetupCompleteErrorShowMsiLogTextShowMsiLogFileLocationSetupCompleteSuccessCheckBoxUpdatesShowISENABLEDWUSFINISHDIALOG And NOT Installed And ACTION="INSTALL"SetupCompleteSuccessCheckForUpdatesTextShowISENABLEDWUSFINISHDIALOG And NOT Installed And ACTION="INSTALL"SetupCompleteSuccessCheckLaunchProgramShowSHOWLAUNCHPROGRAM="-1" And PROGRAMFILETOLAUNCHATEND <> "" And NOT Installed And NOT ISENABLEDWUSFINISHDIALOGSetupCompleteSuccessCheckLaunchReadmeShowSHOWLAUNCHREADME="-1" And READMEFILETOLAUNCHATEND <> "" And NOT Installed And NOT ISENABLEDWUSFINISHDIALOGSetupCompleteSuccessCheckShowMsiLogShowMsiLogFileLocation And NOT ISENABLEDWUSFINISHDIALOGSetupCompleteSuccessLaunchProgramTextShowSHOWLAUNCHPROGRAM="-1" And PROGRAMFILETOLAUNCHATEND <> "" And NOT Installed And NOT ISENABLEDWUSFINISHDIALOGSetupCompleteSuccessLaunchReadmeTextShowSHOWLAUNCHREADME="-1" And READMEFILETOLAUNCHATEND <> "" And NOT Installed And NOT ISENABLEDWUSFINISHDIALOGSetupCompleteSuccessShowMsiLogTextShowMsiLogFileLocation And NOT ISENABLEDWUSFINISHDIALOGSetupCompleteSuccessTextLine2ShowProgressType2="installed" And ((ACTION<>"INSTALL") OR (NOT ISENABLEDWUSFINISHDIALOG) OR (ISENABLEDWUSFINISHDIALOG And Installed))SetupCompleteSuccessTextLine3ShowProgressType2="uninstalled" And ((ACTION<>"INSTALL") OR (NOT ISENABLEDWUSFINISHDIALOG) OR (ISENABLEDWUSFINISHDIALOG And Installed))SetupCompleteSuccessUpdateTextLine1ShowISENABLEDWUSFINISHDIALOG And NOT Installed And ACTION="INSTALL"SetupCompleteSuccessUpdateTextLine2ShowISENABLEDWUSFINISHDIALOG And NOT Installed And ACTION="INSTALL"SetupCompleteSuccessUpdateTextLine3ShowISENABLEDWUSFINISHDIALOG And NOT Installed And ACTION="INSTALL"SetupInterruptedBackDefaultUpdateStartedSetupInterruptedBackDisableNOT UpdateStartedSetupInterruptedBackEnableUpdateStartedSetupInterruptedCancelDisableNOT UpdateStartedSetupInterruptedCancelEnableUpdateStartedSetupInterruptedCheckShowMsiLogShowMsiLogFileLocationSetupInterruptedFinishDefaultNOT UpdateStartedSetupInterruptedFinishText1HideUpdateStartedSetupInterruptedFinishText1ShowNOT UpdateStartedSetupInterruptedFinishText2HideUpdateStartedSetupInterruptedFinishText2ShowNOT UpdateStartedSetupInterruptedRestContText1HideNOT UpdateStartedSetupInterruptedRestContText1ShowUpdateStartedSetupInterruptedRestContText2HideNOT UpdateStartedSetupInterruptedRestContText2ShowUpdateStartedSetupInterruptedShowMsiLogTextShowMsiLogFileLocationSetupProgressDlgDescShowProgressType2="installed"SetupProgressDlgDesc2ShowProgressType2="uninstalled"SetupProgressDlgTextShowProgressType3="installs"SetupProgressDlgText2ShowProgressType3="uninstalls"SetupProgressDlgTitleShowProgressType1="Installing"SetupProgressDlgTitle2ShowProgressType1="Uninstalling"SetupResumePreselectedTextHideRESUMESetupResumePreselectedTextShowNOT RESUMESetupResumeResumeTextHideNOT RESUMESetupResumeResumeTextShowRESUME
+ + + Dialog_ + Control_ + Event + Argument + Condition + Ordering + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdminChangeFolderCancelEndDialogReturn12AdminChangeFolderCancelReset011AdminChangeFolderNewFolderDirectoryListNew010AdminChangeFolderOKEndDialogReturn10AdminChangeFolderOKSetTargetPathTARGETDIR11AdminChangeFolderUpDirectoryListUp010AdminNetworkLocationBackNewDialogAdminWelcome10AdminNetworkLocationBrowseSpawnDialogAdminChangeFolder10AdminNetworkLocationCancelSpawnDialogCancelSetup10AdminNetworkLocationInstallNowEndDialogReturnOutOfNoRbDiskSpace <> 13AdminNetworkLocationInstallNowNewDialogOutOfSpaceOutOfNoRbDiskSpace = 12AdminNetworkLocationInstallNowSetTargetPathTARGETDIR11AdminWelcomeCancelSpawnDialogCancelSetup10AdminWelcomeNextNewDialogAdminNetworkLocation10CancelSetupNoEndDialogReturn10CancelSetupYesDoActionCleanUpISSCRIPTRUNNING="1"1CancelSetupYesEndDialogExit12CustomSetupBackNewDialogCustomerInformationNOT Installed0CustomSetupBackNewDialogMaintenanceTypeInstalled0CustomSetupCancelSpawnDialogCancelSetup10CustomSetupChangeFolderSelectionBrowseInstallChangeFolder10CustomSetupDetailsSelectionBrowseDiskSpaceRequirements11CustomSetupHelpSpawnDialogCustomSetupTips11CustomSetupNextNewDialogOutOfSpaceOutOfNoRbDiskSpace = 10CustomSetupNextNewDialogReadyToInstallOutOfNoRbDiskSpace <> 10CustomSetupNext[_IsSetupTypeMin]Custom10CustomSetupTipsOKEndDialogReturn11CustomerInformationBackNewDialogLicenseAgreement11CustomerInformationCancelSpawnDialogCancelSetup10CustomerInformationNextEndDialogExit(SERIALNUMVALRETRYLIMIT) And (SERIALNUMVALRETRYLIMIT<0) And (SERIALNUMVALRETURN<>SERIALNUMVALSUCCESSRETVAL)2CustomerInformationNextNewDialogReadyToInstall(Not SERIALNUMVALRETURN) OR (SERIALNUMVALRETURN=SERIALNUMVALSUCCESSRETVAL)3CustomerInformationNext[ALLUSERS]1ApplicationUsers = "AllUsers" And Privileged1CustomerInformationNext[ALLUSERS]{}ApplicationUsers = "OnlyCurrentUser" And Privileged2DatabaseFolderBackNewDialogCustomerInformation11DatabaseFolderCancelSpawnDialogCancelSetup11DatabaseFolderChangeFolderSpawnDialogInstallChangeFolder11DatabaseFolderChangeFolder[_BrowseProperty]DATABASEDIR12DatabaseFolderNextNewDialogSetupType11DestinationFolderBackNewDialogCustomerInformation10DestinationFolderCancelSpawnDialogCancelSetup11DestinationFolderChangeFolderSpawnDialogInstallChangeFolder11DestinationFolderChangeFolder[_BrowseProperty]INSTALLDIR12DestinationFolderNextNewDialogReadyToInstall10DiskSpaceRequirementsOKEndDialogReturn10FilesInUseExitEndDialogExit10FilesInUseIgnoreEndDialogIgnore10FilesInUseRetryEndDialogRetry10InstallChangeFolderCancelEndDialogReturn12InstallChangeFolderCancelReset011InstallChangeFolderNewFolderDirectoryListNew010InstallChangeFolderOKEndDialogReturn13InstallChangeFolderOKSetTargetPath[_BrowseProperty]12InstallChangeFolderUpDirectoryListUp010InstallWelcomeBackNewDialogSplashBitmapDisplay_IsBitmapDlg0InstallWelcomeCancelSpawnDialogCancelSetup10InstallWelcomeNextNewDialogLicenseAgreement10LicenseAgreementBackNewDialogInstallWelcome10LicenseAgreementCancelSpawnDialogCancelSetup10LicenseAgreementISPrintButtonDoActionISPrint10LicenseAgreementNextNewDialogCustomerInformationAgreeToLicense = "Yes"0MaintenanceTypeBackNewDialogMaintenanceWelcome10MaintenanceTypeCancelSpawnDialogCancelSetup10MaintenanceTypeNextNewDialogCustomSetup_IsMaintenance = "Change"12MaintenanceTypeNextNewDialogReadyToInstall_IsMaintenance = "Reinstall"13MaintenanceTypeNextNewDialogReadyToRemove_IsMaintenance = "Remove"11MaintenanceTypeNextReinstallALL_IsMaintenance = "Reinstall"10MaintenanceTypeNextReinstallMode[ReinstallModeText]_IsMaintenance = "Reinstall"9MaintenanceTypeNext[ProgressType0]Modify_IsMaintenance = "Change"2MaintenanceTypeNext[ProgressType0]Repair_IsMaintenance = "Reinstall"1MaintenanceTypeNext[ProgressType1]Modifying_IsMaintenance = "Change"3MaintenanceTypeNext[ProgressType1]Repairing_IsMaintenance = "Reinstall"4MaintenanceTypeNext[ProgressType2]modified_IsMaintenance = "Change"6MaintenanceTypeNext[ProgressType2]repairs_IsMaintenance = "Reinstall"5MaintenanceTypeNext[ProgressType3]modifies_IsMaintenance = "Change"7MaintenanceTypeNext[ProgressType3]repairs_IsMaintenance = "Reinstall"8MaintenanceWelcomeCancelSpawnDialogCancelSetup10MaintenanceWelcomeNextNewDialogMaintenanceType10MsiRMFilesInUseCancelEndDialogExit11MsiRMFilesInUseOKEndDialogReturn11MsiRMFilesInUseOKRMShutdownAndRestart0RestartManagerOption="CloseRestart"2OutOfSpaceResumeNewDialogAdminNetworkLocationACTION = "ADMIN"0OutOfSpaceResumeNewDialogDestinationFolderACTION <> "ADMIN"0PatchWelcomeCancelSpawnDialogCancelSetup11PatchWelcomeNextEndDialogReturn13PatchWelcomeNextReinstallALLPATCH And REINSTALL=""1PatchWelcomeNextReinstallModeomusPATCH And REINSTALLMODE=""2ReadmeInformationBackNewDialogLicenseAgreement11ReadmeInformationCancelSpawnDialogCancelSetup11ReadmeInformationNextNewDialogCustomerInformation11ReadyToInstallBackNewDialogCustomSetupInstalled OR _IsSetupTypeMin = "Custom"2ReadyToInstallBackNewDialogCustomerInformationNOT Installed1ReadyToInstallBackNewDialogMaintenanceTypeInstalled AND _IsMaintenance = "Reinstall"3ReadyToInstallCancelSpawnDialogCancelSetup10ReadyToInstallInstallNowEndDialogReturnOutOfNoRbDiskSpace <> 10ReadyToInstallInstallNowNewDialogOutOfSpaceOutOfNoRbDiskSpace = 10ReadyToInstallInstallNow[ProgressType1]Installing10ReadyToInstallInstallNow[ProgressType2]installed10ReadyToInstallInstallNow[ProgressType3]installs10ReadyToInstallInstallPerMachineEndDialogReturnOutOfNoRbDiskSpace <> 10ReadyToInstallInstallPerMachineNewDialogOutOfSpaceOutOfNoRbDiskSpace = 10ReadyToInstallInstallPerMachine[ALLUSERS]110ReadyToInstallInstallPerMachine[MSIINSTALLPERUSER]{}10ReadyToInstallInstallPerMachine[ProgressType1]Installing10ReadyToInstallInstallPerMachine[ProgressType2]installed10ReadyToInstallInstallPerMachine[ProgressType3]installs10ReadyToInstallInstallPerUserEndDialogReturnOutOfNoRbDiskSpace <> 10ReadyToInstallInstallPerUserNewDialogOutOfSpaceOutOfNoRbDiskSpace = 10ReadyToInstallInstallPerUser[ALLUSERS]210ReadyToInstallInstallPerUser[MSIINSTALLPERUSER]110ReadyToInstallInstallPerUser[ProgressType1]Installing10ReadyToInstallInstallPerUser[ProgressType2]installed10ReadyToInstallInstallPerUser[ProgressType3]installs10ReadyToRemoveBackNewDialogMaintenanceType10ReadyToRemoveCancelSpawnDialogCancelSetup10ReadyToRemoveRemoveNowEndDialogReturnOutOfNoRbDiskSpace <> 12ReadyToRemoveRemoveNowNewDialogOutOfSpaceOutOfNoRbDiskSpace = 12ReadyToRemoveRemoveNowRemoveALL11ReadyToRemoveRemoveNow[ProgressType1]Uninstalling10ReadyToRemoveRemoveNow[ProgressType2]uninstalled10ReadyToRemoveRemoveNow[ProgressType3]uninstalls10SetupCompleteErrorBackEndDialogReturn12SetupCompleteErrorBack[Suspend]{}11SetupCompleteErrorCancelEndDialogReturn12SetupCompleteErrorCancel[Suspend]111SetupCompleteErrorFinishDoActionCleanUpISSCRIPTRUNNING="1"1SetupCompleteErrorFinishDoActionShowMsiLogMsiLogFileLocation And (ISSHOWMSILOG="1")3SetupCompleteErrorFinishEndDialogExit12SetupCompleteSuccessOKDoActionCleanUpISSCRIPTRUNNING="1"1SetupCompleteSuccessOKDoActionShowMsiLogMsiLogFileLocation And (ISSHOWMSILOG="1") And NOT ISENABLEDWUSFINISHDIALOG6SetupCompleteSuccessOKEndDialogExit12SetupErrorAEndDialogErrorAbort10SetupErrorCEndDialogErrorCancel10SetupErrorIEndDialogErrorIgnore10SetupErrorNEndDialogErrorNo10SetupErrorOEndDialogErrorOk10SetupErrorREndDialogErrorRetry10SetupErrorYEndDialogErrorYes10SetupInitializationCancelSpawnDialogCancelSetup10SetupInterruptedBackEndDialogExit12SetupInterruptedBack[Suspend]{}11SetupInterruptedCancelEndDialogExit12SetupInterruptedCancel[Suspend]111SetupInterruptedFinishDoActionCleanUpISSCRIPTRUNNING="1"1SetupInterruptedFinishDoActionShowMsiLogMsiLogFileLocation And (ISSHOWMSILOG="1")3SetupInterruptedFinishEndDialogExit12SetupProgressCancelSpawnDialogCancelSetup10SetupResumeCancelSpawnDialogCancelSetup10SetupResumeNextEndDialogReturnOutOfNoRbDiskSpace <> 10SetupResumeNextNewDialogOutOfSpaceOutOfNoRbDiskSpace = 10SetupTypeBackNewDialogCustomerInformation11SetupTypeCancelSpawnDialogCancelSetup10SetupTypeNextNewDialogCustomSetup_IsSetupTypeMin = "Custom"2SetupTypeNextNewDialogReadyToInstall_IsSetupTypeMin <> "Custom"1SetupTypeNextSetInstallLevel100_IsSetupTypeMin="Minimal"0SetupTypeNextSetInstallLevel200_IsSetupTypeMin="Typical"0SetupTypeNextSetInstallLevel300_IsSetupTypeMin="Custom"0SetupTypeNext[ISRUNSETUPTYPEADDLOCALEVENT]110SetupTypeNext[SelectedSetupType][DisplayNameCustom]_IsSetupTypeMin = "Custom"0SetupTypeNext[SelectedSetupType][DisplayNameMinimal]_IsSetupTypeMin = "Minimal"0SetupTypeNext[SelectedSetupType][DisplayNameTypical]_IsSetupTypeMin = "Typical"0SplashBitmapCancelSpawnDialogCancelSetup10SplashBitmapNextNewDialogInstallWelcome10
+ + + Directory_ + Component_ +
+ + + Action + Type + Source + Target + ExtendedType + ISComments + + + + +
ISPreventDowngrade19[IS_PREVENT_DOWNGRADE_EXIT]Exits install when a newer version of this product is foundISPrint1SetAllUsers.dllPrintScrollableTextPrints the contents of a ScrollableText control on a dialog.ISRunSetupTypeAddLocalEvent1ISExpHlp.dllRunSetupTypeAddLocalEventRun the AddLocal events associated with the Next button on the Setup Type dialog.ISSelfRegisterCosting1ISSELFREG.DLLISSelfRegisterCosting + ISSelfRegisterFiles3073ISSELFREG.DLLISSelfRegisterFiles + ISSelfRegisterFinalize1ISSELFREG.DLLISSelfRegisterFinalize + ISUnSelfRegisterFiles3073ISSELFREG.DLLISUnSelfRegisterFiles + SetARPINSTALLLOCATION51ARPINSTALLLOCATION[INSTALLDIR] + SetAllUsersProfileNT51ALLUSERSPROFILE[%SystemRoot]\Profiles\All Users + ShowMsiLog226SystemFolder[SystemFolder]notepad.exe "[MsiLogFileLocation]"Shows Property-driven MSI LogsetAllUsersProfile2K51ALLUSERSPROFILE[%ALLUSERSPROFILE] + setUserProfileNT51USERPROFILE[%USERPROFILE] +
+ + + Dialog + HCentering + VCentering + Width + Height + Attributes + Title + Control_First + Control_Default + Control_Cancel + ISComments + TextStyle_ + ISWindowStyle + ISResourceId + +
AdminChangeFolder50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##TailOKCancelInstall Point Browse0 + AdminNetworkLocation50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##InstallNowInstallNowCancelNetwork Location0 + AdminWelcome50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##NextNextCancelAdministration Welcome0 + CancelSetup5050260853##IDS_PRODUCTNAME_INSTALLSHIELD##NoNoNoCancel0 + CustomSetup505037426635##IDS_PRODUCTNAME_INSTALLSHIELD##TreeNextCancelCustom Selection0 + CustomSetupTips50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##OKOKOKCustom Setup Tips0 + CustomerInformation50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##NameEditNextCancelIdentification0 + DatabaseFolder50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##NextNextCancelDatabase Folder0 + DestinationFolder50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##NextNextCancelDestination Folder0 + DiskSpaceRequirements50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##OKOKOKFeature Details0 + FilesInUse505037426619##IDS_PRODUCTNAME_INSTALLSHIELD##RetryRetryExitFiles in Use0 + InstallChangeFolder50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##TailOKCancelBrowse0 + InstallWelcome50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##NextNextCancelWelcome Panel0 + LicenseAgreement50503742662##IDS_PRODUCTNAME_INSTALLSHIELD##AgreeNextCancelLicense Agreement0 + MaintenanceType50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##RadioGroupNextCancelChange, Reinstall, Remove0 + MaintenanceWelcome50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##NextNextCancelMaintenance Welcome0 + MsiRMFilesInUse505037426619##IDS_PRODUCTNAME_INSTALLSHIELD##OKOKCancelRestartManager Files in Use0 + OutOfSpace50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##ResumeResumeResumeOut Of Disk Space0 + PatchWelcome50503742663##IDS__IsPatchDlg_PatchWizard##NextNextCancelPatch Panel0 + ReadmeInformation50503742667##IDS_PRODUCTNAME_INSTALLSHIELD##NextNextCancelReadme Information00ReadyToInstall505037426635##IDS_PRODUCTNAME_INSTALLSHIELD##InstallNowInstallNowCancelReady to Install0 + ReadyToRemove50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##RemoveNowRemoveNowCancelVerify Remove0 + SetupCompleteError50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##FinishFinishFinishFatal Error0 + SetupCompleteSuccess50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##OKOKOKExit0 + SetupError505027011065543##IDS__IsErrorDlg_InstallerInfo##ErrorTextOCError0 + SetupInitialization50503742665##IDS_PRODUCTNAME_INSTALLSHIELD##CancelCancelCancelSetup Initialization0 + SetupInterrupted50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##FinishFinishFinishUser Exit0 + SetupProgress50503742665##IDS_PRODUCTNAME_INSTALLSHIELD##CancelCancelCancelProgress0 + SetupResume50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##NextNextCancelResume0 + SetupType50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##RadioGroupNextCancelSetup Type0 + SplashBitmap50503742663##IDS_PRODUCTNAME_INSTALLSHIELD##NextNextCancelWelcome Bitmap0 +
+ + + Directory + Directory_Parent + DefaultDir + ISDescription + ISAttributes + ISFolderName +
ALLUSERSPROFILETARGETDIR.:ALLUSE~1|All Users0 + AdminToolsFolderTARGETDIR.:Admint~1|AdminTools0 + AppDataFolderTARGETDIR.:APPLIC~1|Application Data0 + CommonAppDataFolderTARGETDIR.:Common~1|CommonAppData0 + CommonFiles64FolderTARGETDIR.:Common640 + CommonFilesFolderTARGETDIR.:Common0 + DATABASEDIRISYourDataBaseDir.0 + DesktopFolderTARGETDIR.:Desktop3 + FavoritesFolderTARGETDIR.:FAVORI~1|Favorites0 + FontsFolderTARGETDIR.:Fonts0 + GlobalAssemblyCacheTARGETDIR.:Global~1|GlobalAssemblyCache0 + INSTALLDIRSSISUNIT2017.0 + ISCommonFilesFolderCommonFilesFolderInstal~1|InstallShield0 + ISMyCompanyDirProgramFilesFolderMYCOMP~1|My Company Name0 + ISMyProductDirISMyCompanyDirMYPROD~1|My Product Name0 + ISYourDataBaseDirINSTALLDIRDatabase0 + LocalAppDataFolderTARGETDIR.:LocalA~1|LocalAppData0 + MY_PRODUCT_NAMEYOUR_COMPANY_NAMEMYPROD~1|My Product Name0 + MY_PRODUCT_NAME1PRAGMATIC_WORKSMYPROD~1|My Product Name0 + MyPicturesFolderTARGETDIR.:MyPict~1|MyPictures0 + NetHoodFolderTARGETDIR.:NetHood0 + PRAGMATIC_WORKSProgramFilesFolderPRAGMA~1|Pragmatic Works0 + PersonalFolderTARGETDIR.:Personal0 + PrimaryVolumePathTARGETDIR.:Primar~1|PrimaryVolumePath0 + PrintHoodFolderTARGETDIR.:PRINTH~1|PrintHood0 + ProgramFiles64FolderTARGETDIR.:Prog64~1|Program Files 640 + ProgramFilesFolderTARGETDIR.:PROGRA~1|program files0 + ProgramMenuFolderTARGETDIR.:Programs3 + RecentFolderTARGETDIR.:Recent0 + SSISUNIT2017PRAGMATIC_WORKSSSISUN~1|ssisUnit20170 + SSISUNIT2014PRAGMATIC_WORKSSSISUN~1|ssisUnit20140 + SSISUNIT_2012PRAGMATIC_WORKSSSISUN~1|ssisUnit20120 + SendToFolderTARGETDIR.:SendTo3 + StartMenuFolderTARGETDIR.:STARTM~1|Start Menu3 + StartupFolderTARGETDIR.:StartUp3 + System16FolderTARGETDIR.:System0 + System64FolderTARGETDIR.:System640 + SystemFolderTARGETDIR.:System320 + TARGETDIRSourceDir0 + TempFolderTARGETDIR.:Temp0 + TemplateFolderTARGETDIR.:ShellNew0 + USERPROFILETARGETDIR.:USERPR~1|UserProfile0 + WindowsFolderTARGETDIR.:Windows0 + WindowsVolumeTARGETDIR.:WinRoot0 + YOUR_COMPANY_NAMEProgramFilesFolderYOURCO~1|Your Company Name0 + pragma_1_pragmatic_worksProgramMenuFolderPRAGMA~1|Pragmatic Works1 + ssisun_1_ssisunit_2012pragma_1_pragmatic_worksSSISUN~1|ssisUnit 20141 +
+ + + Signature_ + Parent + Path + Depth +
+ + + FileKey + Component_ + File_ + DestName + DestFolder +
+ + + Environment + Name + Value + Component_ +
+ + + Error + Message + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0##IDS_ERROR_0##1##IDS_ERROR_1##10##IDS_ERROR_8##11##IDS_ERROR_9##1101##IDS_ERROR_22##12##IDS_ERROR_10##13##IDS_ERROR_11##1301##IDS_ERROR_23##1302##IDS_ERROR_24##1303##IDS_ERROR_25##1304##IDS_ERROR_26##1305##IDS_ERROR_27##1306##IDS_ERROR_28##1307##IDS_ERROR_29##1308##IDS_ERROR_30##1309##IDS_ERROR_31##1310##IDS_ERROR_32##1311##IDS_ERROR_33##1312##IDS_ERROR_34##1313##IDS_ERROR_35##1314##IDS_ERROR_36##1315##IDS_ERROR_37##1316##IDS_ERROR_38##1317##IDS_ERROR_39##1318##IDS_ERROR_40##1319##IDS_ERROR_41##1320##IDS_ERROR_42##1321##IDS_ERROR_43##1322##IDS_ERROR_44##1323##IDS_ERROR_45##1324##IDS_ERROR_46##1325##IDS_ERROR_47##1326##IDS_ERROR_48##1327##IDS_ERROR_49##1328##IDS_ERROR_122##1329##IDS_ERROR_1329##1330##IDS_ERROR_1330##1331##IDS_ERROR_1331##1332##IDS_ERROR_1332##1333##IDS_ERROR_1333##1334##IDS_ERROR_1334##1335##IDS_ERROR_1335##1336##IDS_ERROR_1336##14##IDS_ERROR_12##1401##IDS_ERROR_50##1402##IDS_ERROR_51##1403##IDS_ERROR_52##1404##IDS_ERROR_53##1405##IDS_ERROR_54##1406##IDS_ERROR_55##1407##IDS_ERROR_56##1408##IDS_ERROR_57##1409##IDS_ERROR_58##1410##IDS_ERROR_59##15##IDS_ERROR_13##1500##IDS_ERROR_60##1501##IDS_ERROR_61##1502##IDS_ERROR_62##1503##IDS_ERROR_63##16##IDS_ERROR_14##1601##IDS_ERROR_64##1602##IDS_ERROR_65##1603##IDS_ERROR_66##1604##IDS_ERROR_67##1605##IDS_ERROR_68##1606##IDS_ERROR_69##1607##IDS_ERROR_70##1608##IDS_ERROR_71##1609##IDS_ERROR_1609##1651##IDS_ERROR_1651##17##IDS_ERROR_15##1701##IDS_ERROR_72##1702##IDS_ERROR_73##1703##IDS_ERROR_74##1704##IDS_ERROR_75##1705##IDS_ERROR_76##1706##IDS_ERROR_77##1707##IDS_ERROR_78##1708##IDS_ERROR_79##1709##IDS_ERROR_80##1710##IDS_ERROR_81##1711##IDS_ERROR_82##1712##IDS_ERROR_83##1713##IDS_ERROR_123##1714##IDS_ERROR_124##1715##IDS_ERROR_1715##1716##IDS_ERROR_1716##1717##IDS_ERROR_1717##1718##IDS_ERROR_1718##1719##IDS_ERROR_1719##1720##IDS_ERROR_1720##1721##IDS_ERROR_1721##1722##IDS_ERROR_1722##1723##IDS_ERROR_1723##1724##IDS_ERROR_1724##1725##IDS_ERROR_1725##1726##IDS_ERROR_1726##1727##IDS_ERROR_1727##1728##IDS_ERROR_1728##1729##IDS_ERROR_1729##1730##IDS_ERROR_1730##1731##IDS_ERROR_1731##1732##IDS_ERROR_1732##18##IDS_ERROR_16##1801##IDS_ERROR_84##1802##IDS_ERROR_85##1803##IDS_ERROR_86##1804##IDS_ERROR_87##1805##IDS_ERROR_88##1806##IDS_ERROR_89##1807##IDS_ERROR_90##19##IDS_ERROR_17##1901##IDS_ERROR_91##1902##IDS_ERROR_92##1903##IDS_ERROR_93##1904##IDS_ERROR_94##1905##IDS_ERROR_95##1906##IDS_ERROR_96##1907##IDS_ERROR_97##1908##IDS_ERROR_98##1909##IDS_ERROR_99##1910##IDS_ERROR_100##1911##IDS_ERROR_101##1912##IDS_ERROR_102##1913##IDS_ERROR_103##1914##IDS_ERROR_104##1915##IDS_ERROR_105##1916##IDS_ERROR_106##1917##IDS_ERROR_107##1918##IDS_ERROR_108##1919##IDS_ERROR_109##1920##IDS_ERROR_110##1921##IDS_ERROR_111##1922##IDS_ERROR_112##1923##IDS_ERROR_113##1924##IDS_ERROR_114##1925##IDS_ERROR_115##1926##IDS_ERROR_116##1927##IDS_ERROR_117##1928##IDS_ERROR_118##1929##IDS_ERROR_119##1930##IDS_ERROR_125##1931##IDS_ERROR_126##1932##IDS_ERROR_127##1933##IDS_ERROR_128##1934##IDS_ERROR_129##1935##IDS_ERROR_1935##1936##IDS_ERROR_1936##1937##IDS_ERROR_1937##1938##IDS_ERROR_1938##2##IDS_ERROR_2##20##IDS_ERROR_18##21##IDS_ERROR_19##2101##IDS_ERROR_2101##2102##IDS_ERROR_2102##2103##IDS_ERROR_2103##2104##IDS_ERROR_2104##2105##IDS_ERROR_2105##2106##IDS_ERROR_2106##2107##IDS_ERROR_2107##2108##IDS_ERROR_2108##2109##IDS_ERROR_2109##2110##IDS_ERROR_2110##2111##IDS_ERROR_2111##2112##IDS_ERROR_2112##2113##IDS_ERROR_2113##22##IDS_ERROR_120##2200##IDS_ERROR_2200##2201##IDS_ERROR_2201##2202##IDS_ERROR_2202##2203##IDS_ERROR_2203##2204##IDS_ERROR_2204##2205##IDS_ERROR_2205##2206##IDS_ERROR_2206##2207##IDS_ERROR_2207##2208##IDS_ERROR_2208##2209##IDS_ERROR_2209##2210##IDS_ERROR_2210##2211##IDS_ERROR_2211##2212##IDS_ERROR_2212##2213##IDS_ERROR_2213##2214##IDS_ERROR_2214##2215##IDS_ERROR_2215##2216##IDS_ERROR_2216##2217##IDS_ERROR_2217##2218##IDS_ERROR_2218##2219##IDS_ERROR_2219##2220##IDS_ERROR_2220##2221##IDS_ERROR_2221##2222##IDS_ERROR_2222##2223##IDS_ERROR_2223##2224##IDS_ERROR_2224##2225##IDS_ERROR_2225##2226##IDS_ERROR_2226##2227##IDS_ERROR_2227##2228##IDS_ERROR_2228##2229##IDS_ERROR_2229##2230##IDS_ERROR_2230##2231##IDS_ERROR_2231##2232##IDS_ERROR_2232##2233##IDS_ERROR_2233##2234##IDS_ERROR_2234##2235##IDS_ERROR_2235##2236##IDS_ERROR_2236##2237##IDS_ERROR_2237##2238##IDS_ERROR_2238##2239##IDS_ERROR_2239##2240##IDS_ERROR_2240##2241##IDS_ERROR_2241##2242##IDS_ERROR_2242##2243##IDS_ERROR_2243##2244##IDS_ERROR_2244##2245##IDS_ERROR_2245##2246##IDS_ERROR_2246##2247##IDS_ERROR_2247##2248##IDS_ERROR_2248##2249##IDS_ERROR_2249##2250##IDS_ERROR_2250##2251##IDS_ERROR_2251##2252##IDS_ERROR_2252##2253##IDS_ERROR_2253##2254##IDS_ERROR_2254##2255##IDS_ERROR_2255##2256##IDS_ERROR_2256##2257##IDS_ERROR_2257##2258##IDS_ERROR_2258##2259##IDS_ERROR_2259##2260##IDS_ERROR_2260##2261##IDS_ERROR_2261##2262##IDS_ERROR_2262##2263##IDS_ERROR_2263##2264##IDS_ERROR_2264##2265##IDS_ERROR_2265##2266##IDS_ERROR_2266##2267##IDS_ERROR_2267##2268##IDS_ERROR_2268##2269##IDS_ERROR_2269##2270##IDS_ERROR_2270##2271##IDS_ERROR_2271##2272##IDS_ERROR_2272##2273##IDS_ERROR_2273##2274##IDS_ERROR_2274##2275##IDS_ERROR_2275##2276##IDS_ERROR_2276##2277##IDS_ERROR_2277##2278##IDS_ERROR_2278##2279##IDS_ERROR_2279##2280##IDS_ERROR_2280##2281##IDS_ERROR_2281##2282##IDS_ERROR_2282##23##IDS_ERROR_121##2302##IDS_ERROR_2302##2303##IDS_ERROR_2303##2304##IDS_ERROR_2304##2305##IDS_ERROR_2305##2306##IDS_ERROR_2306##2307##IDS_ERROR_2307##2308##IDS_ERROR_2308##2309##IDS_ERROR_2309##2310##IDS_ERROR_2310##2315##IDS_ERROR_2315##2318##IDS_ERROR_2318##2319##IDS_ERROR_2319##2320##IDS_ERROR_2320##2321##IDS_ERROR_2321##2322##IDS_ERROR_2322##2323##IDS_ERROR_2323##2324##IDS_ERROR_2324##2325##IDS_ERROR_2325##2326##IDS_ERROR_2326##2327##IDS_ERROR_2327##2328##IDS_ERROR_2328##2329##IDS_ERROR_2329##2330##IDS_ERROR_2330##2331##IDS_ERROR_2331##2332##IDS_ERROR_2332##2333##IDS_ERROR_2333##2334##IDS_ERROR_2334##2335##IDS_ERROR_2335##2336##IDS_ERROR_2336##2337##IDS_ERROR_2337##2338##IDS_ERROR_2338##2339##IDS_ERROR_2339##2340##IDS_ERROR_2340##2341##IDS_ERROR_2341##2342##IDS_ERROR_2342##2343##IDS_ERROR_2343##2344##IDS_ERROR_2344##2345##IDS_ERROR_2345##2347##IDS_ERROR_2347##2348##IDS_ERROR_2348##2349##IDS_ERROR_2349##2350##IDS_ERROR_2350##2351##IDS_ERROR_2351##2352##IDS_ERROR_2352##2353##IDS_ERROR_2353##2354##IDS_ERROR_2354##2355##IDS_ERROR_2355##2356##IDS_ERROR_2356##2357##IDS_ERROR_2357##2358##IDS_ERROR_2358##2359##IDS_ERROR_2359##2360##IDS_ERROR_2360##2361##IDS_ERROR_2361##2362##IDS_ERROR_2362##2363##IDS_ERROR_2363##2364##IDS_ERROR_2364##2365##IDS_ERROR_2365##2366##IDS_ERROR_2366##2367##IDS_ERROR_2367##2368##IDS_ERROR_2368##2370##IDS_ERROR_2370##2371##IDS_ERROR_2371##2372##IDS_ERROR_2372##2373##IDS_ERROR_2373##2374##IDS_ERROR_2374##2375##IDS_ERROR_2375##2376##IDS_ERROR_2376##2379##IDS_ERROR_2379##2380##IDS_ERROR_2380##2381##IDS_ERROR_2381##2382##IDS_ERROR_2382##2401##IDS_ERROR_2401##2402##IDS_ERROR_2402##2501##IDS_ERROR_2501##2502##IDS_ERROR_2502##2503##IDS_ERROR_2503##2601##IDS_ERROR_2601##2602##IDS_ERROR_2602##2603##IDS_ERROR_2603##2604##IDS_ERROR_2604##2605##IDS_ERROR_2605##2606##IDS_ERROR_2606##2607##IDS_ERROR_2607##2608##IDS_ERROR_2608##2609##IDS_ERROR_2609##2611##IDS_ERROR_2611##2612##IDS_ERROR_2612##2613##IDS_ERROR_2613##2614##IDS_ERROR_2614##2615##IDS_ERROR_2615##2616##IDS_ERROR_2616##2617##IDS_ERROR_2617##2618##IDS_ERROR_2618##2619##IDS_ERROR_2619##2620##IDS_ERROR_2620##2621##IDS_ERROR_2621##2701##IDS_ERROR_2701##2702##IDS_ERROR_2702##2703##IDS_ERROR_2703##2704##IDS_ERROR_2704##2705##IDS_ERROR_2705##2706##IDS_ERROR_2706##2707##IDS_ERROR_2707##2708##IDS_ERROR_2708##2709##IDS_ERROR_2709##2710##IDS_ERROR_2710##2711##IDS_ERROR_2711##2712##IDS_ERROR_2712##2713##IDS_ERROR_2713##2714##IDS_ERROR_2714##2715##IDS_ERROR_2715##2716##IDS_ERROR_2716##2717##IDS_ERROR_2717##2718##IDS_ERROR_2718##2719##IDS_ERROR_2719##2720##IDS_ERROR_2720##2721##IDS_ERROR_2721##2722##IDS_ERROR_2722##2723##IDS_ERROR_2723##2724##IDS_ERROR_2724##2725##IDS_ERROR_2725##2726##IDS_ERROR_2726##2727##IDS_ERROR_2727##2728##IDS_ERROR_2728##2729##IDS_ERROR_2729##2730##IDS_ERROR_2730##2731##IDS_ERROR_2731##2732##IDS_ERROR_2732##2733##IDS_ERROR_2733##2734##IDS_ERROR_2734##2735##IDS_ERROR_2735##2736##IDS_ERROR_2736##2737##IDS_ERROR_2737##2738##IDS_ERROR_2738##2739##IDS_ERROR_2739##2740##IDS_ERROR_2740##2741##IDS_ERROR_2741##2742##IDS_ERROR_2742##2743##IDS_ERROR_2743##2744##IDS_ERROR_2744##2745##IDS_ERROR_2745##2746##IDS_ERROR_2746##2747##IDS_ERROR_2747##2748##IDS_ERROR_2748##2749##IDS_ERROR_2749##2750##IDS_ERROR_2750##27500##IDS_ERROR_130##27501##IDS_ERROR_131##27502##IDS_ERROR_27502##27503##IDS_ERROR_27503##27504##IDS_ERROR_27504##27505##IDS_ERROR_27505##27506##IDS_ERROR_27506##27507##IDS_ERROR_27507##27508##IDS_ERROR_27508##27509##IDS_ERROR_27509##2751##IDS_ERROR_2751##27510##IDS_ERROR_27510##27511##IDS_ERROR_27511##27512##IDS_ERROR_27512##27513##IDS_ERROR_27513##27514##IDS_ERROR_27514##27515##IDS_ERROR_27515##27516##IDS_ERROR_27516##27517##IDS_ERROR_27517##27518##IDS_ERROR_27518##27519##IDS_ERROR_27519##2752##IDS_ERROR_2752##27520##IDS_ERROR_27520##27521##IDS_ERROR_27521##27522##IDS_ERROR_27522##27523##IDS_ERROR_27523##27524##IDS_ERROR_27524##27525##IDS_ERROR_27525##27526##IDS_ERROR_27526##27527##IDS_ERROR_27527##27528##IDS_ERROR_27528##27529##IDS_ERROR_27529##2753##IDS_ERROR_2753##27530##IDS_ERROR_27530##27531##IDS_ERROR_27531##27532##IDS_ERROR_27532##27533##IDS_ERROR_27533##27534##IDS_ERROR_27534##27535##IDS_ERROR_27535##27536##IDS_ERROR_27536##27537##IDS_ERROR_27537##27538##IDS_ERROR_27538##27539##IDS_ERROR_27539##2754##IDS_ERROR_2754##27540##IDS_ERROR_27540##27541##IDS_ERROR_27541##27542##IDS_ERROR_27542##27543##IDS_ERROR_27543##27544##IDS_ERROR_27544##27545##IDS_ERROR_27545##27546##IDS_ERROR_27546##27547##IDS_ERROR_27547##27548##IDS_ERROR_27548##27549##IDS_ERROR_27549##2755##IDS_ERROR_2755##27550##IDS_ERROR_27550##27551##IDS_ERROR_27551##27552##IDS_ERROR_27552##27553##IDS_ERROR_27553##27554##IDS_ERROR_27554##27555##IDS_ERROR_27555##2756##IDS_ERROR_2756##2757##IDS_ERROR_2757##2758##IDS_ERROR_2758##2759##IDS_ERROR_2759##2760##IDS_ERROR_2760##2761##IDS_ERROR_2761##2762##IDS_ERROR_2762##2763##IDS_ERROR_2763##2765##IDS_ERROR_2765##2766##IDS_ERROR_2766##2767##IDS_ERROR_2767##2768##IDS_ERROR_2768##2769##IDS_ERROR_2769##2770##IDS_ERROR_2770##2771##IDS_ERROR_2771##2772##IDS_ERROR_2772##2801##IDS_ERROR_2801##2802##IDS_ERROR_2802##2803##IDS_ERROR_2803##2804##IDS_ERROR_2804##2806##IDS_ERROR_2806##2807##IDS_ERROR_2807##2808##IDS_ERROR_2808##2809##IDS_ERROR_2809##2810##IDS_ERROR_2810##2811##IDS_ERROR_2811##2812##IDS_ERROR_2812##2813##IDS_ERROR_2813##2814##IDS_ERROR_2814##2815##IDS_ERROR_2815##2816##IDS_ERROR_2816##2817##IDS_ERROR_2817##2818##IDS_ERROR_2818##2819##IDS_ERROR_2819##2820##IDS_ERROR_2820##2821##IDS_ERROR_2821##2822##IDS_ERROR_2822##2823##IDS_ERROR_2823##2824##IDS_ERROR_2824##2825##IDS_ERROR_2825##2826##IDS_ERROR_2826##2827##IDS_ERROR_2827##2828##IDS_ERROR_2828##2829##IDS_ERROR_2829##2830##IDS_ERROR_2830##2831##IDS_ERROR_2831##2832##IDS_ERROR_2832##2833##IDS_ERROR_2833##2834##IDS_ERROR_2834##2835##IDS_ERROR_2835##2836##IDS_ERROR_2836##2837##IDS_ERROR_2837##2838##IDS_ERROR_2838##2839##IDS_ERROR_2839##2840##IDS_ERROR_2840##2841##IDS_ERROR_2841##2842##IDS_ERROR_2842##2843##IDS_ERROR_2843##2844##IDS_ERROR_2844##2845##IDS_ERROR_2845##2846##IDS_ERROR_2846##2847##IDS_ERROR_2847##2848##IDS_ERROR_2848##2849##IDS_ERROR_2849##2850##IDS_ERROR_2850##2851##IDS_ERROR_2851##2852##IDS_ERROR_2852##2853##IDS_ERROR_2853##2854##IDS_ERROR_2854##2855##IDS_ERROR_2855##2856##IDS_ERROR_2856##2857##IDS_ERROR_2857##2858##IDS_ERROR_2858##2859##IDS_ERROR_2859##2860##IDS_ERROR_2860##2861##IDS_ERROR_2861##2862##IDS_ERROR_2862##2863##IDS_ERROR_2863##2864##IDS_ERROR_2864##2865##IDS_ERROR_2865##2866##IDS_ERROR_2866##2867##IDS_ERROR_2867##2868##IDS_ERROR_2868##2869##IDS_ERROR_2869##2870##IDS_ERROR_2870##2871##IDS_ERROR_2871##2872##IDS_ERROR_2872##2873##IDS_ERROR_2873##2874##IDS_ERROR_2874##2875##IDS_ERROR_2875##2876##IDS_ERROR_2876##2877##IDS_ERROR_2877##2878##IDS_ERROR_2878##2879##IDS_ERROR_2879##2880##IDS_ERROR_2880##2881##IDS_ERROR_2881##2882##IDS_ERROR_2882##2883##IDS_ERROR_2883##2884##IDS_ERROR_2884##2885##IDS_ERROR_2885##2886##IDS_ERROR_2886##2887##IDS_ERROR_2887##2888##IDS_ERROR_2888##2889##IDS_ERROR_2889##2890##IDS_ERROR_2890##2891##IDS_ERROR_2891##2892##IDS_ERROR_2892##2893##IDS_ERROR_2893##2894##IDS_ERROR_2894##2895##IDS_ERROR_2895##2896##IDS_ERROR_2896##2897##IDS_ERROR_2897##2898##IDS_ERROR_2898##2899##IDS_ERROR_2899##2901##IDS_ERROR_2901##2902##IDS_ERROR_2902##2903##IDS_ERROR_2903##2904##IDS_ERROR_2904##2905##IDS_ERROR_2905##2906##IDS_ERROR_2906##2907##IDS_ERROR_2907##2908##IDS_ERROR_2908##2909##IDS_ERROR_2909##2910##IDS_ERROR_2910##2911##IDS_ERROR_2911##2912##IDS_ERROR_2912##2919##IDS_ERROR_2919##2920##IDS_ERROR_2920##2924##IDS_ERROR_2924##2927##IDS_ERROR_2927##2928##IDS_ERROR_2928##2929##IDS_ERROR_2929##2932##IDS_ERROR_2932##2933##IDS_ERROR_2933##2934##IDS_ERROR_2934##2935##IDS_ERROR_2935##2936##IDS_ERROR_2936##2937##IDS_ERROR_2937##2938##IDS_ERROR_2938##2939##IDS_ERROR_2939##2940##IDS_ERROR_2940##2941##IDS_ERROR_2941##2942##IDS_ERROR_2942##2943##IDS_ERROR_2943##2944##IDS_ERROR_2944##2945##IDS_ERROR_2945##3001##IDS_ERROR_3001##3002##IDS_ERROR_3002##32##IDS_ERROR_20##33##IDS_ERROR_21##4##IDS_ERROR_3##5##IDS_ERROR_4##7##IDS_ERROR_5##8##IDS_ERROR_6##9##IDS_ERROR_7##
+ + + Dialog_ + Control_ + Event + Attribute + + + + + + + + + + + + + + + +
CustomSetupItemDescriptionSelectionDescriptionTextCustomSetupLocationSelectionPathTextCustomSetupSizeSelectionSizeTextSetupInitializationActionDataActionDataTextSetupInitializationActionTextActionTextTextSetupProgressActionProgress95AdminInstallFinalizeProgressSetupProgressActionProgress95InstallFilesProgressSetupProgressActionProgress95MoveFilesProgressSetupProgressActionProgress95RemoveFilesProgressSetupProgressActionProgress95RemoveRegistryValuesProgressSetupProgressActionProgress95SetProgressProgressSetupProgressActionProgress95UnmoveFilesProgressSetupProgressActionProgress95WriteIniValuesProgressSetupProgressActionProgress95WriteRegistryValuesProgressSetupProgressActionTextActionTextText
+ + + Extension + Component_ + ProgId_ + MIME_ + Feature_ + +
ssisUnitssisUnit.TestRunner.2017.Primary_outputext1.FileAlwaysInstall
+ + + Feature + Feature_Parent + Title + Description + Display + Level + Directory_ + Attributes + ISReleaseFlags + ISComments + ISFeatureCabName + ISProFeatureName +
AlwaysInstall##DN_AlwaysInstall##Enter the description for this feature here.01INSTALLDIR16Enter comments regarding this feature here. +
+ + + Feature_ + Component_ + + + + + + + +
AlwaysInstallISX_DEFAULTCOMPONENTAlwaysInstallSSISUnit.2017.Primary_outputAlwaysInstallSsisUnit.Design_SQL2017.Primary_outputAlwaysInstallSsisUnit.TestComponents.2017.Primary_outputAlwaysInstallSsisUnitBase.Primary_outputAlwaysInstallssisUnit.TestRunner.2017.Primary_outputAlwaysInstallssisUnitTestRunnerUI.2017.Primary_output
+ + + File + Component_ + FileName + FileSize + Version + Language + Attributes + Sequence + ISBuildSourcePath + ISAttributes + ISComponentSubFolder_ +
ssisunit.2017.primary_outputSSISUnit.2017.Primary_outputSSISUnit.2017.Primary output01<SSISUnit.2017>|Built3 + ssisunit.design_sql2017.primSsisUnit.Design_SQL2017.Primary_outputSsisUnit.Design_SQL2017.Primary output01<SsisUnit.Design_SQL2017>|Built3 + ssisunit.testcomponents.2017SsisUnit.TestComponents.2017.Primary_outputSsisUnit.TestComponents.2017.Primary output01<SsisUnit.TestComponents.2017>|Built3 + ssisunit.testrunner.2017.prissisUnit.TestRunner.2017.Primary_outputssisUnit.TestRunner.2017.Primary output01<ssisUnit.TestRunner.2017>|Built3 + ssisunit.xsdISX_DEFAULTCOMPONENTSsisUnit.xsd01C:\Projects\ssisUnit\MAIN\SsisUnit\SsisUnit.xsd1 + ssisunitbase.primary_outputSsisUnitBase.Primary_outputSsisUnitBase.Primary output01<SsisUnitBase1>|Built3 + ssisunittestrunnerui.2017.prssisUnitTestRunnerUI.2017.Primary_outputssisUnitTestRunnerUI.2017.Primary output01<ssisUnitTestRunnerUI.2017>|Built3 +
+ + + File_ + SFPCatalog_ +
+ + + File_ + FontTitle +
+ + + Tag + Data + + +
PROJECT_ASSISTANT_DEFAULT_FEATUREAlwaysInstallPROJECT_ASSISTANT_FEATURESNonSelectable
+ + + ISBillboard + Duration + Origin + X + Y + Effect + Sequence + Target + Color + Style + Font + Title + DisplayName +
+ + + Package + SourcePath + ProductCode + Order + Options + InstallCondition + RemoveCondition + InstallProperties + RemoveProperties + ISReleaseFlags + DisplayName +
+ + + Package_ + File + FilePath + Options + Data + ISBuildSourcePath +
+ + + Action_ + Name + Value +
+ + + ISComCatalogObject_ + ItemName + ItemValue +
+ + + ISComCatalogCollection + ISComCatalogObject_ + CollectionName +
+ + + ISComCatalogCollection_ + ISComCatalogObject_ +
+ + + ISComCatalogObject + DisplayName +
+ + + ISComCatalogObject_ + ComputerName + Component_ + ISAttributes + DepFiles +
+ + + ISComPlusApplicationDLL + ISComPlusApplication_ + ISComCatalogObject_ + CLSID + ProgId + DLL + AlterDLL +
+ + + ISComPlusProxy + ISComPlusApplication_ + Component_ + ISAttributes + DepFiles +
+ + + ISComPlusApplication_ + File_ + ISPath +
+ + + File_ + ISComPlusApplicationDLL_ +
+ + + ISComPlusApplication_ + File_ + ISPath +
+ + + File_ + ISComPlusApplicationDLL_ +
+ + + Component_ + OS + Language + FilterProperty + Platforms + FTPLocation + HTTPLocation + Miscellaneous +
ISX_DEFAULTCOMPONENT_312FE49E_8AE4_4457_BA9D_E8DCE2433EA7_FILTER + SSISUnit.2017.Primary_output_564A24E2_AFF1_4B6E_B186_09D50A0890B4_FILTER + SsisUnit.Design_SQL2017.Primary_output_18771486_6C48_470C_B82E_DEB04CC626D3_FILTER + SsisUnit.TestComponents.2017.Primary_output_45144D2F_EA49_4EA4_ACF3_371CA3539B2F_FILTER + SsisUnitBase.Primary_output_DC8065A4_0F05_4B8D_AE13_56F2788A4B8D_FILTER + ssisUnit.TestRunner.2017.Primary_output_44BCB248_AE50_4718_A0BB_653A57D3336A_FILTER + ssisUnitTestRunnerUI.2017.Primary_output_94C1FA55_A21C_4418_A246_0BD1B2A1B533_FILTER +
+ + + Action_ + Description + FileType + ISCAReferenceFilePath +
+ + + ISDIMReference_ + RequiredUUID + RequiredMajorVersion + RequiredMinorVersion + RequiredBuildVersion + RequiredRevisionVersion +
+ + + ISDIMReference + ISBuildSourcePath +
+ + + ISDIMReference_Parent + ISDIMDependency_ +
+ + + ISDIMVariable + ISDIMReference_ + Name + NewValue + Type +
+ + + EntryPoint + Type + Source + Target +
+ + + ISDRMFile + File_ + ISDRMLicense_ + Shell +
+ + + ISDRMFile_ + Property + Value +
+ + + ISDRMLicense + Description + ProjectVersion + Attributes + LicenseNumber + RequestCode + ResponseCode +
+ + + ISDependency + Exclude + + + + + + + + + + + +
DTSMSG110.DLL1DTSPIPELINE.DLL1MICROSOFT.SQLSERVER.DIAGNOSTICS.STRACE.DLL1MICROSOFT.SQLSERVER.DTSMSG.DLL1MICROSOFT.SQLSERVER.DTSPIPELINEWRAP.DLL1MICROSOFT.SQLSERVER.DTSRUNTIMEWRAP.DLL1MICROSOFT.SQLSERVER.INTEGRATIONSERVICES.COMMON.OBJECTMODEL.DLL1MICROSOFT.SQLSERVER.MANAGEDDTS.DLL1MICROSOFT.SQLSERVER.MANAGEMENT.INTEGRATIONSERVICES.DLL1MICROSOFT.SQLSERVER.MSXML6_INTEROP.DLL1MICROSOFT.SQLSERVER.PIPELINEHOST.DLL1
+ + + ISDisk1File + ISBuildSourcePath + Disk +
+ + + Component_ + SourceFolder + IncludeFlags + IncludeFiles + ExcludeFiles + ISAttributes +
+ + + Feature_ + ISDIMReference_ +
+ + + Feature_ + ModuleID + Language +
+ + + Feature_ + ISMergeModule_ + Language_ +
+ + + Feature_ + ISSetupPrerequisites_ +
+ + + File_ + Manifest_ +
+ + + ISIISItem + ISIISItem_Parent + DisplayName + Type + Component_ +
+ + + ISIISProperty + ISIISItem_ + Schema + FriendlyName + MetaDataProp + MetaDataType + MetaDataUserType + MetaDataAttributes + MetaDataValue + Order + ISAttributes +
+ + + EntryPoint + Type + Source + Target +
+ + + ISLanguage + Included + +
10331
+ + + ISLinkerLibrary + Library + Order + + +
isrt.oblisrt.obl2iswi.obliswi.obl1
+ + + Dialog_ + Control_ + ISLanguage_ + Attributes + X + Y + Width + Height + Binary_ + ISBuildSourcePath +
+ + + Dialog_ + ISLanguage_ + Attributes + TextStyle_ + Width + Height +
+ + + Property + Order + ISLanguage_ + X + Y + Width + Height +
+ + + LockObject + Table + Domain + User + Permission + Attributes +
+ + + DiskId + ISProductConfiguration_ + ISRelease_ + LastSequence + DiskPrompt + Cabinet + VolumeLabel + Source +
+ + + ISLogicalDisk_ + ISProductConfiguration_ + ISRelease_ + Feature_ + Sequence + ISAttributes +
+ + + ISMergeModule + Language + Name + Destination + ISAttributes +
+ + + ISMergeModule_ + Language_ + ModuleConfiguration_ + Value + Format + Type + ContextData + DefaultValue + Attributes + DisplayName + Description + HelpLocation + HelpKeyword +
+ + + ObjectName + Language +
+ + + ObjectName + Property + Value + IncludeInBuild +
+ + + PatchConfiguration_ + UpgradedImage_ +
+ + + Name + CanPCDiffer + CanPVDiffer + IncludeWholeFiles + LeaveDecompressed + OptimizeForSize + EnablePatchCache + PatchCacheDir + Flags + PatchGuidsToReplace + TargetProductCodes + PatchGuid + OutputPath + MinMsiVersion + Attributes +
+ + + ISPatchConfiguration_ + Property + Value +
+ + + Name + ISUpgradedImage_ + FileKey + FilePath +
+ + + UpgradedImage + FileKey + Component +
+ + + ISPathVariable + Value + TestValue + Type + + + + + + + + + + + + + + + + + + + + + + + + + + +
CommonFilesFolder1ISPROJECTDIR1ISProductFolder1ISProjectDataFolder1ISProjectFolder1ProgramFilesFolder1SSISUnit.2017SSISUnit\SSISUnit.2017.csproj2SSISUnit.2014SSISUnit\SSISUnit.2014.csproj2SSISUnit_SQL2012SSISUnit\SSISUnit_SQL2012.csproj2SsisUnit.Design_SQL2012SsisUnitDesign\SsisUnit.Design_SQL2012.csproj2SsisUnit.Design_SQL2014SsisUnitDesign\SsisUnit.Design_SQL2014.csproj2SsisUnit.Design_SQL2017SsisUnitDesign\SsisUnit.Design_SQL2017.csproj2SsisUnit.TestComponents.2012SsisUnit.TestComponents\SsisUnit.TestComponents.2012.csproj2SsisUnit.TestComponents.2014SsisUnit.TestComponents\SsisUnit.TestComponents.2014.csproj2SsisUnit.TestComponents.2017SsisUnit.TestComponents\SsisUnit.TestComponents.2017.csproj2SsisUnit.TestRunner.2012SsisUnitTestRunner\SsisUnit.TestRunner.2012.csproj2SsisUnitBaseSsisUnitBase\SsisUnitBase.csproj2SsisUnitBase1SsisUnit.Base\SsisUnitBase.csproj2SystemFolder1WindowsFolder1ssisUnit.TestRunner.2014SsisUnitTestRunner\ssisUnit.TestRunner.2014.csproj2ssisUnitTestRunner - SQL2012TestRunner\ssisUnitTestRunner - SQL2012.csproj2ssisUnitTestRunnerUI.2014ssisUnitTestRunnerUI\ssisUnitTestRunnerUI.2014.csproj2ssisUnitTestRunnerUI_SQL2012ssisUnitTestRunnerUI\ssisUnitTestRunnerUI_SQL2012.csproj2ssisUnit.TestRunner.2017SsisUnitTestRunner\ssisUnit.TestRunner.2017.csproj2ssisUnitTestRunnerUI.20174ssisUnitTestRunnerUI\ssisUnitTestRunnerUI.2017.csproj2
+ + + Action_ + Name + Value +
+ + + ISProductConfiguration + ProductConfigurationFlags + GeneratePackageCode + +
Express1
+ + + ISProductConfiguration_ + InstanceId + Property + Value +
+ + + ISProductConfiguration_ + Property + Value +
+ + + ISRelease + ISProductConfiguration_ + BuildLocation + PackageName + Type + SupportedLanguagesUI + MsiSourceType + ReleaseType + Platforms + SupportedLanguagesData + DefaultLanguage + SupportedOSs + DiskSize + DiskSizeUnit + DiskClusterSize + ReleaseFlags + DiskSpanning + SynchMsi + MediaLocation + URLLocation + DigitalURL + DigitalPVK + DigitalSPC + Password + VersionCopyright + Attributes + CDBrowser + DotNetBuildConfiguration + MsiCommandLine + ISSetupPrerequisiteLocation + + + + + + + + +
CD_ROMExpress<ISProjectDataFolder>Default0103302Intel10330650020480MediaLocationhttp://758043CustomExpress<ISProjectDataFolder>Default2103302Intel10330100010240MediaLocationhttp://758053DVD-10Express<ISProjectDataFolder>Default3103302Intel103308.75120480MediaLocationhttp://758053DVD-18Express<ISProjectDataFolder>Default3103302Intel1033015.83120480MediaLocationhttp://758053DVD-5Express<ISProjectDataFolder>Default3103302Intel103304.38120480MediaLocationhttp://758053DVD-9Express<ISProjectDataFolder>Default3103302Intel103307.95120480MediaLocationhttp://758053SingleImageExpress<ISProjectDataFolder>PackageName1103321Intel103300000MediaLocationhttp://1085733WebDeploymentExpress<ISProjectDataFolder>PackageName4103321Intel103300000MediaLocationhttp://1249413
+ + + ISRelease_ + ISProductConfiguration_ + Property + Value +
+ + + ISRelease_ + ISProductConfiguration_ + WebType + WebURL + WebCabSize + OneClickCabName + OneClickHtmlName + WebLocalCachePath + EngineLocation + Win9xMsiUrl + WinNTMsiUrl + ISEngineLocation + ISEngineURL + OneClickTargetBrowser + DigitalCertificateIdNS + DigitalCertificateDBaseNS + DigitalCertificatePasswordNS + DotNetRedistLocation + DotNetRedistURL + DotNetVersion + DotNetBaseLanguage + DotNetLangaugePacks + DotNetFxCmdLine + DotNetLangPackCmdLine + JSharpCmdLine + Attributes + JSharpRedistLocation + MsiEngineVersion + WinMsi30Url + CertPassword +
CD_ROMExpress0http://0installinstall[LocalAppDataFolder]Downloaded Installations0http://www.installengine.com/Msiengine20http://www.installengine.com/Msiengine200http://www.installengine.com/cert05/isengine03http://www.installengine.com/cert05/dotnetfx010333http://www.installengine.com/Msiengine30 + CustomExpress0http://0installinstall[LocalAppDataFolder]Downloaded Installations0http://www.installengine.com/Msiengine20http://www.installengine.com/Msiengine200http://www.installengine.com/cert05/isengine03http://www.installengine.com/cert05/dotnetfx010333http://www.installengine.com/Msiengine30 + DVD-10Express0http://0installinstall[LocalAppDataFolder]Downloaded Installations0http://www.installengine.com/Msiengine20http://www.installengine.com/Msiengine200http://www.installengine.com/cert05/isengine03http://www.installengine.com/cert05/dotnetfx010333http://www.installengine.com/Msiengine30 + DVD-18Express0http://0installinstall[LocalAppDataFolder]Downloaded Installations0http://www.installengine.com/Msiengine20http://www.installengine.com/Msiengine200http://www.installengine.com/cert05/isengine03http://www.installengine.com/cert05/dotnetfx010333http://www.installengine.com/Msiengine30 + DVD-5Express0http://0installinstall[LocalAppDataFolder]Downloaded Installations0http://www.installengine.com/Msiengine20http://www.installengine.com/Msiengine200http://www.installengine.com/cert05/isengine03http://www.installengine.com/cert05/dotnetfx010333http://www.installengine.com/Msiengine30 + DVD-9Express0http://0installinstall[LocalAppDataFolder]Downloaded Installations0http://www.installengine.com/Msiengine20http://www.installengine.com/Msiengine200http://www.installengine.com/cert05/isengine03http://www.installengine.com/cert05/dotnetfx010333http://www.installengine.com/Msiengine30 + SingleImageExpress0http://0installinstall[LocalAppDataFolder]Downloaded Installations1http://www.installengine.com/Msiengine20http://www.installengine.com/Msiengine200http://www.installengine.com/cert05/isengine03http://www.installengine.com/cert05/dotnetfx010333http://www.installengine.com/Msiengine30 + WebDeploymentExpress0http://0setupDefault[LocalAppDataFolder]Downloaded Installations2http://www.Installengine.com/Msiengine20http://www.Installengine.com/Msiengine200http://www.installengine.com/cert05/isengine03http://www.installengine.com/cert05/dotnetfx010333http://www.installengine.com/Msiengine30 +
+ + + ISRelease_ + ISProductConfiguration_ + Name + Value +
+ + + ISRelease_ + ISProductConfiguration_ + Repository + DisplayName + Publisher + Description + ISAttributes +
+ + + ISSQLConnection + Server + Database + UserName + Password + Authentication + Attributes + Order + Comments + CmdTimeout + BatchSeparator + ScriptVersion_Table + ScriptVersion_Column +
+ + + ISSQLConnectionDBServer + ISSQLConnection_ + ISSQLDBMetaData_ + Order +
+ + + ISSQLConnection_ + ISSQLScriptFile_ + Order +
+ + + ISSQLDBMetaData + DisplayName + AdoDriverName + AdoCxnDriver + AdoCxnServer + AdoCxnDatabase + AdoCxnUserID + AdoCxnPassword + AdoCxnWindowsSecurity + AdoCxnNetLibrary + TestDatabaseCmd + TestTableCmd + VersionInfoCmd + VersionBeginToken + VersionEndToken + LocalInstanceNames + CreateDbCmd + SwitchDbCmd + ISAttributes + TestTableCmd2 + WinAuthentUserId + DsnODBCName + AdoCxnPort + AdoCxnAdditional + QueryDatabasesCmd + CreateTableCmd + InsertRecordCmd + SelectTableCmd + ScriptVersion_Table + ScriptVersion_Column + ScriptVersion_ColumnType +
+ + + ISSQLRequirement + ISSQLConnection_ + MajorVersion + ServicePackLevel + Attributes + ISSQLConnectionDBServer_ +
+ + + ErrNumber + ISSQLScriptFile_ + ErrHandling + Message + Attributes +
+ + + ISSQLScriptFile + Component_ + Scheduling + InstallText + UninstallText + ISBuildSourcePath + Comments + ErrorHandling + Attributes + Version + Condition + DisplayName +
+ + + ISSQLScriptFile_ + Server + Database + UserName + Password + Authentication + IncludeTables + ExcludeTables + Attributes +
+ + + ISSQLScriptReplace + ISSQLScriptFile_ + Search + Replace + Attributes +
+ + + ISScriptFile +
+ + + FileKey + Cost + Order + CmdLine +
+ + + ISSetupFile + FileName + Stream + Language + Splash + Path +
+ + + ISSetupPrerequisites + ISBuildSourcePath + Order + ISSetupLocation + ISReleaseFlags +
+ + + ISSetupType + Description + Display_Name + Display + Comments +
Custom##IDS__IsSetupTypeMinDlg_ChooseFeatures####IDS__IsSetupTypeMinDlg_Custom##3 + Minimal##IDS__IsSetupTypeMinDlg_MinimumFeatures####IDS__IsSetupTypeMinDlg_Minimal##2 + Typical##IDS__IsSetupTypeMinDlg_AllFeatures####IDS__IsSetupTypeMinDlg_Typical##1 +
+ + + ISSetupType_ + Feature_ + + + +
CustomAlwaysInstallMinimalAlwaysInstallTypicalAlwaysInstall
+ + + Name + ISBuildSourcePath +
+ + + ISString + ISLanguage_ + Value + Encoded + Comment + TimeStamp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
COMPANY_NAME1033Pragmatic Works0-1801369489DN_AlwaysInstall1033Always Install0-1801342965IDPROP_EXPRESS_LAUNCH_CONDITION_COLOR1033The color settings of your system are not adequate for running [ProductName].0-1801342965IDPROP_EXPRESS_LAUNCH_CONDITION_DOTNETVERSION40FULL1033Microsoft .NET Framework 4.0 Full package or greater needs to be installed for this installation to continue.0-1801379669IDPROP_EXPRESS_LAUNCH_CONDITION_OS1033The operating system is not adequate for running [ProductName].0-1801342965IDPROP_EXPRESS_LAUNCH_CONDITION_PROCESSOR1033The processor is not adequate for running [ProductName].0-1801342965IDPROP_EXPRESS_LAUNCH_CONDITION_RAM1033The amount of RAM is not adequate for running [ProductName].0-1801342965IDPROP_EXPRESS_LAUNCH_CONDITION_SCREEN1033The screen resolution is not adequate for running [ProductName].0-1801342965IDPROP_SETUPTYPE_COMPACT1033Compact0-1801342965IDPROP_SETUPTYPE_COMPACT_DESC1033Compact Description0-1801342965IDPROP_SETUPTYPE_COMPLETE1033Complete0-1801342965IDPROP_SETUPTYPE_COMPLETE_DESC1033Complete0-1801342965IDPROP_SETUPTYPE_CUSTOM1033Custom0-1801342965IDPROP_SETUPTYPE_CUSTOM_DESC1033Custom Description0-1801342965IDPROP_SETUPTYPE_CUSTOM_DESC_PRO1033Custom0-1801342965IDPROP_SETUPTYPE_TYPICAL1033Typical0-1801342965IDPROP_SETUPTYPE_TYPICAL_DESC1033Typical Description0-1801342965IDS_ACTIONTEXT_11033[1]0-1801342965IDS_ACTIONTEXT_1b1033[1]0-1801342965IDS_ACTIONTEXT_1c1033[1]0-1801342965IDS_ACTIONTEXT_1d1033[1]0-1801342965IDS_ACTIONTEXT_Advertising1033Advertising application0-1801342965IDS_ACTIONTEXT_AllocatingRegistry1033Allocating registry space0-1801342965IDS_ACTIONTEXT_AppCommandLine1033Application: [1], Command line: [2]0-1801342965IDS_ACTIONTEXT_AppId1033AppId: [1]{{, AppType: [2]}}0-1801342965IDS_ACTIONTEXT_AppIdAppTypeRSN1033AppId: [1]{{, AppType: [2], Users: [3], RSN: [4]}}0-1801342965IDS_ACTIONTEXT_Application1033Application: [1]0-1801342965IDS_ACTIONTEXT_BindingExes1033Binding executables0-1801342965IDS_ACTIONTEXT_ClassId1033Class ID: [1]0-1801342965IDS_ACTIONTEXT_ClsID1033Class ID: [1]0-1801342965IDS_ACTIONTEXT_ComponentIDQualifier1033Component ID: [1], Qualifier: [2]0-1801342965IDS_ACTIONTEXT_ComponentIdQualifier21033Component ID: [1], Qualifier: [2]0-1801342965IDS_ACTIONTEXT_ComputingSpace1033Computing space requirements0-1801342965IDS_ACTIONTEXT_ComputingSpace21033Computing space requirements0-1801342965IDS_ACTIONTEXT_ComputingSpace31033Computing space requirements0-1801342965IDS_ACTIONTEXT_ContentTypeExtension1033MIME Content Type: [1], Extension: [2]0-1801342965IDS_ACTIONTEXT_ContentTypeExtension21033MIME Content Type: [1], Extension: [2]0-1801342965IDS_ACTIONTEXT_CopyingNetworkFiles1033Copying files to the network0-1801342965IDS_ACTIONTEXT_CopyingNewFiles1033Copying new files0-1801342965IDS_ACTIONTEXT_CreatingDuplicate1033Creating duplicate files0-1801342965IDS_ACTIONTEXT_CreatingFolders1033Creating folders0-1801342965IDS_ACTIONTEXT_CreatingIISRoots1033Creating IIS Virtual Roots...0-1801342965IDS_ACTIONTEXT_CreatingShortcuts1033Creating shortcuts0-1801342965IDS_ACTIONTEXT_DeletingServices1033Deleting services0-1801342965IDS_ACTIONTEXT_EnvironmentStrings1033Updating environment strings0-1801342965IDS_ACTIONTEXT_EvaluateLaunchConditions1033Evaluating launch conditions0-1801342965IDS_ACTIONTEXT_Extension1033Extension: [1]0-1801342965IDS_ACTIONTEXT_Extension21033Extension: [1]0-1801342965IDS_ACTIONTEXT_Feature1033Feature: [1]0-1801342965IDS_ACTIONTEXT_FeatureColon1033Feature: [1]0-1801342965IDS_ACTIONTEXT_File1033File: [1]0-1801342965IDS_ACTIONTEXT_File21033File: [1]0-1801342965IDS_ACTIONTEXT_FileDependencies1033File: [1], Dependencies: [2]0-1801342965IDS_ACTIONTEXT_FileDir1033File: [1], Directory: [9]0-1801342965IDS_ACTIONTEXT_FileDir21033File: [1], Directory: [9]0-1801342965IDS_ACTIONTEXT_FileDir31033File: [1], Directory: [9]0-1801342965IDS_ACTIONTEXT_FileDirSize1033File: [1], Directory: [9], Size: [6]0-1801342965IDS_ACTIONTEXT_FileDirSize21033File: [1], Directory: [9], Size: [6]0-1801342965IDS_ACTIONTEXT_FileDirSize31033File: [1], Directory: [9], Size: [6]0-1801342965IDS_ACTIONTEXT_FileDirSize41033File: [1], Directory: [2], Size: [3]0-1801342965IDS_ACTIONTEXT_FileDirectorySize1033File: [1], Directory: [9], Size: [6]0-1801342965IDS_ACTIONTEXT_FileFolder1033File: [1], Folder: [2]0-1801342965IDS_ACTIONTEXT_FileFolder21033File: [1], Folder: [2]0-1801342965IDS_ACTIONTEXT_FileSectionKeyValue1033File: [1], Section: [2], Key: [3], Value: [4]0-1801342965IDS_ACTIONTEXT_FileSectionKeyValue21033File: [1], Section: [2], Key: [3], Value: [4]0-1801342965IDS_ACTIONTEXT_Folder1033Folder: [1]0-1801342965IDS_ACTIONTEXT_Folder11033Folder: [1]0-1801342965IDS_ACTIONTEXT_Font1033Font: [1]0-1801342965IDS_ACTIONTEXT_Font21033Font: [1]0-1801342965IDS_ACTIONTEXT_FoundApp1033Found application: [1]0-1801342965IDS_ACTIONTEXT_FreeSpace1033Free space: [1]0-1801342965IDS_ACTIONTEXT_GeneratingScript1033Generating script operations for action:0-1801342965IDS_ACTIONTEXT_ISLockPermissionsCost1033Gathering permissions information for objects...0-1801342965IDS_ACTIONTEXT_ISLockPermissionsInstall1033Applying permissions information for objects...0-1801342965IDS_ACTIONTEXT_InitializeODBCDirs1033Initializing ODBC directories0-1801342965IDS_ACTIONTEXT_InstallODBC1033Installing ODBC components0-1801342965IDS_ACTIONTEXT_InstallServices1033Installing new services0-1801342965IDS_ACTIONTEXT_InstallingSystemCatalog1033Installing system catalog0-1801342965IDS_ACTIONTEXT_KeyName1033Key: [1], Name: [2]0-1801342965IDS_ACTIONTEXT_KeyNameValue1033Key: [1], Name: [2], Value: [3]0-1801342965IDS_ACTIONTEXT_LibId1033LibID: [1]0-1801342965IDS_ACTIONTEXT_Libid21033LibID: [1]0-1801342965IDS_ACTIONTEXT_MigratingFeatureStates1033Migrating feature states from related applications0-1801342965IDS_ACTIONTEXT_MovingFiles1033Moving files0-1801342965IDS_ACTIONTEXT_NameValueAction1033Name: [1], Value: [2], Action [3]0-1801342965IDS_ACTIONTEXT_NameValueAction21033Name: [1], Value: [2], Action [3]0-1801342965IDS_ACTIONTEXT_PatchingFiles1033Patching files0-1801342965IDS_ACTIONTEXT_ProgID1033ProgID: [1]0-1801342965IDS_ACTIONTEXT_ProgID21033ProgID: [1]0-1801342965IDS_ACTIONTEXT_PropertySignature1033Property: [1], Signature: [2]0-1801342965IDS_ACTIONTEXT_PublishProductFeatures1033Publishing product features0-1801342965IDS_ACTIONTEXT_PublishProductInfo1033Publishing product information0-1801342965IDS_ACTIONTEXT_PublishingQualifiedComponents1033Publishing qualified components0-1801342965IDS_ACTIONTEXT_RegUser1033Registering user0-1801342965IDS_ACTIONTEXT_RegisterClassServer1033Registering class servers0-1801342965IDS_ACTIONTEXT_RegisterExtensionServers1033Registering extension servers0-1801342965IDS_ACTIONTEXT_RegisterFonts1033Registering fonts0-1801342965IDS_ACTIONTEXT_RegisterMimeInfo1033Registering MIME info0-1801342965IDS_ACTIONTEXT_RegisterTypeLibs1033Registering type libraries0-1801342965IDS_ACTIONTEXT_RegisteringComPlus1033Registering COM+ Applications and Components0-1801342965IDS_ACTIONTEXT_RegisteringModules1033Registering modules0-1801342965IDS_ACTIONTEXT_RegisteringProduct1033Registering product0-1801342965IDS_ACTIONTEXT_RegisteringProgIdentifiers1033Registering program identifiers0-1801342965IDS_ACTIONTEXT_RemoveApps1033Removing applications0-1801342965IDS_ACTIONTEXT_RemovingBackup1033Removing backup files0-1801342965IDS_ACTIONTEXT_RemovingDuplicates1033Removing duplicated files0-1801342965IDS_ACTIONTEXT_RemovingFiles1033Removing files0-1801342965IDS_ACTIONTEXT_RemovingFolders1033Removing folders0-1801342965IDS_ACTIONTEXT_RemovingIISRoots1033Removing IIS Virtual Roots...0-1801342965IDS_ACTIONTEXT_RemovingIni1033Removing INI file entries0-1801342965IDS_ACTIONTEXT_RemovingMoved1033Removing moved files0-1801342965IDS_ACTIONTEXT_RemovingODBC1033Removing ODBC components0-1801342965IDS_ACTIONTEXT_RemovingRegistry1033Removing system registry values0-1801342965IDS_ACTIONTEXT_RemovingShortcuts1033Removing shortcuts0-1801342965IDS_ACTIONTEXT_RollingBack1033Rolling back action:0-1801342965IDS_ACTIONTEXT_SearchForRelated1033Searching for related applications0-1801342965IDS_ACTIONTEXT_SearchInstalled1033Searching for installed applications0-1801342965IDS_ACTIONTEXT_SearchingQualifyingProducts1033Searching for qualifying products0-1801342965IDS_ACTIONTEXT_SearchingQualifyingProducts21033Searching for qualifying products0-1801342965IDS_ACTIONTEXT_Service1033Service: [1]0-1801342965IDS_ACTIONTEXT_Service21033Service: [2]0-1801342965IDS_ACTIONTEXT_Service31033Service: [1]0-1801342965IDS_ACTIONTEXT_Service41033Service: [1]0-1801342965IDS_ACTIONTEXT_Shortcut1033Shortcut: [1]0-1801342965IDS_ACTIONTEXT_Shortcut11033Shortcut: [1]0-1801342965IDS_ACTIONTEXT_StartingServices1033Starting services0-1801342965IDS_ACTIONTEXT_StoppingServices1033Stopping services0-1801342965IDS_ACTIONTEXT_UnpublishProductFeatures1033Unpublishing product features0-1801342965IDS_ACTIONTEXT_UnpublishQualified1033Unpublishing Qualified Components0-1801342965IDS_ACTIONTEXT_UnpublishingProductInfo1033Unpublishing product information0-1801342965IDS_ACTIONTEXT_UnregTypeLibs1033Unregistering type libraries0-1801342965IDS_ACTIONTEXT_UnregisterClassServers1033Unregister class servers0-1801342965IDS_ACTIONTEXT_UnregisterExtensionServers1033Unregistering extension servers0-1801342965IDS_ACTIONTEXT_UnregisterModules1033Unregistering modules0-1801342965IDS_ACTIONTEXT_UnregisteringComPlus1033Unregistering COM+ Applications and Components0-1801342965IDS_ACTIONTEXT_UnregisteringFonts1033Unregistering fonts0-1801342965IDS_ACTIONTEXT_UnregisteringMimeInfo1033Unregistering MIME info0-1801342965IDS_ACTIONTEXT_UnregisteringProgramIds1033Unregistering program identifiers0-1801342965IDS_ACTIONTEXT_UpdateComponentRegistration1033Updating component registration0-1801342965IDS_ACTIONTEXT_UpdateEnvironmentStrings1033Updating environment strings0-1801342965IDS_ACTIONTEXT_Validating1033Validating install0-1801342965IDS_ACTIONTEXT_WritingINI1033Writing INI file values0-1801342965IDS_ACTIONTEXT_WritingRegistry1033Writing system registry values0-1801342965IDS_BACK1033< &Back0-1801342965IDS_CANCEL1033Cancel0-1801342965IDS_CANCEL21033&Cancel0-1801342965IDS_CHANGE1033&Change...0-1801342965IDS_COMPLUS_PROGRESSTEXT_COST1033Costing COM+ application: [1]0-1801342965IDS_COMPLUS_PROGRESSTEXT_INSTALL1033Installing COM+ application: [1]0-1801342965IDS_COMPLUS_PROGRESSTEXT_UNINSTALL1033Uninstalling COM+ application: [1]0-1801342965IDS_DIALOG_TEXT2_DESCRIPTION1033Dialog Normal Description0-1801342965IDS_DIALOG_TEXT_DESCRIPTION_EXTERIOR1033{&TahomaBold10}Dialog Bold Title0-1801342965IDS_DIALOG_TEXT_DESCRIPTION_INTERIOR1033{&MSSansBold8}Dialog Bold Title0-1801342965IDS_DIFX_AMD641033[ProductName] requires an X64 processor. Click OK to exit the wizard.0-1801342965IDS_DIFX_IA641033[ProductName] requires an IA64 processor. Click OK to exit the wizard.0-1801342965IDS_DIFX_X861033[ProductName] requires an X86 processor. Click OK to exit the wizard.0-1801342965IDS_DatabaseFolder_InstallDatabaseTo1033Install [ProductName] database to:0-1801342965IDS_ERROR_01033{{Fatal error: }}0-1801342965IDS_ERROR_11033Error [1]. 0-1801342965IDS_ERROR_101033=== Logging started: [Date] [Time] ===0-1801342965IDS_ERROR_1001033Could not remove shortcut [2]. Verify that the shortcut file exists and that you can access it.0-1801342965IDS_ERROR_1011033Could not register type library for file [2]. Contact your support personnel.0-1801342965IDS_ERROR_1021033Could not unregister type library for file [2]. Contact your support personnel.0-1801342965IDS_ERROR_1031033Could not update the INI file [2][3]. Verify that the file exists and that you can access it.0-1801342965IDS_ERROR_1041033Could not schedule file [2] to replace file [3] on reboot. Verify that you have write permissions to file [3].0-1801342965IDS_ERROR_1051033Error removing ODBC driver manager, ODBC error [2]: [3]. Contact your support personnel.0-1801342965IDS_ERROR_1061033Error installing ODBC driver manager, ODBC error [2]: [3]. Contact your support personnel.0-1801342965IDS_ERROR_1071033Error removing ODBC driver [4], ODBC error [2]: [3]. Verify that you have sufficient privileges to remove ODBC drivers.0-1801342965IDS_ERROR_1081033Error installing ODBC driver [4], ODBC error [2]: [3]. Verify that the file [4] exists and that you can access it.0-1801342965IDS_ERROR_1091033Error configuring ODBC data source [4], ODBC error [2]: [3]. Verify that the file [4] exists and that you can access it.0-1801342965IDS_ERROR_111033=== Logging stopped: [Date] [Time] ===0-1801342965IDS_ERROR_1101033Service [2] ([3]) failed to start. Verify that you have sufficient privileges to start system services.0-1801342965IDS_ERROR_1111033Service [2] ([3]) could not be stopped. Verify that you have sufficient privileges to stop system services.0-1801342965IDS_ERROR_1121033Service [2] ([3]) could not be deleted. Verify that you have sufficient privileges to remove system services.0-1801342965IDS_ERROR_1131033Service [2] ([3]) could not be installed. Verify that you have sufficient privileges to install system services.0-1801342965IDS_ERROR_1141033Could not update environment variable [2]. Verify that you have sufficient privileges to modify environment variables.0-1801342965IDS_ERROR_1151033You do not have sufficient privileges to complete this installation for all users of the machine. Log on as an administrator and then retry this installation.0-1801342965IDS_ERROR_1161033Could not set file security for file [3]. Error: [2]. Verify that you have sufficient privileges to modify the security permissions for this file.0-1801342965IDS_ERROR_1171033Component Services (COM+ 1.0) are not installed on this computer. This installation requires Component Services in order to complete successfully. Component Services are available on Windows 2000.0-1801342965IDS_ERROR_1181033Error registering COM+ application. Contact your support personnel for more information.0-1801342965IDS_ERROR_1191033Error unregistering COM+ application. Contact your support personnel for more information.0-1801342965IDS_ERROR_121033Action start [Time]: [1].0-1801342965IDS_ERROR_1201033Removing older versions of this application0-1801342965IDS_ERROR_1211033Preparing to remove older versions of this application0-1801342965IDS_ERROR_1221033Error applying patch to file [2]. It has probably been updated by other means, and can no longer be modified by this patch. For more information contact your patch vendor. {{System Error: [3]}}0-1801342965IDS_ERROR_1231033[2] cannot install one of its required products. Contact your technical support group. {{System Error: [3].}}0-1801342965IDS_ERROR_1241033The older version of [2] cannot be removed. Contact your technical support group. {{System Error [3].}}0-1801342965IDS_ERROR_1251033The description for service '[2]' ([3]) could not be changed.0-1801342965IDS_ERROR_1261033The Windows Installer service cannot update the system file [2] because the file is protected by Windows. You may need to update your operating system for this program to work correctly. {{Package version: [3], OS Protected version: [4]}}0-1801342965IDS_ERROR_1271033The Windows Installer service cannot update the protected Windows file [2]. {{Package version: [3], OS Protected version: [4], SFP Error: [5]}}0-1801342965IDS_ERROR_1281033The Windows Installer service cannot update one or more protected Windows files. SFP Error: [2]. List of protected files: [3]0-1801342965IDS_ERROR_1291033User installations are disabled via policy on the machine.0-1801342965IDS_ERROR_131033Action ended [Time]: [1]. Return value [2].0-1801342965IDS_ERROR_1301033This setup requires Internet Information Server 4.0 or higher for configuring IIS Virtual Roots. Please make sure that you have IIS 4.0 or higher.0-1801342965IDS_ERROR_1311033This setup requires Administrator privileges for configuring IIS Virtual Roots.0-1801342965IDS_ERROR_13291033A file that is required cannot be installed because the cabinet file [2] is not digitally signed. This may indicate that the cabinet file is corrupt.0-1801342965IDS_ERROR_13301033A file that is required cannot be installed because the cabinet file [2] has an invalid digital signature. This may indicate that the cabinet file is corrupt.{ Error [3] was returned by WinVerifyTrust.}0-1801342965IDS_ERROR_13311033Failed to correctly copy [2] file: CRC error.0-1801342965IDS_ERROR_13321033Failed to correctly patch [2] file: CRC error.0-1801342965IDS_ERROR_13331033Failed to correctly patch [2] file: CRC error.0-1801342965IDS_ERROR_13341033The file '[2]' cannot be installed because the file cannot be found in cabinet file '[3]'. This could indicate a network error, an error reading from the CD-ROM, or a problem with this package.0-1801342965IDS_ERROR_13351033The cabinet file '[2]' required for this installation is corrupt and cannot be used. This could indicate a network error, an error reading from the CD-ROM, or a problem with this package.0-1801342965IDS_ERROR_13361033There was an error creating a temporary file that is needed to complete this installation. Folder: [3]. System error code: [2]0-1801342965IDS_ERROR_141033Time remaining: {[1] minutes }{[2] seconds}0-1801342965IDS_ERROR_151033Out of memory. Shut down other applications before retrying.0-1801342965IDS_ERROR_161033Installer is no longer responding.0-1801342965IDS_ERROR_16091033An error occurred while applying security settings. [2] is not a valid user or group. This could be a problem with the package, or a problem connecting to a domain controller on the network. Check your network connection and click Retry, or Cancel to end the install. Unable to locate the user's SID, system error [3]0-1801342965IDS_ERROR_16511033Admin user failed to apply patch for a per-user managed or a per-machine application which is in advertise state.0-1801342965IDS_ERROR_171033Installer terminated prematurely.0-1801342965IDS_ERROR_17151033Installed [2].0-1801342965IDS_ERROR_17161033Configured [2].0-1801342965IDS_ERROR_17171033Removed [2].0-1801342965IDS_ERROR_17181033File [2] was rejected by digital signature policy.0-1801342965IDS_ERROR_17191033Windows Installer service could not be accessed. Contact your support personnel to verify that it is properly registered and enabled.0-1801342965IDS_ERROR_17201033There is a problem with this Windows Installer package. A script required for this install to complete could not be run. Contact your support personnel or package vendor. Custom action [2] script error [3], [4]: [5] Line [6], Column [7], [8]0-1801342965IDS_ERROR_17211033There is a problem with this Windows Installer package. A program required for this install to complete could not be run. Contact your support personnel or package vendor. Action: [2], location: [3], command: [4]0-1801342965IDS_ERROR_17221033There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor. Action [2], location: [3], command: [4]0-1801342965IDS_ERROR_17231033There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor. Action [2], entry: [3], library: [4]0-1801342965IDS_ERROR_17241033Removal completed successfully.0-1801342965IDS_ERROR_17251033Removal failed.0-1801342965IDS_ERROR_17261033Advertisement completed successfully.0-1801342965IDS_ERROR_17271033Advertisement failed.0-1801342965IDS_ERROR_17281033Configuration completed successfully.0-1801342965IDS_ERROR_17291033Configuration failed.0-1801342965IDS_ERROR_17301033You must be an Administrator to remove this application. To remove this application, you can log on as an administrator, or contact your technical support group for assistance.0-1801342965IDS_ERROR_17311033The source installation package for the product [2] is out of sync with the client package. Try the installation again using a valid copy of the installation package '[3]'.0-1801342965IDS_ERROR_17321033In order to complete the installation of [2], you must restart the computer. Other users are currently logged on to this computer, and restarting may cause them to lose their work. Do you want to restart now?0-1801342965IDS_ERROR_181033Please wait while Windows configures [ProductName]0-1801342965IDS_ERROR_191033Gathering required information...0-1801342965IDS_ERROR_19351033An error occurred during the installation of assembly component [2]. HRESULT: [3]. {{assembly interface: [4], function: [5], assembly name: [6]}}0-1801342965IDS_ERROR_19361033An error occurred during the installation of assembly '[6]'. The assembly is not strongly named or is not signed with the minimal key length. HRESULT: [3]. {{assembly interface: [4], function: [5], component: [2]}}0-1801342965IDS_ERROR_19371033An error occurred during the installation of assembly '[6]'. The signature or catalog could not be verified or is not valid. HRESULT: [3]. {{assembly interface: [4], function: [5], component: [2]}}0-1801342965IDS_ERROR_19381033An error occurred during the installation of assembly '[6]'. One or more modules of the assembly could not be found. HRESULT: [3]. {{assembly interface: [4], function: [5], component: [2]}}0-1801342965IDS_ERROR_21033Warning [1]. 0-1801342965IDS_ERROR_201033{[ProductName] }Setup completed successfully.0-1801342965IDS_ERROR_211033{[ProductName] }Setup failed.0-1801342965IDS_ERROR_21011033Shortcuts not supported by the operating system.0-1801342965IDS_ERROR_21021033Invalid .ini action: [2]0-1801342965IDS_ERROR_21031033Could not resolve path for shell folder [2].0-1801342965IDS_ERROR_21041033Writing .ini file: [3]: System error: [2].0-1801342965IDS_ERROR_21051033Shortcut Creation [3] Failed. System error: [2].0-1801342965IDS_ERROR_21061033Shortcut Deletion [3] Failed. System error: [2].0-1801342965IDS_ERROR_21071033Error [3] registering type library [2].0-1801342965IDS_ERROR_21081033Error [3] unregistering type library [2].0-1801342965IDS_ERROR_21091033Section missing for .ini action.0-1801342965IDS_ERROR_21101033Key missing for .ini action.0-1801342965IDS_ERROR_21111033Detection of running applications failed, could not get performance data. Registered operation returned : [2].0-1801342965IDS_ERROR_21121033Detection of running applications failed, could not get performance index. Registered operation returned : [2].0-1801342965IDS_ERROR_21131033Detection of running applications failed.0-1801342965IDS_ERROR_221033Error reading from file: [2]. {{ System error [3].}} Verify that the file exists and that you can access it.0-1801342965IDS_ERROR_22001033Database: [2]. Database object creation failed, mode = [3].0-1801342965IDS_ERROR_22011033Database: [2]. Initialization failed, out of memory.0-1801342965IDS_ERROR_22021033Database: [2]. Data access failed, out of memory.0-1801342965IDS_ERROR_22031033Database: [2]. Cannot open database file. System error [3].0-1801342965IDS_ERROR_22041033Database: [2]. Table already exists: [3].0-1801342965IDS_ERROR_22051033Database: [2]. Table does not exist: [3].0-1801342965IDS_ERROR_22061033Database: [2]. Table could not be dropped: [3].0-1801342965IDS_ERROR_22071033Database: [2]. Intent violation.0-1801342965IDS_ERROR_22081033Database: [2]. Insufficient parameters for Execute.0-1801342965IDS_ERROR_22091033Database: [2]. Cursor in invalid state.0-1801342965IDS_ERROR_22101033Database: [2]. Invalid update data type in column [3].0-1801342965IDS_ERROR_22111033Database: [2]. Could not create database table [3].0-1801342965IDS_ERROR_22121033Database: [2]. Database not in writable state.0-1801342965IDS_ERROR_22131033Database: [2]. Error saving database tables.0-1801342965IDS_ERROR_22141033Database: [2]. Error writing export file: [3].0-1801342965IDS_ERROR_22151033Database: [2]. Cannot open import file: [3].0-1801342965IDS_ERROR_22161033Database: [2]. Import file format error: [3], Line [4].0-1801342965IDS_ERROR_22171033Database: [2]. Wrong state to CreateOutputDatabase [3].0-1801342965IDS_ERROR_22181033Database: [2]. Table name not supplied.0-1801342965IDS_ERROR_22191033Database: [2]. Invalid Installer database format.0-1801342965IDS_ERROR_22201033Database: [2]. Invalid row/field data.0-1801342965IDS_ERROR_22211033Database: [2]. Code page conflict in import file: [3].0-1801342965IDS_ERROR_22221033Database: [2]. Transform or merge code page [3] differs from database code page [4].0-1801342965IDS_ERROR_22231033Database: [2]. Databases are the same. No transform generated.0-1801342965IDS_ERROR_22241033Database: [2]. GenerateTransform: Database corrupt. Table: [3].0-1801342965IDS_ERROR_22251033Database: [2]. Transform: Cannot transform a temporary table. Table: [3].0-1801342965IDS_ERROR_22261033Database: [2]. Transform failed.0-1801342965IDS_ERROR_22271033Database: [2]. Invalid identifier '[3]' in SQL query: [4].0-1801342965IDS_ERROR_22281033Database: [2]. Unknown table '[3]' in SQL query: [4].0-1801342965IDS_ERROR_22291033Database: [2]. Could not load table '[3]' in SQL query: [4].0-1801342965IDS_ERROR_22301033Database: [2]. Repeated table '[3]' in SQL query: [4].0-1801342965IDS_ERROR_22311033Database: [2]. Missing ')' in SQL query: [3].0-1801342965IDS_ERROR_22321033Database: [2]. Unexpected token '[3]' in SQL query: [4].0-1801342965IDS_ERROR_22331033Database: [2]. No columns in SELECT clause in SQL query: [3].0-1801342965IDS_ERROR_22341033Database: [2]. No columns in ORDER BY clause in SQL query: [3].0-1801342965IDS_ERROR_22351033Database: [2]. Column '[3]' not present or ambiguous in SQL query: [4].0-1801342965IDS_ERROR_22361033Database: [2]. Invalid operator '[3]' in SQL query: [4].0-1801342965IDS_ERROR_22371033Database: [2]. Invalid or missing query string: [3].0-1801342965IDS_ERROR_22381033Database: [2]. Missing FROM clause in SQL query: [3].0-1801342965IDS_ERROR_22391033Database: [2]. Insufficient values in INSERT SQL statement.0-1801342965IDS_ERROR_22401033Database: [2]. Missing update columns in UPDATE SQL statement.0-1801342965IDS_ERROR_22411033Database: [2]. Missing insert columns in INSERT SQL statement.0-1801342965IDS_ERROR_22421033Database: [2]. Column '[3]' repeated.0-1801342965IDS_ERROR_22431033Database: [2]. No primary columns defined for table creation.0-1801342965IDS_ERROR_22441033Database: [2]. Invalid type specifier '[3]' in SQL query [4].0-1801342965IDS_ERROR_22451033IStorage::Stat failed with error [3].0-1801342965IDS_ERROR_22461033Database: [2]. Invalid Installer transform format.0-1801342965IDS_ERROR_22471033Database: [2] Transform stream read/write failure.0-1801342965IDS_ERROR_22481033Database: [2] GenerateTransform/Merge: Column type in base table does not match reference table. Table: [3] Col #: [4].0-1801342965IDS_ERROR_22491033Database: [2] GenerateTransform: More columns in base table than in reference table. Table: [3].0-1801342965IDS_ERROR_22501033Database: [2] Transform: Cannot add existing row. Table: [3].0-1801342965IDS_ERROR_22511033Database: [2] Transform: Cannot delete row that does not exist. Table: [3].0-1801342965IDS_ERROR_22521033Database: [2] Transform: Cannot add existing table. Table: [3].0-1801342965IDS_ERROR_22531033Database: [2] Transform: Cannot delete table that does not exist. Table: [3].0-1801342965IDS_ERROR_22541033Database: [2] Transform: Cannot update row that does not exist. Table: [3].0-1801342965IDS_ERROR_22551033Database: [2] Transform: Column with this name already exists. Table: [3] Col: [4].0-1801342965IDS_ERROR_22561033Database: [2] GenerateTransform/Merge: Number of primary keys in base table does not match reference table. Table: [3].0-1801342965IDS_ERROR_22571033Database: [2]. Intent to modify read only table: [3].0-1801342965IDS_ERROR_22581033Database: [2]. Type mismatch in parameter: [3].0-1801342965IDS_ERROR_22591033Database: [2] Table(s) Update failed0-1801342965IDS_ERROR_22601033Storage CopyTo failed. System error: [3].0-1801342965IDS_ERROR_22611033Could not remove stream [2]. System error: [3].0-1801342965IDS_ERROR_22621033Stream does not exist: [2]. System error: [3].0-1801342965IDS_ERROR_22631033Could not open stream [2]. System error: [3].0-1801342965IDS_ERROR_22641033Could not remove stream [2]. System error: [3].0-1801342965IDS_ERROR_22651033Could not commit storage. System error: [3].0-1801342965IDS_ERROR_22661033Could not rollback storage. System error: [3].0-1801342965IDS_ERROR_22671033Could not delete storage [2]. System error: [3].0-1801342965IDS_ERROR_22681033Database: [2]. Merge: There were merge conflicts reported in [3] tables.0-1801342965IDS_ERROR_22691033Database: [2]. Merge: The column count differed in the '[3]' table of the two databases.0-1801342965IDS_ERROR_22701033Database: [2]. GenerateTransform/Merge: Column name in base table does not match reference table. Table: [3] Col #: [4].0-1801342965IDS_ERROR_22711033SummaryInformation write for transform failed.0-1801342965IDS_ERROR_22721033Database: [2]. MergeDatabase will not write any changes because the database is open read-only.0-1801342965IDS_ERROR_22731033Database: [2]. MergeDatabase: A reference to the base database was passed as the reference database.0-1801342965IDS_ERROR_22741033Database: [2]. MergeDatabase: Unable to write errors to Error table. Could be due to a non-nullable column in a predefined Error table.0-1801342965IDS_ERROR_22751033Database: [2]. Specified Modify [3] operation invalid for table joins.0-1801342965IDS_ERROR_22761033Database: [2]. Code page [3] not supported by the system.0-1801342965IDS_ERROR_22771033Database: [2]. Failed to save table [3].0-1801342965IDS_ERROR_22781033Database: [2]. Exceeded number of expressions limit of 32 in WHERE clause of SQL query: [3].0-1801342965IDS_ERROR_22791033Database: [2] Transform: Too many columns in base table [3].0-1801342965IDS_ERROR_22801033Database: [2]. Could not create column [3] for table [4].0-1801342965IDS_ERROR_22811033Could not rename stream [2]. System error: [3].0-1801342965IDS_ERROR_22821033Stream name invalid [2].0-1801342965IDS_ERROR_231033Cannot create the file [3]. A directory with this name already exists. Cancel the installation and try installing to a different location.0-1801342965IDS_ERROR_23021033Patch notify: [2] bytes patched to far.0-1801342965IDS_ERROR_23031033Error getting volume info. GetLastError: [2].0-1801342965IDS_ERROR_23041033Error getting disk free space. GetLastError: [2]. Volume: [3].0-1801342965IDS_ERROR_23051033Error waiting for patch thread. GetLastError: [2].0-1801342965IDS_ERROR_23061033Could not create thread for patch application. GetLastError: [2].0-1801342965IDS_ERROR_23071033Source file key name is null.0-1801342965IDS_ERROR_23081033Destination file name is null.0-1801342965IDS_ERROR_23091033Attempting to patch file [2] when patch already in progress.0-1801342965IDS_ERROR_23101033Attempting to continue patch when no patch is in progress.0-1801342965IDS_ERROR_23151033Missing path separator: [2].0-1801342965IDS_ERROR_23181033File does not exist: [2].0-1801342965IDS_ERROR_23191033Error setting file attribute: [3] GetLastError: [2].0-1801342965IDS_ERROR_23201033File not writable: [2].0-1801342965IDS_ERROR_23211033Error creating file: [2].0-1801342965IDS_ERROR_23221033User canceled.0-1801342965IDS_ERROR_23231033Invalid file attribute.0-1801342965IDS_ERROR_23241033Could not open file: [3] GetLastError: [2].0-1801342965IDS_ERROR_23251033Could not get file time for file: [3] GetLastError: [2].0-1801342965IDS_ERROR_23261033Error in FileToDosDateTime.0-1801342965IDS_ERROR_23271033Could not remove directory: [3] GetLastError: [2].0-1801342965IDS_ERROR_23281033Error getting file version info for file: [2].0-1801342965IDS_ERROR_23291033Error deleting file: [3]. GetLastError: [2].0-1801342965IDS_ERROR_23301033Error getting file attributes: [3]. GetLastError: [2].0-1801342965IDS_ERROR_23311033Error loading library [2] or finding entry point [3].0-1801342965IDS_ERROR_23321033Error getting file attributes. GetLastError: [2].0-1801342965IDS_ERROR_23331033Error setting file attributes. GetLastError: [2].0-1801342965IDS_ERROR_23341033Error converting file time to local time for file: [3]. GetLastError: [2].0-1801342965IDS_ERROR_23351033Path: [2] is not a parent of [3].0-1801342965IDS_ERROR_23361033Error creating temp file on path: [3]. GetLastError: [2].0-1801342965IDS_ERROR_23371033Could not close file: [3] GetLastError: [2].0-1801342965IDS_ERROR_23381033Could not update resource for file: [3] GetLastError: [2].0-1801342965IDS_ERROR_23391033Could not set file time for file: [3] GetLastError: [2].0-1801342965IDS_ERROR_23401033Could not update resource for file: [3], Missing resource.0-1801342965IDS_ERROR_23411033Could not update resource for file: [3], Resource too large.0-1801342965IDS_ERROR_23421033Could not update resource for file: [3] GetLastError: [2].0-1801342965IDS_ERROR_23431033Specified path is empty.0-1801342965IDS_ERROR_23441033Could not find required file IMAGEHLP.DLL to validate file:[2].0-1801342965IDS_ERROR_23451033[2]: File does not contain a valid checksum value.0-1801342965IDS_ERROR_23471033User ignore.0-1801342965IDS_ERROR_23481033Error attempting to read from cabinet stream.0-1801342965IDS_ERROR_23491033Copy resumed with different info.0-1801342965IDS_ERROR_23501033FDI server error0-1801342965IDS_ERROR_23511033File key '[2]' not found in cabinet '[3]'. The installation cannot continue.0-1801342965IDS_ERROR_23521033Could not initialize cabinet file server. The required file 'CABINET.DLL' may be missing.0-1801342965IDS_ERROR_23531033Not a cabinet.0-1801342965IDS_ERROR_23541033Cannot handle cabinet.0-1801342965IDS_ERROR_23551033Corrupt cabinet.0-1801342965IDS_ERROR_23561033Could not locate cabinet in stream: [2].0-1801342965IDS_ERROR_23571033Cannot set attributes.0-1801342965IDS_ERROR_23581033Error determining whether file is in-use: [3]. GetLastError: [2].0-1801342965IDS_ERROR_23591033Unable to create the target file - file may be in use.0-1801342965IDS_ERROR_23601033Progress tick.0-1801342965IDS_ERROR_23611033Need next cabinet.0-1801342965IDS_ERROR_23621033Folder not found: [2].0-1801342965IDS_ERROR_23631033Could not enumerate subfolders for folder: [2].0-1801342965IDS_ERROR_23641033Bad enumeration constant in CreateCopier call.0-1801342965IDS_ERROR_23651033Could not BindImage exe file [2].0-1801342965IDS_ERROR_23661033User failure.0-1801342965IDS_ERROR_23671033User abort.0-1801342965IDS_ERROR_23681033Failed to get network resource information. Error [2], network path [3]. Extended error: network provider [5], error code [4], error description [6].0-1801342965IDS_ERROR_23701033Invalid CRC checksum value for [2] file.{ Its header says [3] for checksum, its computed value is [4].}0-1801342965IDS_ERROR_23711033Could not apply patch to file [2]. GetLastError: [3].0-1801342965IDS_ERROR_23721033Patch file [2] is corrupt or of an invalid format. Attempting to patch file [3]. GetLastError: [4].0-1801342965IDS_ERROR_23731033File [2] is not a valid patch file.0-1801342965IDS_ERROR_23741033File [2] is not a valid destination file for patch file [3].0-1801342965IDS_ERROR_23751033Unknown patching error: [2].0-1801342965IDS_ERROR_23761033Cabinet not found.0-1801342965IDS_ERROR_23791033Error opening file for read: [3] GetLastError: [2].0-1801342965IDS_ERROR_23801033Error opening file for write: [3]. GetLastError: [2].0-1801342965IDS_ERROR_23811033Directory does not exist: [2].0-1801342965IDS_ERROR_23821033Drive not ready: [2].0-1801342965IDS_ERROR_241033Please insert the disk: [2]0-1801342965IDS_ERROR_2401103364-bit registry operation attempted on 32-bit operating system for key [2].0-1801342965IDS_ERROR_24021033Out of memory.0-1801342965IDS_ERROR_251033The installer has insufficient privileges to access this directory: [2]. The installation cannot continue. Log on as an administrator or contact your system administrator.0-1801342965IDS_ERROR_25011033Could not create rollback script enumerator.0-1801342965IDS_ERROR_25021033Called InstallFinalize when no install in progress.0-1801342965IDS_ERROR_25031033Called RunScript when not marked in progress.0-1801342965IDS_ERROR_261033Error writing to file [2]. Verify that you have access to that directory.0-1801342965IDS_ERROR_26011033Invalid value for property [2]: '[3]'0-1801342965IDS_ERROR_26021033The [2] table entry '[3]' has no associated entry in the Media table.0-1801342965IDS_ERROR_26031033Duplicate table name [2].0-1801342965IDS_ERROR_26041033[2] Property undefined.0-1801342965IDS_ERROR_26051033Could not find server [2] in [3] or [4].0-1801342965IDS_ERROR_26061033Value of property [2] is not a valid full path: '[3]'.0-1801342965IDS_ERROR_26071033Media table not found or empty (required for installation of files).0-1801342965IDS_ERROR_26081033Could not create security descriptor for object. Error: '[2]'.0-1801342965IDS_ERROR_26091033Attempt to migrate product settings before initialization.0-1801342965IDS_ERROR_26111033The file [2] is marked as compressed, but the associated media entry does not specify a cabinet.0-1801342965IDS_ERROR_26121033Stream not found in '[2]' column. Primary key: '[3]'.0-1801342965IDS_ERROR_26131033RemoveExistingProducts action sequenced incorrectly.0-1801342965IDS_ERROR_26141033Could not access IStorage object from installation package.0-1801342965IDS_ERROR_26151033Skipped unregistration of Module [2] due to source resolution failure.0-1801342965IDS_ERROR_26161033Companion file [2] parent missing.0-1801342965IDS_ERROR_26171033Shared component [2] not found in Component table.0-1801342965IDS_ERROR_26181033Isolated application component [2] not found in Component table.0-1801342965IDS_ERROR_26191033Isolated components [2], [3] not part of same feature.0-1801342965IDS_ERROR_26201033Key file of isolated application component [2] not in File table.0-1801342965IDS_ERROR_26211033Resource DLL or Resource ID information for shortcut [2] set incorrectly.0-1801342965IDS_ERROR_271033Error reading from file [2]. Verify that the file exists and that you can access it.0-1801342965IDS_ERROR_27011033The depth of a feature exceeds the acceptable tree depth of [2] levels.0-1801342965IDS_ERROR_27021033A Feature table record ([2]) references a non-existent parent in the Attributes field.0-1801342965IDS_ERROR_27031033Property name for root source path not defined: [2]0-1801342965IDS_ERROR_27041033Root directory property undefined: [2]0-1801342965IDS_ERROR_27051033Invalid table: [2]; Could not be linked as tree.0-1801342965IDS_ERROR_27061033Source paths not created. No path exists for entry [2] in Directory table.0-1801342965IDS_ERROR_27071033Target paths not created. No path exists for entry [2] in Directory table.0-1801342965IDS_ERROR_27081033No entries found in the file table.0-1801342965IDS_ERROR_27091033The specified Component name ('[2]') not found in Component table.0-1801342965IDS_ERROR_27101033The requested 'Select' state is illegal for this Component.0-1801342965IDS_ERROR_27111033The specified Feature name ('[2]') not found in Feature table.0-1801342965IDS_ERROR_27121033Invalid return from modeless dialog: [3], in action [2].0-1801342965IDS_ERROR_27131033Null value in a non-nullable column ('[2]' in '[3]' column of the '[4]' table.0-1801342965IDS_ERROR_27141033Invalid value for default folder name: [2].0-1801342965IDS_ERROR_27151033The specified File key ('[2]') not found in the File table.0-1801342965IDS_ERROR_27161033Could not create a random subcomponent name for component '[2]'.0-1801342965IDS_ERROR_27171033Bad action condition or error calling custom action '[2]'.0-1801342965IDS_ERROR_27181033Missing package name for product code '[2]'.0-1801342965IDS_ERROR_27191033Neither UNC nor drive letter path found in source '[2]'.0-1801342965IDS_ERROR_27201033Error opening source list key. Error: '[2]'0-1801342965IDS_ERROR_27211033Custom action [2] not found in Binary table stream.0-1801342965IDS_ERROR_27221033Custom action [2] not found in File table.0-1801342965IDS_ERROR_27231033Custom action [2] specifies unsupported type.0-1801342965IDS_ERROR_27241033The volume label '[2]' on the media you're running from does not match the label '[3]' given in the Media table. This is allowed only if you have only 1 entry in your Media table.0-1801342965IDS_ERROR_27251033Invalid database tables0-1801342965IDS_ERROR_27261033Action not found: [2].0-1801342965IDS_ERROR_27271033The directory entry '[2]' does not exist in the Directory table.0-1801342965IDS_ERROR_27281033Table definition error: [2]0-1801342965IDS_ERROR_27291033Install engine not initialized.0-1801342965IDS_ERROR_27301033Bad value in database. Table: '[2]'; Primary key: '[3]'; Column: '[4]'0-1801342965IDS_ERROR_27311033Selection Manager not initialized.0-1801342965IDS_ERROR_27321033Directory Manager not initialized.0-1801342965IDS_ERROR_27331033Bad foreign key ('[2]') in '[3]' column of the '[4]' table.0-1801342965IDS_ERROR_27341033Invalid reinstall mode character.0-1801342965IDS_ERROR_27351033Custom action '[2]' has caused an unhandled exception and has been stopped. This may be the result of an internal error in the custom action, such as an access violation.0-1801342965IDS_ERROR_27361033Generation of custom action temp file failed: [2].0-1801342965IDS_ERROR_27371033Could not access custom action [2], entry [3], library [4]0-1801342965IDS_ERROR_27381033Could not access VBScript run time for custom action [2].0-1801342965IDS_ERROR_27391033Could not access JavaScript run time for custom action [2].0-1801342965IDS_ERROR_27401033Custom action [2] script error [3], [4]: [5] Line [6], Column [7], [8].0-1801342965IDS_ERROR_27411033Configuration information for product [2] is corrupt. Invalid info: [2].0-1801342965IDS_ERROR_27421033Marshaling to Server failed: [2].0-1801342965IDS_ERROR_27431033Could not execute custom action [2], location: [3], command: [4].0-1801342965IDS_ERROR_27441033EXE failed called by custom action [2], location: [3], command: [4].0-1801342965IDS_ERROR_27451033Transform [2] invalid for package [3]. Expected language [4], found language [5].0-1801342965IDS_ERROR_27461033Transform [2] invalid for package [3]. Expected product [4], found product [5].0-1801342965IDS_ERROR_27471033Transform [2] invalid for package [3]. Expected product version < [4], found product version [5].0-1801342965IDS_ERROR_27481033Transform [2] invalid for package [3]. Expected product version <= [4], found product version [5].0-1801342965IDS_ERROR_27491033Transform [2] invalid for package [3]. Expected product version == [4], found product version [5].0-1801342965IDS_ERROR_27501033Transform [2] invalid for package [3]. Expected product version >= [4], found product version [5].0-1801342965IDS_ERROR_275021033Could not connect to [2] '[3]'. [4]0-1801342965IDS_ERROR_275031033Error retrieving version string from [2] '[3]'. [4]0-1801342965IDS_ERROR_275041033SQL version requirements not met: [3]. This installation requires [2] [4] or later.0-1801342965IDS_ERROR_275051033Could not open SQL script file [2].0-1801342965IDS_ERROR_275061033Error executing SQL script [2]. Line [3]. [4]0-1801342965IDS_ERROR_275071033Connection or browsing for database servers requires that MDAC be installed.0-1801342965IDS_ERROR_275081033Error installing COM+ application [2]. [3]0-1801342965IDS_ERROR_275091033Error uninstalling COM+ application [2]. [3]0-1801342965IDS_ERROR_27511033Transform [2] invalid for package [3]. Expected product version > [4], found product version [5].0-1801342965IDS_ERROR_275101033Error installing COM+ application [2]. Could not load Microsoft(R) .NET class libraries. Registering .NET serviced components requires that Microsoft(R) .NET Framework be installed.0-1801342965IDS_ERROR_275111033Could not execute SQL script file [2]. Connection not open: [3]0-1801342965IDS_ERROR_275121033Error beginning transactions for [2] '[3]'. Database [4]. [5]0-1801342965IDS_ERROR_275131033Error committing transactions for [2] '[3]'. Database [4]. [5]0-1801342965IDS_ERROR_275141033This installation requires a Microsoft SQL Server. The specified server '[3]' is a Microsoft SQL Server Desktop Engine or SQL Server Express.0-1801342965IDS_ERROR_275151033Error retrieving schema version from [2] '[3]'. Database: '[4]'. [5]0-1801342965IDS_ERROR_275161033Error writing schema version to [2] '[3]'. Database: '[4]'. [5]0-1801342965IDS_ERROR_275171033This installation requires Administrator privileges for installing COM+ applications. Log on as an administrator and then retry this installation.0-1801342965IDS_ERROR_275181033The COM+ application "[2]" is configured to run as an NT service; this requires COM+ 1.5 or later on the system. Since your system has COM+ 1.0, this application will not be installed.0-1801342965IDS_ERROR_275191033Error updating XML file [2]. [3]0-1801342965IDS_ERROR_27521033Could not open transform [2] stored as child storage of package [4].0-1801342965IDS_ERROR_275201033Error opening XML file [2]. [3]0-1801342965IDS_ERROR_275211033This setup requires MSXML 3.0 or higher for configuring XML files. Please make sure that you have version 3.0 or higher.0-1801342965IDS_ERROR_275221033Error creating XML file [2]. [3]0-1801342965IDS_ERROR_275231033Error loading servers.0-1801342965IDS_ERROR_275241033Error loading NetApi32.DLL. The ISNetApi.dll needs to have NetApi32.DLL properly loaded and requires an NT based operating system.0-1801342965IDS_ERROR_275251033Server not found. Verify that the specified server exists. The server name can not be empty.0-1801342965IDS_ERROR_275261033Unspecified error from ISNetApi.dll.0-1801342965IDS_ERROR_275271033The buffer is too small.0-1801342965IDS_ERROR_275281033Access denied. Check administrative rights.0-1801342965IDS_ERROR_275291033Invalid computer.0-1801342965IDS_ERROR_27531033The File '[2]' is not marked for installation.0-1801342965IDS_ERROR_275301033Unknown error returned from NetAPI. System error: [2]0-1801342965IDS_ERROR_275311033Unhandled exception.0-1801342965IDS_ERROR_275321033Invalid user name for this server or domain.0-1801342965IDS_ERROR_275331033The case-sensitive passwords do not match.0-1801342965IDS_ERROR_275341033The list is empty.0-1801342965IDS_ERROR_275351033Access violation.0-1801342965IDS_ERROR_275361033Error getting group.0-1801342965IDS_ERROR_275371033Error adding user to group. Verify that the group exists for this domain or server.0-1801342965IDS_ERROR_275381033Error creating user.0-1801342965IDS_ERROR_275391033ERROR_NETAPI_ERROR_NOT_PRIMARY returned from NetAPI.0-1801342965IDS_ERROR_27541033The File '[2]' is not a valid patch file.0-1801342965IDS_ERROR_275401033The specified user already exists.0-1801342965IDS_ERROR_275411033The specified group already exists.0-1801342965IDS_ERROR_275421033Invalid password. Verify that the password is in accordance with your network password policy.0-1801342965IDS_ERROR_275431033Invalid name.0-1801342965IDS_ERROR_275441033Invalid group.0-1801342965IDS_ERROR_275451033The user name can not be empty and must be in the format DOMAIN\Username.0-1801342965IDS_ERROR_275461033Error loading or creating INI file in the user TEMP directory.0-1801342965IDS_ERROR_275471033ISNetAPI.dll is not loaded or there was an error loading the dll. This dll needs to be loaded for this operation. Verify that the dll is in the SUPPORTDIR directory.0-1801342965IDS_ERROR_275481033Error deleting INI file containing new user information from the user's TEMP directory.0-1801342965IDS_ERROR_275491033Error getting the primary domain controller (PDC).0-1801342965IDS_ERROR_27551033Server returned unexpected error [2] attempting to install package [3].0-1801342965IDS_ERROR_275501033Every field must have a value in order to create a user.0-1801342965IDS_ERROR_275511033ODBC driver for [2] not found. This is required to connect to [2] database servers.0-1801342965IDS_ERROR_275521033Error creating database [4]. Server: [2] [3]. [5]0-1801342965IDS_ERROR_275531033Error connecting to database [4]. Server: [2] [3]. [5]0-1801342965IDS_ERROR_275541033Error attempting to open connection [2]. No valid database metadata associated with this connection.0-1801342965IDS_ERROR_275551033Error attempting to apply permissions to object '[2]'. System error: [3] ([4])0-1801342965IDS_ERROR_27561033The property '[2]' was used as a directory property in one or more tables, but no value was ever assigned.0-1801342965IDS_ERROR_27571033Could not create summary info for transform [2].0-1801342965IDS_ERROR_27581033Transform [2] does not contain an MSI version.0-1801342965IDS_ERROR_27591033Transform [2] version [3] incompatible with engine; Min: [4], Max: [5].0-1801342965IDS_ERROR_27601033Transform [2] invalid for package [3]. Expected upgrade code [4], found [5].0-1801342965IDS_ERROR_27611033Cannot begin transaction. Global mutex not properly initialized.0-1801342965IDS_ERROR_27621033Cannot write script record. Transaction not started.0-1801342965IDS_ERROR_27631033Cannot run script. Transaction not started.0-1801342965IDS_ERROR_27651033Assembly name missing from AssemblyName table : Component: [4].0-1801342965IDS_ERROR_27661033The file [2] is an invalid MSI storage file.0-1801342965IDS_ERROR_27671033No more data{ while enumerating [2]}.0-1801342965IDS_ERROR_27681033Transform in patch package is invalid.0-1801342965IDS_ERROR_27691033Custom Action [2] did not close [3] MSIHANDLEs.0-1801342965IDS_ERROR_27701033Cached folder [2] not defined in internal cache folder table.0-1801342965IDS_ERROR_27711033Upgrade of feature [2] has a missing component.0-1801342965IDS_ERROR_27721033New upgrade feature [2] must be a leaf feature.0-1801342965IDS_ERROR_281033Another application has exclusive access to the file [2]. Please shut down all other applications, then click Retry.0-1801342965IDS_ERROR_28011033Unknown Message -- Type [2]. No action is taken.0-1801342965IDS_ERROR_28021033No publisher is found for the event [2].0-1801342965IDS_ERROR_28031033Dialog View did not find a record for the dialog [2].0-1801342965IDS_ERROR_28041033On activation of the control [3] on dialog [2] CMsiDialog failed to evaluate the condition [3].0-1801342965IDS_ERROR_28061033The dialog [2] failed to evaluate the condition [3].0-1801342965IDS_ERROR_28071033The action [2] is not recognized.0-1801342965IDS_ERROR_28081033Default button is ill-defined on dialog [2].0-1801342965IDS_ERROR_28091033On the dialog [2] the next control pointers do not form a cycle. There is a pointer from [3] to [4], but there is no further pointer.0-1801342965IDS_ERROR_28101033On the dialog [2] the next control pointers do not form a cycle. There is a pointer from both [3] and [5] to [4].0-1801342965IDS_ERROR_28111033On dialog [2] control [3] has to take focus, but it is unable to do so.0-1801342965IDS_ERROR_28121033The event [2] is not recognized.0-1801342965IDS_ERROR_28131033The EndDialog event was called with the argument [2], but the dialog has a parent.0-1801342965IDS_ERROR_28141033On the dialog [2] the control [3] names a nonexistent control [4] as the next control.0-1801342965IDS_ERROR_28151033ControlCondition table has a row without condition for the dialog [2].0-1801342965IDS_ERROR_28161033The EventMapping table refers to an invalid control [4] on dialog [2] for the event [3].0-1801342965IDS_ERROR_28171033The event [2] failed to set the attribute for the control [4] on dialog [3].0-1801342965IDS_ERROR_28181033In the ControlEvent table EndDialog has an unrecognized argument [2].0-1801342965IDS_ERROR_28191033Control [3] on dialog [2] needs a property linked to it.0-1801342965IDS_ERROR_28201033Attempted to initialize an already initialized handler.0-1801342965IDS_ERROR_28211033Attempted to initialize an already initialized dialog: [2].0-1801342965IDS_ERROR_28221033No other method can be called on dialog [2] until all the controls are added.0-1801342965IDS_ERROR_28231033Attempted to initialize an already initialized control: [3] on dialog [2].0-1801342965IDS_ERROR_28241033The dialog attribute [3] needs a record of at least [2] field(s).0-1801342965IDS_ERROR_28251033The control attribute [3] needs a record of at least [2] field(s).0-1801342965IDS_ERROR_28261033Control [3] on dialog [2] extends beyond the boundaries of the dialog [4] by [5] pixels.0-1801342965IDS_ERROR_28271033The button [4] on the radio button group [3] on dialog [2] extends beyond the boundaries of the group [5] by [6] pixels.0-1801342965IDS_ERROR_28281033Tried to remove control [3] from dialog [2], but the control is not part of the dialog.0-1801342965IDS_ERROR_28291033Attempt to use an uninitialized dialog.0-1801342965IDS_ERROR_28301033Attempt to use an uninitialized control on dialog [2].0-1801342965IDS_ERROR_28311033The control [3] on dialog [2] does not support [5] the attribute [4].0-1801342965IDS_ERROR_28321033The dialog [2] does not support the attribute [3].0-1801342965IDS_ERROR_28331033Control [4] on dialog [3] ignored the message [2].0-1801342965IDS_ERROR_28341033The next pointers on the dialog [2] do not form a single loop.0-1801342965IDS_ERROR_28351033The control [2] was not found on dialog [3].0-1801342965IDS_ERROR_28361033The control [3] on the dialog [2] cannot take focus.0-1801342965IDS_ERROR_28371033The control [3] on dialog [2] wants the winproc to return [4].0-1801342965IDS_ERROR_28381033The item [2] in the selection table has itself as a parent.0-1801342965IDS_ERROR_28391033Setting the property [2] failed.0-1801342965IDS_ERROR_28401033Error dialog name mismatch.0-1801342965IDS_ERROR_28411033No OK button was found on the error dialog.0-1801342965IDS_ERROR_28421033No text field was found on the error dialog.0-1801342965IDS_ERROR_28431033The ErrorString attribute is not supported for standard dialogs.0-1801342965IDS_ERROR_28441033Cannot execute an error dialog if the Errorstring is not set.0-1801342965IDS_ERROR_28451033The total width of the buttons exceeds the size of the error dialog.0-1801342965IDS_ERROR_28461033SetFocus did not find the required control on the error dialog.0-1801342965IDS_ERROR_28471033The control [3] on dialog [2] has both the icon and the bitmap style set.0-1801342965IDS_ERROR_28481033Tried to set control [3] as the default button on dialog [2], but the control does not exist.0-1801342965IDS_ERROR_28491033The control [3] on dialog [2] is of a type, that cannot be integer valued.0-1801342965IDS_ERROR_28501033Unrecognized volume type.0-1801342965IDS_ERROR_28511033The data for the icon [2] is not valid.0-1801342965IDS_ERROR_28521033At least one control has to be added to dialog [2] before it is used.0-1801342965IDS_ERROR_28531033Dialog [2] is a modeless dialog. The execute method should not be called on it.0-1801342965IDS_ERROR_28541033On the dialog [2] the control [3] is designated as first active control, but there is no such control.0-1801342965IDS_ERROR_28551033The radio button group [3] on dialog [2] has fewer than 2 buttons.0-1801342965IDS_ERROR_28561033Creating a second copy of the dialog [2].0-1801342965IDS_ERROR_28571033The directory [2] is mentioned in the selection table but not found.0-1801342965IDS_ERROR_28581033The data for the bitmap [2] is not valid.0-1801342965IDS_ERROR_28591033Test error message.0-1801342965IDS_ERROR_28601033Cancel button is ill-defined on dialog [2].0-1801342965IDS_ERROR_28611033The next pointers for the radio buttons on dialog [2] control [3] do not form a cycle.0-1801342965IDS_ERROR_28621033The attributes for the control [3] on dialog [2] do not define a valid icon size. Setting the size to 16.0-1801342965IDS_ERROR_28631033The control [3] on dialog [2] needs the icon [4] in size [5]x[5], but that size is not available. Loading the first available size.0-1801342965IDS_ERROR_28641033The control [3] on dialog [2] received a browse event, but there is no configurable directory for the present selection. Likely cause: browse button is not authored correctly.0-1801342965IDS_ERROR_28651033Control [3] on billboard [2] extends beyond the boundaries of the billboard [4] by [5] pixels.0-1801342965IDS_ERROR_28661033The dialog [2] is not allowed to return the argument [3].0-1801342965IDS_ERROR_28671033The error dialog property is not set.0-1801342965IDS_ERROR_28681033The error dialog [2] does not have the error style bit set.0-1801342965IDS_ERROR_28691033The dialog [2] has the error style bit set, but is not an error dialog.0-1801342965IDS_ERROR_28701033The help string [4] for control [3] on dialog [2] does not contain the separator character.0-1801342965IDS_ERROR_28711033The [2] table is out of date: [3].0-1801342965IDS_ERROR_28721033The argument of the CheckPath control event on dialog [2] is invalid.0-1801342965IDS_ERROR_28731033On the dialog [2] the control [3] has an invalid string length limit: [4].0-1801342965IDS_ERROR_28741033Changing the text font to [2] failed.0-1801342965IDS_ERROR_28751033Changing the text color to [2] failed.0-1801342965IDS_ERROR_28761033The control [3] on dialog [2] had to truncate the string: [4].0-1801342965IDS_ERROR_28771033The binary data [2] was not found0-1801342965IDS_ERROR_28781033On the dialog [2] the control [3] has a possible value: [4]. This is an invalid or duplicate value.0-1801342965IDS_ERROR_28791033The control [3] on dialog [2] cannot parse the mask string: [4].0-1801342965IDS_ERROR_28801033Do not perform the remaining control events.0-1801342965IDS_ERROR_28811033CMsiHandler initialization failed.0-1801342965IDS_ERROR_28821033Dialog window class registration failed.0-1801342965IDS_ERROR_28831033CreateNewDialog failed for the dialog [2].0-1801342965IDS_ERROR_28841033Failed to create a window for the dialog [2].0-1801342965IDS_ERROR_28851033Failed to create the control [3] on the dialog [2].0-1801342965IDS_ERROR_28861033Creating the [2] table failed.0-1801342965IDS_ERROR_28871033Creating a cursor to the [2] table failed.0-1801342965IDS_ERROR_28881033Executing the [2] view failed.0-1801342965IDS_ERROR_28891033Creating the window for the control [3] on dialog [2] failed.0-1801342965IDS_ERROR_28901033The handler failed in creating an initialized dialog.0-1801342965IDS_ERROR_28911033Failed to destroy window for dialog [2].0-1801342965IDS_ERROR_28921033[2] is an integer only control, [3] is not a valid integer value.0-1801342965IDS_ERROR_28931033The control [3] on dialog [2] can accept property values that are at most [5] characters long. The value [4] exceeds this limit, and has been truncated.0-1801342965IDS_ERROR_28941033Loading RICHED20.DLL failed. GetLastError() returned: [2].0-1801342965IDS_ERROR_28951033Freeing RICHED20.DLL failed. GetLastError() returned: [2].0-1801342965IDS_ERROR_28961033Executing action [2] failed.0-1801342965IDS_ERROR_28971033Failed to create any [2] font on this system.0-1801342965IDS_ERROR_28981033For [2] textstyle, the system created a '[3]' font, in [4] character set.0-1801342965IDS_ERROR_28991033Failed to create [2] textstyle. GetLastError() returned: [3].0-1801342965IDS_ERROR_291033There is not enough disk space to install the file [2]. Free some disk space and click Retry, or click Cancel to exit.0-1801342965IDS_ERROR_29011033Invalid parameter to operation [2]: Parameter [3].0-1801342965IDS_ERROR_29021033Operation [2] called out of sequence.0-1801342965IDS_ERROR_29031033The file [2] is missing.0-1801342965IDS_ERROR_29041033Could not BindImage file [2].0-1801342965IDS_ERROR_29051033Could not read record from script file [2].0-1801342965IDS_ERROR_29061033Missing header in script file [2].0-1801342965IDS_ERROR_29071033Could not create secure security descriptor. Error: [2].0-1801342965IDS_ERROR_29081033Could not register component [2].0-1801342965IDS_ERROR_29091033Could not unregister component [2].0-1801342965IDS_ERROR_29101033Could not determine user's security ID.0-1801342965IDS_ERROR_29111033Could not remove the folder [2].0-1801342965IDS_ERROR_29121033Could not schedule file [2] for removal on restart.0-1801342965IDS_ERROR_29191033No cabinet specified for compressed file: [2].0-1801342965IDS_ERROR_29201033Source directory not specified for file [2].0-1801342965IDS_ERROR_29241033Script [2] version unsupported. Script version: [3], minimum version: [4], maximum version: [5].0-1801342965IDS_ERROR_29271033ShellFolder id [2] is invalid.0-1801342965IDS_ERROR_29281033Exceeded maximum number of sources. Skipping source '[2]'.0-1801342965IDS_ERROR_29291033Could not determine publishing root. Error: [2].0-1801342965IDS_ERROR_29321033Could not create file [2] from script data. Error: [3].0-1801342965IDS_ERROR_29331033Could not initialize rollback script [2].0-1801342965IDS_ERROR_29341033Could not secure transform [2]. Error [3].0-1801342965IDS_ERROR_29351033Could not unsecure transform [2]. Error [3].0-1801342965IDS_ERROR_29361033Could not find transform [2].0-1801342965IDS_ERROR_29371033Windows Installer cannot install a system file protection catalog. Catalog: [2], Error: [3].0-1801342965IDS_ERROR_29381033Windows Installer cannot retrieve a system file protection catalog from the cache. Catalog: [2], Error: [3].0-1801342965IDS_ERROR_29391033Windows Installer cannot delete a system file protection catalog from the cache. Catalog: [2], Error: [3].0-1801342965IDS_ERROR_29401033Directory Manager not supplied for source resolution.0-1801342965IDS_ERROR_29411033Unable to compute the CRC for file [2].0-1801342965IDS_ERROR_29421033BindImage action has not been executed on [2] file.0-1801342965IDS_ERROR_29431033This version of Windows does not support deploying 64-bit packages. The script [2] is for a 64-bit package.0-1801342965IDS_ERROR_29441033GetProductAssignmentType failed.0-1801342965IDS_ERROR_29451033Installation of ComPlus App [2] failed with error [3].0-1801342965IDS_ERROR_31033Info [1]. 0-1801342965IDS_ERROR_301033Source file not found: [2]. Verify that the file exists and that you can access it.0-1801342965IDS_ERROR_30011033The patches in this list contain incorrect sequencing information: [2][3][4][5][6][7][8][9][10][11][12][13][14][15][16].0-1801342965IDS_ERROR_30021033Patch [2] contains invalid sequencing information. 0-1801342965IDS_ERROR_311033Error reading from file: [3]. {{ System error [2].}} Verify that the file exists and that you can access it.0-1801342965IDS_ERROR_321033Error writing to file: [3]. {{ System error [2].}} Verify that you have access to that directory.0-1801342965IDS_ERROR_331033Source file not found{{(cabinet)}}: [2]. Verify that the file exists and that you can access it.0-1801342965IDS_ERROR_341033Cannot create the directory [2]. A file with this name already exists. Please rename or remove the file and click Retry, or click Cancel to exit.0-1801342965IDS_ERROR_351033The volume [2] is currently unavailable. Please select another.0-1801342965IDS_ERROR_361033The specified path [2] is unavailable.0-1801342965IDS_ERROR_371033Unable to write to the specified folder [2].0-1801342965IDS_ERROR_381033A network error occurred while attempting to read from the file [2]0-1801342965IDS_ERROR_391033An error occurred while attempting to create the directory [2]0-1801342965IDS_ERROR_41033Internal Error [1]. [2]{, [3]}{, [4]}0-1801342965IDS_ERROR_401033A network error occurred while attempting to create the directory [2]0-1801342965IDS_ERROR_411033A network error occurred while attempting to open the source file cabinet [2].0-1801342965IDS_ERROR_421033The specified path is too long [2].0-1801342965IDS_ERROR_431033The Installer has insufficient privileges to modify the file [2].0-1801342965IDS_ERROR_441033A portion of the path [2] exceeds the length allowed by the system.0-1801342965IDS_ERROR_451033The path [2] contains words that are not valid in folders.0-1801342965IDS_ERROR_461033The path [2] contains an invalid character.0-1801342965IDS_ERROR_471033[2] is not a valid short file name.0-1801342965IDS_ERROR_481033Error getting file security: [3] GetLastError: [2]0-1801342965IDS_ERROR_491033Invalid Drive: [2]0-1801342965IDS_ERROR_51033{{Disk full: }}0-1801342965IDS_ERROR_501033Could not create key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.0-1801342965IDS_ERROR_511033Could not open key: [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.0-1801342965IDS_ERROR_521033Could not delete value [2] from key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel.0-1801342965IDS_ERROR_531033Could not delete key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.0-1801342965IDS_ERROR_541033Could not read value [2] from key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel.0-1801342965IDS_ERROR_551033Could not write value [2] to key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel.0-1801342965IDS_ERROR_561033Could not get value names for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.0-1801342965IDS_ERROR_571033Could not get sub key names for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.0-1801342965IDS_ERROR_581033Could not read security information for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.0-1801342965IDS_ERROR_591033Could not increase the available registry space. [2] KB of free registry space is required for the installation of this application.0-1801342965IDS_ERROR_61033Action [Time]: [1]. [2]0-1801342965IDS_ERROR_601033Another installation is in progress. You must complete that installation before continuing this one.0-1801342965IDS_ERROR_611033Error accessing secured data. Please make sure the Windows Installer is configured properly and try the installation again.0-1801342965IDS_ERROR_621033User [2] has previously initiated an installation for product [3]. That user will need to run that installation again before using that product. Your current installation will now continue.0-1801342965IDS_ERROR_631033User [2] has previously initiated an installation for product [3]. That user will need to run that installation again before using that product.0-1801342965IDS_ERROR_641033Out of disk space -- Volume: '[2]'; required space: [3] KB; available space: [4] KB. Free some disk space and retry.0-1801342965IDS_ERROR_651033Are you sure you want to cancel?0-1801342965IDS_ERROR_661033The file [2][3] is being held in use{ by the following process: Name: [4], ID: [5], Window Title: [6]}. Close that application and retry.0-1801342965IDS_ERROR_671033The product [2] is already installed, preventing the installation of this product. The two products are incompatible.0-1801342965IDS_ERROR_681033Out of disk space -- Volume: [2]; required space: [3] KB; available space: [4] KB. If rollback is disabled, enough space is available. Click Cancel to quit, Retry to check available disk space again, or Ignore to continue without rollback.0-1801342965IDS_ERROR_691033Could not access network location [2].0-1801342965IDS_ERROR_71033[ProductName]0-1801342965IDS_ERROR_701033The following applications should be closed before continuing the installation:0-1801342965IDS_ERROR_711033Could not find any previously installed compliant products on the machine for installing this product.0-1801342965IDS_ERROR_721033The key [2] is not valid. Verify that you entered the correct key.0-1801342965IDS_ERROR_731033The installer must restart your system before configuration of [2] can continue. Click Yes to restart now or No if you plan to restart later.0-1801342965IDS_ERROR_741033You must restart your system for the configuration changes made to [2] to take effect. Click Yes to restart now or No if you plan to restart later.0-1801342965IDS_ERROR_751033An installation for [2] is currently suspended. You must undo the changes made by that installation to continue. Do you want to undo those changes?0-1801342965IDS_ERROR_761033A previous installation for this product is in progress. You must undo the changes made by that installation to continue. Do you want to undo those changes?0-1801342965IDS_ERROR_771033No valid source could be found for product [2]. The Windows Installer cannot continue.0-1801342965IDS_ERROR_781033Installation operation completed successfully.0-1801342965IDS_ERROR_791033Installation operation failed.0-1801342965IDS_ERROR_81033{[2]}{, [3]}{, [4]}0-1801342965IDS_ERROR_801033Product: [2] -- [3]0-1801342965IDS_ERROR_811033You may either restore your computer to its previous state or continue the installation later. Would you like to restore?0-1801342965IDS_ERROR_821033An error occurred while writing installation information to disk. Check to make sure enough disk space is available, and click Retry, or Cancel to end the installation.0-1801342965IDS_ERROR_831033One or more of the files required to restore your computer to its previous state could not be found. Restoration will not be possible.0-1801342965IDS_ERROR_841033The path [2] is not valid. Please specify a valid path.0-1801342965IDS_ERROR_851033Out of memory. Shut down other applications before retrying.0-1801342965IDS_ERROR_861033There is no disk in drive [2]. Please insert one and click Retry, or click Cancel to go back to the previously selected volume.0-1801342965IDS_ERROR_871033There is no disk in drive [2]. Please insert one and click Retry, or click Cancel to return to the browse dialog and select a different volume.0-1801342965IDS_ERROR_881033The folder [2] does not exist. Please enter a path to an existing folder.0-1801342965IDS_ERROR_891033You have insufficient privileges to read this folder.0-1801342965IDS_ERROR_91033Message type: [1], Argument: [2]0-1801342965IDS_ERROR_901033A valid destination folder for the installation could not be determined.0-1801342965IDS_ERROR_911033Error attempting to read from the source installation database: [2].0-1801342965IDS_ERROR_921033Scheduling reboot operation: Renaming file [2] to [3]. Must reboot to complete operation.0-1801342965IDS_ERROR_931033Scheduling reboot operation: Deleting file [2]. Must reboot to complete operation.0-1801342965IDS_ERROR_941033Module [2] failed to register. HRESULT [3]. Contact your support personnel.0-1801342965IDS_ERROR_951033Module [2] failed to unregister. HRESULT [3]. Contact your support personnel.0-1801342965IDS_ERROR_961033Failed to cache package [2]. Error: [3]. Contact your support personnel.0-1801342965IDS_ERROR_971033Could not register font [2]. Verify that you have sufficient permissions to install fonts, and that the system supports this font.0-1801342965IDS_ERROR_981033Could not unregister font [2]. Verify that you have sufficient permissions to remove fonts.0-1801342965IDS_ERROR_991033Could not create shortcut [2]. Verify that the destination folder exists and that you can access it.0-1801342965IDS_INSTALLDIR1033[INSTALLDIR]0-1801342965IDS_INSTALLSHIELD1033InstallShield0-1801342965IDS_INSTALLSHIELD_FORMATTED1033{&MSSWhiteSerif8}InstallShield0-1801342965IDS_ISSCRIPT_VERSION_MISSING1033The InstallScript engine is missing from this machine. If available, please run ISScript.msi, or contact your support personnel for further assistance.0-1801342965IDS_ISSCRIPT_VERSION_OLD1033The InstallScript engine on this machine is older than the version required to run this setup. If available, please install the latest version of ISScript.msi, or contact your support personnel for further assistance.0-1801342965IDS_NEXT1033&Next >0-1801342965IDS_OK1033OK0-1801342965IDS_PREREQUISITE_SETUP_BROWSE1033Open [ProductName]'s original [SETUPEXENAME]0-1801342965IDS_PREREQUISITE_SETUP_INVALID1033This executable file does not appear to be the original executable file for [ProductName]. Without using the original [SETUPEXENAME] to install additional dependencies, [ProductName] may not work correctly. Would you like to find the original [SETUPEXENAME]?0-1801342965IDS_PREREQUISITE_SETUP_SEARCH1033This installation may require additional dependencies. Without its dependencies, [ProductName] may not work correctly. Would you like to find the original [SETUPEXENAME]?0-1801342965IDS_PREVENT_DOWNGRADE_EXIT1033A newer version of this application is already installed on this computer. If you wish to install this version, please uninstall the newer version first. Click OK to exit the wizard.0-1801342965IDS_PRINT_BUTTON1033&Print0-1801342965IDS_PRODUCTNAME_INSTALLSHIELD1033[ProductName] - InstallShield Wizard0-1801342965IDS_PROGMSG_IIS_CREATEAPPPOOL1033Creating application pool %s0-1801342965IDS_PROGMSG_IIS_CREATEAPPPOOLS1033Creating application Pools...0-1801342965IDS_PROGMSG_IIS_CREATEVROOT1033Creating IIS virtual directory %s0-1801342965IDS_PROGMSG_IIS_CREATEVROOTS1033Creating IIS virtual directories...0-1801342965IDS_PROGMSG_IIS_CREATEWEBSERVICEEXTENSION1033Creating web service extension0-1801342965IDS_PROGMSG_IIS_CREATEWEBSERVICEEXTENSIONS1033Creating web service extensions...0-1801342965IDS_PROGMSG_IIS_CREATEWEBSITE1033Creating IIS website %s0-1801342965IDS_PROGMSG_IIS_CREATEWEBSITES1033Creating IIS websites...0-1801342965IDS_PROGMSG_IIS_EXTRACT1033Extracting information for IIS virtual directories...0-1801342965IDS_PROGMSG_IIS_EXTRACTDONE1033Extracted information for IIS virtual directories...0-1801342965IDS_PROGMSG_IIS_REMOVEAPPPOOL1033Removing application pool0-1801342965IDS_PROGMSG_IIS_REMOVEAPPPOOLS1033Removing application pools...0-1801342965IDS_PROGMSG_IIS_REMOVESITE1033Removing web site at port %d0-1801342965IDS_PROGMSG_IIS_REMOVEVROOT1033Removing IIS virtual directory %s0-1801342965IDS_PROGMSG_IIS_REMOVEVROOTS1033Removing IIS virtual directories...0-1801342965IDS_PROGMSG_IIS_REMOVEWEBSERVICEEXTENSION1033Removing web service extension0-1801342965IDS_PROGMSG_IIS_REMOVEWEBSERVICEEXTENSIONS1033Removing web service extensions...0-1801342965IDS_PROGMSG_IIS_REMOVEWEBSITES1033Removing IIS websites...0-1801342965IDS_PROGMSG_IIS_ROLLBACKAPPPOOLS1033Rolling back application pools...0-1801342965IDS_PROGMSG_IIS_ROLLBACKVROOTS1033Rolling back virtual directory and web site changes...0-1801342965IDS_PROGMSG_IIS_ROLLBACKWEBSERVICEEXTENSIONS1033Rolling back web service extensions...0-1801342965IDS_PROGMSG_TEXTFILECHANGS_REPLACE1033Replacing %s with %s in %s...0-1801342965IDS_PROGMSG_XML_COSTING1033Costing XML files...0-1801342965IDS_PROGMSG_XML_CREATE_FILE1033Creating XML file %s...0-1801342965IDS_PROGMSG_XML_FILES1033Performing XML file changes...0-1801342965IDS_PROGMSG_XML_REMOVE_FILE1033Removing XML file %s...0-1801342965IDS_PROGMSG_XML_ROLLBACK_FILES1033Rolling back XML file changes...0-1801342965IDS_PROGMSG_XML_UPDATE_FILE1033Updating XML file %s...0-1801342965IDS_SETUPEXE_EXPIRE_MSG1033This setup works until %s. The setup will now exit.0-1801342965IDS_SETUPEXE_LAUNCH_COND_E1033This setup was built with an evaluation version of InstallShield and can only be launched from setup.exe.0-1801342965IDS_SHORTCUT_DISPLAY_NAME11033Launch |Built0-1801383637IDS_SHORTCUT_DISPLAY_NAME21033Launch |Built0-1801359061IDS_SHORTCUT_DISPLAY_NAME31033SsisUnit Test Runner0-1801366449IDS_SQLBROWSE_INTRO1033From the list of servers below, select the database server you would like to target.0-1801342965IDS_SQLBROWSE_INTRO_DB1033From the list of catalog names below, select the database catalog you would like to target.0-1801342965IDS_SQLBROWSE_INTRO_TEMPLATE1033[IS_SQLBROWSE_INTRO]0-1801342965IDS_SQLLOGIN_BROWSE1033B&rowse...0-1801342965IDS_SQLLOGIN_BROWSE_DB1033Br&owse...0-1801342965IDS_SQLLOGIN_CATALOG1033&Name of database catalog:0-1801342965IDS_SQLLOGIN_CONNECT1033Connect using:0-1801342965IDS_SQLLOGIN_DESC1033Select database server and authentication method0-1801342965IDS_SQLLOGIN_ID1033&Login ID:0-1801342965IDS_SQLLOGIN_INTRO1033Select the database server to install to from the list below or click Browse to see a list of all database servers. You can also specify the way to authenticate your login using your current credentials or a SQL Login ID and Password.0-1801342965IDS_SQLLOGIN_PSWD1033&Password:0-1801342965IDS_SQLLOGIN_SERVER1033&Database Server:0-1801342965IDS_SQLLOGIN_SERVER21033&Database server that you are installing to:0-1801342965IDS_SQLLOGIN_SQL1033S&erver authentication using the Login ID and password below0-1801342965IDS_SQLLOGIN_TITLE1033{&MSSansBold8}Database Server0-1801342965IDS_SQLLOGIN_WIN1033&Windows authentication credentials of current user0-1801342965IDS_SQLSCRIPT_INSTALLING1033Executing SQL Install Script...0-1801342965IDS_SQLSCRIPT_UNINSTALLING1033Executing SQL Uninstall Script...0-1801342965IDS_STANDARD_USE_SETUPEXE1033This installation cannot be run by directly launching the MSI package. You must run setup.exe.0-1801342965IDS_SetupTips_Advertise1033Will be installed on first use. (Available only if the feature supports this option.)0-1801342965IDS_SetupTips_AllInstalledLocal1033Will be completely installed to the local hard drive.0-1801342965IDS_SetupTips_CustomSetup1033{&MSSansBold8}Custom Setup Tips0-1801342965IDS_SetupTips_CustomSetupDescription1033Custom Setup allows you to selectively install program features.0-1801342965IDS_SetupTips_IconInstallState1033The icon next to the feature name indicates the install state of the feature. Click the icon to drop down the install state menu for each feature.0-1801342965IDS_SetupTips_InstallState1033This install state means the feature...0-1801342965IDS_SetupTips_Network1033Will be installed to run from the network. (Available only if the feature supports this option.)0-1801342965IDS_SetupTips_OK1033OK0-1801342965IDS_SetupTips_SubFeaturesInstalledLocal1033Will have some subfeatures installed to the local hard drive. (Available only if the feature has subfeatures.)0-1801342965IDS_SetupTips_WillNotBeInstalled1033Will not be installed.0-1801342965IDS_UITEXT_Available1033Available0-1801342965IDS_UITEXT_Bytes1033bytes0-1801342965IDS_UITEXT_CompilingFeaturesCost1033Compiling cost for this feature...0-1801342965IDS_UITEXT_Differences1033Differences0-1801342965IDS_UITEXT_DiskSize1033Disk Size0-1801342965IDS_UITEXT_FeatureCompletelyRemoved1033This feature will be completely removed.0-1801342965IDS_UITEXT_FeatureContinueNetwork1033This feature will continue to be run from the network0-1801342965IDS_UITEXT_FeatureFreeSpace1033This feature frees up [1] on your hard drive.0-1801342965IDS_UITEXT_FeatureInstalledCD1033This feature, and all subfeatures, will be installed to run from the CD.0-1801342965IDS_UITEXT_FeatureInstalledCD21033This feature will be installed to run from CD.0-1801342965IDS_UITEXT_FeatureInstalledLocal1033This feature, and all subfeatures, will be installed on local hard drive.0-1801342965IDS_UITEXT_FeatureInstalledLocal21033This feature will be installed on local hard drive.0-1801342965IDS_UITEXT_FeatureInstalledNetwork1033This feature, and all subfeatures, will be installed to run from the network.0-1801342965IDS_UITEXT_FeatureInstalledNetwork21033This feature will be installed to run from network.0-1801342965IDS_UITEXT_FeatureInstalledRequired1033Will be installed when required.0-1801342965IDS_UITEXT_FeatureInstalledWhenRequired1033This feature will be set to be installed when required.0-1801342965IDS_UITEXT_FeatureInstalledWhenRequired21033This feature will be installed when required.0-1801342965IDS_UITEXT_FeatureLocal1033This feature will be installed on the local hard drive.0-1801342965IDS_UITEXT_FeatureLocal21033This feature will be installed on your local hard drive.0-1801342965IDS_UITEXT_FeatureNetwork1033This feature will be installed to run from the network.0-1801342965IDS_UITEXT_FeatureNetwork21033This feature will be available to run from the network.0-1801342965IDS_UITEXT_FeatureNotAvailable1033This feature will not be available.0-1801342965IDS_UITEXT_FeatureOnCD1033This feature will be installed to run from CD.0-1801342965IDS_UITEXT_FeatureOnCD21033This feature will be available to run from CD.0-1801342965IDS_UITEXT_FeatureRemainLocal1033This feature will remain on your local hard drive.0-1801342965IDS_UITEXT_FeatureRemoveNetwork1033This feature will be removed from your local hard drive, but will be still available to run from the network.0-1801342965IDS_UITEXT_FeatureRemovedCD1033This feature will be removed from your local hard drive but will still be available to run from CD.0-1801342965IDS_UITEXT_FeatureRemovedUnlessRequired1033This feature will be removed from your local hard drive but will be set to be installed when required.0-1801342965IDS_UITEXT_FeatureRequiredSpace1033This feature requires [1] on your hard drive.0-1801342965IDS_UITEXT_FeatureRunFromCD1033This feature will continue to be run from the CD0-1801342965IDS_UITEXT_FeatureSpaceFree1033This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.0-1801342965IDS_UITEXT_FeatureSpaceFree21033This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.0-1801342965IDS_UITEXT_FeatureSpaceFree31033This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.0-1801342965IDS_UITEXT_FeatureSpaceFree41033This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.0-1801342965IDS_UITEXT_FeatureUnavailable1033This feature will become unavailable.0-1801342965IDS_UITEXT_FeatureUninstallNoNetwork1033This feature will be uninstalled completely, and you won't be able to run it from the network.0-1801342965IDS_UITEXT_FeatureWasCD1033This feature was run from the CD but will be set to be installed when required.0-1801342965IDS_UITEXT_FeatureWasCDLocal1033This feature was run from the CD but will be installed on the local hard drive.0-1801342965IDS_UITEXT_FeatureWasOnNetworkInstalled1033This feature was run from the network but will be installed when required.0-1801342965IDS_UITEXT_FeatureWasOnNetworkLocal1033This feature was run from the network but will be installed on the local hard drive.0-1801342965IDS_UITEXT_FeatureWillBeUninstalled1033This feature will be uninstalled completely, and you won't be able to run it from CD.0-1801342965IDS_UITEXT_Folder1033Fldr|New Folder0-1801342965IDS_UITEXT_GB1033GB0-1801342965IDS_UITEXT_KB1033KB0-1801342965IDS_UITEXT_MB1033MB0-1801342965IDS_UITEXT_Required1033Required0-1801342965IDS_UITEXT_TimeRemaining1033Time remaining: {[1] min }{[2] sec}0-1801342965IDS_UITEXT_Volume1033Volume0-1801342965IDS__AgreeToLicense_01033I &do not accept the terms in the license agreement0-1801342965IDS__AgreeToLicense_11033I &accept the terms in the license agreement0-1801342965IDS__DatabaseFolder_ChangeFolder1033Click Next to install to this folder, or click Change to install to a different folder.0-1801342965IDS__DatabaseFolder_DatabaseDir1033[DATABASEDIR]0-1801342965IDS__DatabaseFolder_DatabaseFolder1033{&MSSansBold8}Database Folder0-1801342965IDS__DestinationFolder_Change1033&Change...0-1801342965IDS__DestinationFolder_ChangeFolder1033Click Next to install to this folder, or click Change to install to a different folder.0-1801342965IDS__DestinationFolder_DestinationFolder1033{&MSSansBold8}Destination Folder0-1801342965IDS__DestinationFolder_InstallTo1033Install [ProductName] to:0-1801342965IDS__DisplayName_Custom1033Custom0-1801342965IDS__DisplayName_Minimal1033Minimal0-1801342965IDS__DisplayName_Typical1033Typical0-1801342965IDS__IsAdminInstallBrowse_1110330-1801342965IDS__IsAdminInstallBrowse_410330-1801342965IDS__IsAdminInstallBrowse_810330-1801342965IDS__IsAdminInstallBrowse_BrowseDestination1033Browse to the destination folder.0-1801342965IDS__IsAdminInstallBrowse_ChangeDestination1033{&MSSansBold8}Change Current Destination Folder0-1801342965IDS__IsAdminInstallBrowse_CreateFolder1033Create new folder|0-1801342965IDS__IsAdminInstallBrowse_FolderName1033&Folder name:0-1801342965IDS__IsAdminInstallBrowse_LookIn1033&Look in:0-1801342965IDS__IsAdminInstallBrowse_UpOneLevel1033Up one level|0-1801342965IDS__IsAdminInstallPointWelcome_ServerImage1033The InstallShield(R) Wizard will create a server image of [ProductName] at a specified network location. To continue, click Next.0-1801342965IDS__IsAdminInstallPointWelcome_Wizard1033{&TahomaBold10}Welcome to the InstallShield Wizard for [ProductName]0-1801342965IDS__IsAdminInstallPoint_Change1033&Change...0-1801342965IDS__IsAdminInstallPoint_EnterNetworkLocation1033Enter the network location or click Change to browse to a location. Click Install to create a server image of [ProductName] at the specified network location or click Cancel to exit the wizard.0-1801342965IDS__IsAdminInstallPoint_Install1033&Install0-1801342965IDS__IsAdminInstallPoint_NetworkLocation1033&Network location:0-1801342965IDS__IsAdminInstallPoint_NetworkLocationFormatted1033{&MSSansBold8}Network Location0-1801342965IDS__IsAdminInstallPoint_SpecifyNetworkLocation1033Specify a network location for the server image of the product.0-1801342965IDS__IsBrowseButton1033&Browse...0-1801342965IDS__IsBrowseFolderDlg_1110330-1801342965IDS__IsBrowseFolderDlg_410330-1801342965IDS__IsBrowseFolderDlg_810330-1801342965IDS__IsBrowseFolderDlg_BrowseDestFolder1033Browse to the destination folder.0-1801342965IDS__IsBrowseFolderDlg_ChangeCurrentFolder1033{&MSSansBold8}Change Current Destination Folder0-1801342965IDS__IsBrowseFolderDlg_CreateFolder1033Create New Folder|0-1801342965IDS__IsBrowseFolderDlg_FolderName1033&Folder name:0-1801342965IDS__IsBrowseFolderDlg_LookIn1033&Look in:0-1801342965IDS__IsBrowseFolderDlg_OK1033OK0-1801342965IDS__IsBrowseFolderDlg_UpOneLevel1033Up One Level|0-1801342965IDS__IsBrowseForAccount1033Browse for a User Account0-1801342965IDS__IsBrowseGroup1033Select a Group0-1801342965IDS__IsBrowseUsernameTitle1033Select a User Name0-1801342965IDS__IsCancelDlg_ConfirmCancel1033Are you sure you want to cancel [ProductName] installation?0-1801342965IDS__IsCancelDlg_No1033&No0-1801342965IDS__IsCancelDlg_Yes1033&Yes0-1801342965IDS__IsConfirmPassword1033Con&firm password:0-1801342965IDS__IsCreateNewUserTitle1033New User Information0-1801342965IDS__IsCreateUserBrowse1033N&ew User Information...0-1801342965IDS__IsCustomSelectionDlg_Change1033&Change...0-1801342965IDS__IsCustomSelectionDlg_ClickFeatureIcon1033Click on an icon in the list below to change how a feature is installed.0-1801342965IDS__IsCustomSelectionDlg_CustomSetup1033{&MSSansBold8}Custom Setup0-1801342965IDS__IsCustomSelectionDlg_FeatureDescription1033Feature Description0-1801342965IDS__IsCustomSelectionDlg_FeaturePath1033<selected feature path>0-1801342965IDS__IsCustomSelectionDlg_FeatureSize1033Feature size0-1801342965IDS__IsCustomSelectionDlg_Help1033&Help0-1801342965IDS__IsCustomSelectionDlg_InstallTo1033Install to:0-1801342965IDS__IsCustomSelectionDlg_MultilineDescription1033Multiline description of the currently selected item0-1801342965IDS__IsCustomSelectionDlg_SelectFeatures1033Select the program features you want installed.0-1801342965IDS__IsCustomSelectionDlg_Space1033&Space0-1801342965IDS__IsDiskSpaceDlg_DiskSpace1033Disk space required for the installation exceeds available disk space.0-1801342965IDS__IsDiskSpaceDlg_HighlightedVolumes1033The highlighted volumes do not have enough disk space available for the currently selected features. You can remove files from the highlighted volumes, choose to install fewer features onto local drives, or select different destination drives.0-1801342965IDS__IsDiskSpaceDlg_Numbers1033{120}{70}{70}{70}{70}0-1801342965IDS__IsDiskSpaceDlg_OK1033OK0-1801342965IDS__IsDiskSpaceDlg_OutOfDiskSpace1033{&MSSansBold8}Out of Disk Space0-1801342965IDS__IsDomainOrServer1033&Domain or server:0-1801342965IDS__IsErrorDlg_Abort1033&Abort0-1801342965IDS__IsErrorDlg_ErrorText1033<error text goes here><error text goes here><error text goes here><error text goes here><error text goes here><error text goes here><error text goes here><error text goes here><error text goes here><error text goes here><error text goes here>0-1801342965IDS__IsErrorDlg_Ignore1033&Ignore0-1801342965IDS__IsErrorDlg_InstallerInfo1033[ProductName] Installer Information0-1801342965IDS__IsErrorDlg_NO1033&No0-1801342965IDS__IsErrorDlg_OK1033&OK0-1801342965IDS__IsErrorDlg_Retry1033&Retry0-1801342965IDS__IsErrorDlg_Yes1033&Yes0-1801342965IDS__IsExitDialog_Finish1033&Finish0-1801342965IDS__IsExitDialog_InstallSuccess1033The InstallShield Wizard has successfully installed [ProductName]. Click Finish to exit the wizard.0-1801342965IDS__IsExitDialog_LaunchProgram1033Launch the program0-1801342965IDS__IsExitDialog_ShowReadMe1033Show the readme file0-1801342965IDS__IsExitDialog_UninstallSuccess1033The InstallShield Wizard has successfully uninstalled [ProductName]. Click Finish to exit the wizard.0-1801342965IDS__IsExitDialog_Update_InternetConnection1033Your Internet connection can be used to make sure that you have the latest updates.0-1801342965IDS__IsExitDialog_Update_PossibleUpdates1033Some program files might have been updated since you purchased your copy of [ProductName].0-1801342965IDS__IsExitDialog_Update_SetupFinished1033Setup has finished installing [ProductName].0-1801342965IDS__IsExitDialog_Update_YesCheckForUpdates1033&Yes, check for program updates (Recommended) after the setup completes.0-1801342965IDS__IsExitDialog_WizardCompleted1033{&TahomaBold10}InstallShield Wizard Completed0-1801342965IDS__IsFatalError_ClickFinish1033Click Finish to exit the wizard.0-1801342965IDS__IsFatalError_Finish1033&Finish0-1801342965IDS__IsFatalError_KeepOrRestore1033You can either keep any existing installed elements on your system to continue this installation at a later time or you can restore your system to its original state prior to the installation.0-1801342965IDS__IsFatalError_NotModified1033Your system has not been modified. To complete installation at another time, please run setup again.0-1801342965IDS__IsFatalError_RestoreOrContinueLater1033Click Restore or Continue Later to exit the wizard.0-1801342965IDS__IsFatalError_WizardCompleted1033{&TahomaBold10}InstallShield Wizard Completed0-1801342965IDS__IsFatalError_WizardInterrupted1033The wizard was interrupted before [ProductName] could be completely installed.0-1801342965IDS__IsFeatureDetailsDlg_DiskSpaceRequirements1033{&MSSansBold8}Disk Space Requirements0-1801342965IDS__IsFeatureDetailsDlg_Numbers1033{120}{70}{70}{70}{70}0-1801342965IDS__IsFeatureDetailsDlg_OK1033OK0-1801342965IDS__IsFeatureDetailsDlg_SpaceRequired1033The disk space required for the installation of the selected features.0-1801342965IDS__IsFeatureDetailsDlg_VolumesTooSmall1033The highlighted volumes do not have enough disk space available for the currently selected features. You can remove files from the highlighted volumes, choose to install fewer features onto local drives, or select different destination drives.0-1801342965IDS__IsFilesInUse_ApplicationsUsingFiles1033The following applications are using files that need to be updated by this setup. Close these applications and click Retry to continue.0-1801342965IDS__IsFilesInUse_Exit1033&Exit0-1801342965IDS__IsFilesInUse_FilesInUse1033{&MSSansBold8}Files in Use0-1801342965IDS__IsFilesInUse_FilesInUseMessage1033Some files that need to be updated are currently in use.0-1801342965IDS__IsFilesInUse_Ignore1033&Ignore0-1801342965IDS__IsFilesInUse_Retry1033&Retry0-1801342965IDS__IsGroup1033&Group:0-1801342965IDS__IsGroupLabel1033Gr&oup:0-1801342965IDS__IsInitDlg_110330-1801342965IDS__IsInitDlg_210330-1801342965IDS__IsInitDlg_PreparingWizard1033[ProductName] Setup is preparing the InstallShield Wizard which will guide you through the program setup process. Please wait.0-1801342965IDS__IsInitDlg_WelcomeWizard1033{&TahomaBold10}Welcome to the InstallShield Wizard for [ProductName]0-1801342965IDS__IsLicenseDlg_LicenseAgreement1033{&MSSansBold8}License Agreement0-1801342965IDS__IsLicenseDlg_ReadLicenseAgreement1033Please read the following license agreement carefully.0-1801342965IDS__IsLogonInfoDescription1033Specify the user name and password of the user account that will logon to use this application. The user account must be in the form DOMAIN\Username.0-1801342965IDS__IsLogonInfoTitle1033{&MSSansBold8}Logon Information0-1801342965IDS__IsLogonInfoTitleDescription1033Specify a user name and password0-1801342965IDS__IsLogonNewUserDescription1033Select the button below to specify information about a new user that will be created during the installation.0-1801342965IDS__IsMaintenanceDlg_ChangeFeatures1033Change which program features are installed. This option displays the Custom Selection dialog in which you can change the way features are installed.0-1801342965IDS__IsMaintenanceDlg_MaitenanceOptions1033Modify, repair, or remove the program.0-1801342965IDS__IsMaintenanceDlg_Modify1033{&MSSansBold8}&Modify0-1801342965IDS__IsMaintenanceDlg_ProgramMaintenance1033{&MSSansBold8}Program Maintenance0-1801342965IDS__IsMaintenanceDlg_Remove1033{&MSSansBold8}&Remove0-1801342965IDS__IsMaintenanceDlg_RemoveProductName1033Remove [ProductName] from your computer.0-1801342965IDS__IsMaintenanceDlg_Repair1033{&MSSansBold8}Re&pair0-1801342965IDS__IsMaintenanceDlg_RepairMessage1033Repair installation errors in the program. This option fixes missing or corrupt files, shortcuts, and registry entries.0-1801342965IDS__IsMaintenanceWelcome_MaintenanceOptionsDescription1033The InstallShield(R) Wizard will allow you to modify, repair, or remove [ProductName]. To continue, click Next.0-1801342965IDS__IsMaintenanceWelcome_WizardWelcome1033{&TahomaBold10}Welcome to the InstallShield Wizard for [ProductName]0-1801342965IDS__IsMsiRMFilesInUse_ApplicationsUsingFiles1033The following applications are using files that need to be updated by this setup.0-1801342965IDS__IsMsiRMFilesInUse_CloseRestart1033Automatically close and attempt to restart applications.0-1801342965IDS__IsMsiRMFilesInUse_RebootAfter1033Do not close applications. (A reboot will be required.)0-1801342965IDS__IsPatchDlg_PatchClickUpdate1033The InstallShield(R) Wizard will install the Patch for [ProductName] on your computer. To continue, click Update.0-1801342965IDS__IsPatchDlg_PatchWizard1033[ProductName] Patch - InstallShield Wizard0-1801342965IDS__IsPatchDlg_Update1033&Update >0-1801342965IDS__IsPatchDlg_WelcomePatchWizard1033{&TahomaBold10}Welcome to the Patch for [ProductName]0-1801342965IDS__IsProgressDlg_210330-1801342965IDS__IsProgressDlg_Hidden1033(Hidden for now)0-1801342965IDS__IsProgressDlg_HiddenTimeRemaining1033)Hidden for now)Estimated time remaining:0-1801342965IDS__IsProgressDlg_InstallingProductName1033{&MSSansBold8}Installing [ProductName]0-1801342965IDS__IsProgressDlg_ProgressDone1033Progress done0-1801342965IDS__IsProgressDlg_SecHidden1033(Hidden for now)Sec.0-1801342965IDS__IsProgressDlg_Status1033Status:0-1801342965IDS__IsProgressDlg_Uninstalling1033{&MSSansBold8}Uninstalling [ProductName]0-1801342965IDS__IsProgressDlg_UninstallingFeatures1033The program features you selected are being uninstalled.0-1801342965IDS__IsProgressDlg_UninstallingFeatures21033The program features you selected are being installed.0-1801342965IDS__IsProgressDlg_WaitUninstall1033Please wait while the InstallShield Wizard uninstalls [ProductName]. This may take several minutes.0-1801342965IDS__IsProgressDlg_WaitUninstall21033Please wait while the InstallShield Wizard installs [ProductName]. This may take several minutes.0-1801342965IDS__IsReadmeDlg_Cancel1033&Cancel0-1801342965IDS__IsReadmeDlg_PleaseReadInfo1033Please read the following readme information carefully.0-1801342965IDS__IsReadmeDlg_ReadMeInfo1033{&MSSansBold8}Readme Information0-1801342965IDS__IsRegisterUserDlg_1610330-1801342965IDS__IsRegisterUserDlg_Anyone1033&Anyone who uses this computer (all users)0-1801342965IDS__IsRegisterUserDlg_CustomerInformation1033{&MSSansBold8}Customer Information0-1801342965IDS__IsRegisterUserDlg_InstallFor1033Install this application for:0-1801342965IDS__IsRegisterUserDlg_OnlyMe1033Only for &me ([USERNAME])0-1801342965IDS__IsRegisterUserDlg_Organization1033&Organization:0-1801342965IDS__IsRegisterUserDlg_PleaseEnterInfo1033Please enter your information.0-1801342965IDS__IsRegisterUserDlg_SerialNumber1033&Serial Number:0-1801342965IDS__IsRegisterUserDlg_Tahoma501033{\Tahoma8}{50}0-1801342965IDS__IsRegisterUserDlg_Tahoma801033{\Tahoma8}{80}0-1801342965IDS__IsRegisterUserDlg_UserName1033&User Name:0-1801342965IDS__IsResumeDlg_ResumeSuspended1033The InstallShield(R) Wizard will complete the suspended installation of [ProductName] on your computer. To continue, click Next.0-1801342965IDS__IsResumeDlg_Resuming1033{&TahomaBold10}Resuming the InstallShield Wizard for [ProductName]0-1801342965IDS__IsResumeDlg_WizardResume1033The InstallShield(R) Wizard will complete the installation of [ProductName] on your computer. To continue, click Next.0-1801342965IDS__IsSelectDomainOrServer1033Select a Domain or Server0-1801342965IDS__IsSelectDomainUserInstructions1033Use the browse buttons to select a domain\server and a user name.0-1801342965IDS__IsSetupComplete_ShowMsiLog1033Show the Windows Installer log0-1801342965IDS__IsSetupTypeMinDlg_1310330-1801342965IDS__IsSetupTypeMinDlg_AllFeatures1033All program features will be installed. (Requires the most disk space.)0-1801342965IDS__IsSetupTypeMinDlg_ChooseFeatures1033Choose which program features you want installed and where they will be installed. Recommended for advanced users.0-1801342965IDS__IsSetupTypeMinDlg_ChooseSetupType1033Choose the setup type that best suits your needs.0-1801342965IDS__IsSetupTypeMinDlg_Complete1033{&MSSansBold8}&Complete0-1801342965IDS__IsSetupTypeMinDlg_Custom1033{&MSSansBold8}Cu&stom0-1801342965IDS__IsSetupTypeMinDlg_Minimal1033{&MSSansBold8}&Minimal0-1801342965IDS__IsSetupTypeMinDlg_MinimumFeatures1033Minimum required features will be installed.0-1801342965IDS__IsSetupTypeMinDlg_SelectSetupType1033Please select a setup type.0-1801342965IDS__IsSetupTypeMinDlg_SetupType1033{&MSSansBold8}Setup Type0-1801342965IDS__IsSetupTypeMinDlg_Typical1033{&MSSansBold8}&Typical0-1801342965IDS__IsUserExit_ClickFinish1033Click Finish to exit the wizard.0-1801342965IDS__IsUserExit_Finish1033&Finish0-1801342965IDS__IsUserExit_KeepOrRestore1033You can either keep any existing installed elements on your system to continue this installation at a later time or you can restore your system to its original state prior to the installation.0-1801342965IDS__IsUserExit_NotModified1033Your system has not been modified. To install this program at a later time, please run the installation again.0-1801342965IDS__IsUserExit_RestoreOrContinue1033Click Restore or Continue Later to exit the wizard.0-1801342965IDS__IsUserExit_WizardCompleted1033{&TahomaBold10}InstallShield Wizard Completed0-1801342965IDS__IsUserExit_WizardInterrupted1033The wizard was interrupted before [ProductName] could be completely installed.0-1801342965IDS__IsUserNameLabel1033&User name:0-1801342965IDS__IsVerifyReadyDlg_BackOrCancel1033If you want to review or change any of your installation settings, click Back. Click Cancel to exit the wizard.0-1801342965IDS__IsVerifyReadyDlg_ClickInstall1033Click Install to begin the installation.0-1801342965IDS__IsVerifyReadyDlg_Company1033Company: [COMPANYNAME]0-1801342965IDS__IsVerifyReadyDlg_CurrentSettings1033Current Settings:0-1801342965IDS__IsVerifyReadyDlg_DestFolder1033Destination Folder:0-1801342965IDS__IsVerifyReadyDlg_Install1033&Install0-1801342965IDS__IsVerifyReadyDlg_Installdir1033[INSTALLDIR]0-1801342965IDS__IsVerifyReadyDlg_ModifyReady1033{&MSSansBold8}Ready to Modify the Program0-1801342965IDS__IsVerifyReadyDlg_ReadyInstall1033{&MSSansBold8}Ready to Install the Program0-1801342965IDS__IsVerifyReadyDlg_ReadyRepair1033{&MSSansBold8}Ready to Repair the Program0-1801342965IDS__IsVerifyReadyDlg_SelectedSetupType1033[SelectedSetupType]0-1801342965IDS__IsVerifyReadyDlg_Serial1033Serial: [ISX_SERIALNUM]0-1801342965IDS__IsVerifyReadyDlg_SetupType1033Setup Type:0-1801342965IDS__IsVerifyReadyDlg_UserInfo1033User Information:0-1801342965IDS__IsVerifyReadyDlg_UserName1033Name: [USERNAME]0-1801342965IDS__IsVerifyReadyDlg_WizardReady1033The wizard is ready to begin installation.0-1801342965IDS__IsVerifyRemoveAllDlg_ChoseRemoveProgram1033You have chosen to remove the program from your system.0-1801342965IDS__IsVerifyRemoveAllDlg_ClickBack1033If you want to review or change any settings, click Back.0-1801342965IDS__IsVerifyRemoveAllDlg_ClickRemove1033Click Remove to remove [ProductName] from your computer. After removal, this program will no longer be available for use.0-1801342965IDS__IsVerifyRemoveAllDlg_Remove1033&Remove0-1801342965IDS__IsVerifyRemoveAllDlg_RemoveProgram1033{&MSSansBold8}Remove the Program0-1801342965IDS__IsWelcomeDlg_InstallProductName1033The InstallShield(R) Wizard will install [ProductName] on your computer. To continue, click Next.0-1801342965IDS__IsWelcomeDlg_WarningCopyright1033WARNING: This program is protected by copyright law and international treaties.0-1801342965IDS__IsWelcomeDlg_WelcomeProductName1033{&TahomaBold10}Welcome to the InstallShield Wizard for [ProductName]0-1801342965IDS__TargetReq_DESC_COLOR1033The color settings of your system are not adequate for running [ProductName].0-1801342965IDS__TargetReq_DESC_OS1033The operating system is not adequate for running [ProductName].0-1801342965IDS__TargetReq_DESC_PROCESSOR1033The processor is not adequate for running [ProductName].0-1801342965IDS__TargetReq_DESC_RAM1033The amount of RAM is not adequate for running [ProductName].0-1801342965IDS__TargetReq_DESC_RESOLUTION1033The screen resolution is not adequate for running [ProductName].0-1801342965ID_STRING110330-1801342965ID_STRING210330-1801332725ID_STRING31033http://www.PragmaticWorks.com0-1801369489ID_STRING41033Pragmatic Works0-1801369489ID_STRING51033ssisUnit 201701243772972IIDS_UITEXT_FeatureUninstalled1033This feature will remain uninstalled.0-1801342965NEW_STRING11033ssisUnit0-1952299279
+ + + Name + Value + +
UniqueId24F818AD-1960-4F9A-AA56-59E99AEF14AF
+ + + UpgradedImage_ + Name + MsiPath + Order + Flags + IgnoreMissingFiles +
+ + + UpgradeItem + ObjectSetupPath + ISReleaseFlags + ISAttributes +
+ + + Name + MsiPath + Family +
+ + + Directory_ + Name + Value +
+ + + File_ + Name + Value +
+ + + Name + Value +
+ + + Registry_ + Name + Value +
+ + + ISRelease_ + ISProductConfiguration_ + Name + Value +
+ + + Shortcut_ + Name + Value +
+ + + ISXmlElement + ISXmlFile_ + ISXmlElement_Parent + XPath + Content + ISAttributes +
+ + + ISXmlElementAttrib + ISXmlElement_ + Name + Value + ISAttributes +
+ + + ISXmlFile + FileName + Component_ + Directory + ISAttributes + SelectionNamespaces + Encoding +
+ + + Signature_ + Parent + Element + Attribute + ISAttributes +
+ + + Name + Data + ISBuildSourcePath + ISIconIndex + +
ARPPRODUCTICON.exe<ISProductFolder>\redist\Language Independent\OS Independent\setupicon.ico0
+ + + IniFile + FileName + DirProperty + Section + Key + Value + Action + Component_ +
+ + + Signature_ + FileName + Section + Key + Field + Type +
+ + + Action + Condition + Sequence + ISComments + ISAttributes +
AllocateRegistrySpaceNOT Installed1550AllocateRegistrySpace + AppSearch400AppSearch + BindImage4300BindImage + CCPSearchCCP_TEST500CCPSearch + CostFinalize1000CostFinalize + CostInitialize800CostInitialize + CreateFolders3700CreateFolders + CreateShortcuts4500CreateShortcuts + DeleteServicesVersionNT2000DeleteServices + DuplicateFiles4210DuplicateFiles + FileCost900FileCost + FindRelatedProductsNOT ISSETUPDRIVEN420FindRelatedProducts + ISPreventDowngradeISFOUNDNEWERPRODUCTVERSION450ISPreventDowngrade + ISRunSetupTypeAddLocalEventNot Installed And Not ISRUNSETUPTYPEADDLOCALEVENT1050ISRunSetupTypeAddLocalEvent + ISSelfRegisterCosting2201 + ISSelfRegisterFiles5601 + ISSelfRegisterFinalize6601 + ISUnSelfRegisterFiles2202 + InstallFiles4000InstallFiles + InstallFinalize6600InstallFinalize + InstallInitialize1501InstallInitialize + InstallODBC5400InstallODBC + InstallServicesVersionNT5800InstallServices + InstallValidate1400InstallValidate + IsolateComponents950IsolateComponents + LaunchConditionsNot Installed410LaunchConditions + MigrateFeatureStates1010MigrateFeatureStates + MoveFiles3800MoveFiles + MsiConfigureServicesVersionMsi >= "5.00"5850MSI5 MsiConfigureServices + MsiPublishAssemblies6250MsiPublishAssemblies + MsiUnpublishAssemblies1750MsiUnpublishAssemblies + PatchFiles4090PatchFiles + ProcessComponents1600ProcessComponents + PublishComponents6200PublishComponents + PublishFeatures6300PublishFeatures + PublishProduct6400PublishProduct + RMCCPSearchNot CCP_SUCCESS And CCP_TEST600RMCCPSearch + RegisterClassInfo4600RegisterClassInfo + RegisterComPlus5700RegisterComPlus + RegisterExtensionInfo4700RegisterExtensionInfo + RegisterFonts5300RegisterFonts + RegisterMIMEInfo4900RegisterMIMEInfo + RegisterProduct6100RegisterProduct + RegisterProgIdInfo4800RegisterProgIdInfo + RegisterTypeLibraries5500RegisterTypeLibraries + RegisterUser6000RegisterUser + RemoveDuplicateFiles3400RemoveDuplicateFiles + RemoveEnvironmentStrings3300RemoveEnvironmentStrings + RemoveExistingProducts1410RemoveExistingProducts + RemoveFiles3500RemoveFiles + RemoveFolders3600RemoveFolders + RemoveIniValues3100RemoveIniValues + RemoveODBC2400RemoveODBC + RemoveRegistryValues2600RemoveRegistryValues + RemoveShortcuts3200RemoveShortcuts + ResolveSourceNot Installed850ResolveSource + ScheduleRebootISSCHEDULEREBOOT6410ScheduleReboot + SelfRegModules5600SelfRegModules + SelfUnregModules2200SelfUnregModules + SetARPINSTALLLOCATION1100SetARPINSTALLLOCATION + SetAllUsersProfileNTVersionNT = 400970 + SetODBCFolders1200SetODBCFolders + StartServicesVersionNT5900StartServices + StopServicesVersionNT1900StopServices + UnpublishComponents1700UnpublishComponents + UnpublishFeatures1800UnpublishFeatures + UnregisterClassInfo2700UnregisterClassInfo + UnregisterComPlus2100UnregisterComPlus + UnregisterExtensionInfo2800UnregisterExtensionInfo + UnregisterFonts2500UnregisterFonts + UnregisterMIMEInfo3000UnregisterMIMEInfo + UnregisterProgIdInfo2900UnregisterProgIdInfo + UnregisterTypeLibraries2300UnregisterTypeLibraries + ValidateProductID700ValidateProductID + WriteEnvironmentStrings5200WriteEnvironmentStrings + WriteIniValues5100WriteIniValues + WriteRegistryValues5000WriteRegistryValues + setAllUsersProfile2KVersionNT >= 500980 + setUserProfileNTVersionNT960 +
+ + + Property + Value + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActiveLanguage1033Comments + CurrentMedia +QwBEAF8AUgBPAE0AAQBFAHgAcAByAGUAcwBzAA== + DefaultProductConfigurationExpressEnableSwidtag1ISCompilerOption_CompileBeforeBuild1ISCompilerOption_Debug0ISCompilerOption_IncludePath + ISCompilerOption_LibraryPath + ISCompilerOption_MaxErrors50ISCompilerOption_MaxWarnings50ISCompilerOption_OutputPath<ISProjectDataFolder>\Script FilesISCompilerOption_PreProcessor_ISSCRIPT_NEW_STYLE_DLG_DEFSISCompilerOption_WarningLevel3ISCompilerOption_WarningsAsErrors1ISThemeInstallShield Blue.themeISUSLock{2294A408-E924-4748-A7DF-D82F6ED06075}ISUSSignature{43567408-58E0-453A-A028-62DEF16A6E01}ISVisitedViewsviewAssistant,viewAppV,viewProject,viewRealSetupDesign,viewSetupDesign,viewSetupTypes,viewUpgradePaths,viewUpdateService,viewObjects,viewRelease,viewISToday,viewAppFiles,viewFeatureFiles,viewDependencies,viewShortcuts,viewFileExtensions,viewEnvironmentVariables,viewUI,viewSupportFiles,viewCustomActions,viewInstallScriptStd,viewDesignPatches,viewBillboards,viewTextMessages,viewSystemSearchLimited1LockPermissionMode1MsiExecCmdLineOptions + MsiLogFile + OnUpgrade0Owner + PatchFamilyMyPatchFamily1PatchSequence1.0.0SaveAsSchema + SccEnabled0SccPathSAKSchemaVersion774TypeMSIEVSSccAuxPathSAKVSSccLocalPathSAKVSSccProviderSAK
+ + + Action + Condition + Sequence + ISComments + ISAttributes +
AppSearch400AppSearch + CCPSearchCCP_TEST500CCPSearch + CostFinalize1000CostFinalize + CostInitialize800CostInitialize + ExecuteAction1300ExecuteAction + FileCost900FileCost + FindRelatedProducts430FindRelatedProducts + ISPreventDowngradeISFOUNDNEWERPRODUCTVERSION450ISPreventDowngrade + InstallWelcomeNot Installed1210InstallWelcome + IsolateComponents950IsolateComponents + LaunchConditionsNot Installed410LaunchConditions + MaintenanceWelcomeInstalled And Not RESUME And Not Preselected And Not PATCH1230MaintenanceWelcome + MigrateFeatureStates1200MigrateFeatureStates + PatchWelcomeInstalled And PATCH And Not IS_MAJOR_UPGRADE1205Patch Panel + RMCCPSearchNot CCP_SUCCESS And CCP_TEST600RMCCPSearch + ResolveSourceNot Installed990ResolveSource + SetAllUsersProfileNTVersionNT = 400970 + SetupCompleteError-3SetupCompleteError + SetupCompleteSuccess-1SetupCompleteSuccess + SetupInitialization420SetupInitialization + SetupInterrupted-2SetupInterrupted + SetupProgress1240SetupProgress + SetupResumeInstalled And (RESUME Or Preselected) And Not PATCH1220SetupResume + ValidateProductID700ValidateProductID + setAllUsersProfile2KVersionNT >= 500980 + setUserProfileNTVersionNT960 +
+ + + Component_Shared + Component_Application +
+ + + Condition + Description + +
DOTNETVERSION40FULL>="#1"##IDPROP_EXPRESS_LAUNCH_CONDITION_DOTNETVERSION40FULL##
+ + + Property + Order + Value + Text +
+ + + Property + Order + Value + Text + Binary_ +
+ + + LockObject + Table + Domain + User + Permission +
+ + + ContentType + Extension_ + CLSID +
+ + + DiskId + LastSequence + DiskPrompt + Cabinet + VolumeLabel + Source +
+ + + FileKey + Component_ + SourceName + DestName + SourceFolder + DestFolder + Options +
+ + + Component_ + Feature_ + File_Manifest + File_Application + Attributes +
+ + + Component_ + Name + Value +
+ + + DigitalCertificate + CertData +
+ + + Table + SignObject + DigitalCertificate_ + Hash +
+ + + Component + Flags + Sequence + ReferenceComponents +
+ + + MsiEmbeddedChainer + Condition + CommandLine + Source + Type +
+ + + MsiEmbeddedUI + FileName + Attributes + MessageFilter + Data + ISBuildSourcePath +
+ + + File_ + Options + HashPart1 + HashPart2 + HashPart3 + HashPart4 +
+ + + MsiLockPermissionsEx + LockObject + Table + SDDLText + Condition +
+ + + PackageCertificate + DigitalCertificate_ +
+ + + PatchCertificate + DigitalCertificate_ +
+ + + PatchConfiguration_ + Company + Property + Value +
+ + + File_ + Assembly_ +
+ + + Assembly + Name + Value +
+ + + PatchConfiguration_ + PatchFamily + Target + Sequence + Supersede +
+ + + MsiServiceConfig + Name + Event + ConfigType + Argument + Component_ +
+ + + MsiServiceConfigFailureActions + Name + Event + ResetPeriod + RebootMessage + Command + Actions + DelayActions + Component_ +
+ + + MsiShortcutProperty + Shortcut_ + PropertyKey + PropVariantValue +
+ + + Driver_ + Attribute + Value +
+ + + DataSource + Component_ + Description + DriverDescription + Registration +
+ + + Driver + Component_ + Description + File_ + File_Setup +
+ + + DataSource_ + Attribute + Value +
+ + + Translator + Component_ + Description + File_ + File_Setup +
+ + + File_ + Sequence + PatchSize + Attributes + Header + StreamRef_ + ISBuildSourcePath +
+ + + PatchId + Media_ +
+ + + ProgId + ProgId_Parent + Class_ + Description + Icon_ + IconIndex + ISAttributes +
ext1.File +
+ + + Property + Value + ISComments +
ALLUSERS1 + ARPINSTALLLOCATION + ARPPRODUCTICONARPPRODUCTICON.exe + ARPSIZE + ARPURLINFOABOUT##ID_STRING3## + AgreeToLicenseNo + ApplicationUsersAllUsers + DWUSINTERVAL30 + DWUSLINKCECC874FEECB978FCEAC909FB9EC978FEEDC008FCEDCF068CE8B37E8FEABD0A8D9ACC0FF8EAC + DefaultUIFontExpressDefault + DialogCaptionInstallShield for Windows Installer + DiskPrompt[1] + DiskSerial1234-5678 + DisplayNameCustom##IDS__DisplayName_Custom## + DisplayNameMinimal##IDS__DisplayName_Minimal## + DisplayNameTypical##IDS__DisplayName_Typical## + Display_IsBitmapDlg1 + ErrorDialogSetupError + INSTALLLEVEL200 + ISCHECKFORPRODUCTUPDATES1 + ISENABLEDWUSFINISHDIALOG + ISSHOWMSILOG + ISVROOT_PORT_NO0 + IS_COMPLUS_PROGRESSTEXT_COST##IDS_COMPLUS_PROGRESSTEXT_COST## + IS_COMPLUS_PROGRESSTEXT_INSTALL##IDS_COMPLUS_PROGRESSTEXT_INSTALL## + IS_COMPLUS_PROGRESSTEXT_UNINSTALL##IDS_COMPLUS_PROGRESSTEXT_UNINSTALL## + IS_PREVENT_DOWNGRADE_EXIT##IDS_PREVENT_DOWNGRADE_EXIT## + IS_PROGMSG_TEXTFILECHANGS_REPLACE##IDS_PROGMSG_TEXTFILECHANGS_REPLACE## + IS_PROGMSG_XML_COSTING##IDS_PROGMSG_XML_COSTING## + IS_PROGMSG_XML_CREATE_FILE##IDS_PROGMSG_XML_CREATE_FILE## + IS_PROGMSG_XML_FILES##IDS_PROGMSG_XML_FILES## + IS_PROGMSG_XML_REMOVE_FILE##IDS_PROGMSG_XML_REMOVE_FILE## + IS_PROGMSG_XML_ROLLBACK_FILES##IDS_PROGMSG_XML_ROLLBACK_FILES## + IS_PROGMSG_XML_UPDATE_FILE##IDS_PROGMSG_XML_UPDATE_FILE## + IS_SQLSERVER_AUTHENTICATION0 + IS_SQLSERVER_DATABASE + IS_SQLSERVER_PASSWORD + IS_SQLSERVER_SERVER + IS_SQLSERVER_USERNAMEsa + InstallChoiceAR + LAUNCHPROGRAM1 + LAUNCHREADME1 + Manufacturer##COMPANY_NAME## + PIDKEY + PIDTemplate12345<###-%%%%%%%>@@@@@ + PROGMSG_IIS_CREATEAPPPOOL##IDS_PROGMSG_IIS_CREATEAPPPOOL## + PROGMSG_IIS_CREATEAPPPOOLS##IDS_PROGMSG_IIS_CREATEAPPPOOLS## + PROGMSG_IIS_CREATEVROOT##IDS_PROGMSG_IIS_CREATEVROOT## + PROGMSG_IIS_CREATEVROOTS##IDS_PROGMSG_IIS_CREATEVROOTS## + PROGMSG_IIS_CREATEWEBSERVICEEXTENSION##IDS_PROGMSG_IIS_CREATEWEBSERVICEEXTENSION## + PROGMSG_IIS_CREATEWEBSERVICEEXTENSIONS##IDS_PROGMSG_IIS_CREATEWEBSERVICEEXTENSIONS## + PROGMSG_IIS_CREATEWEBSITE##IDS_PROGMSG_IIS_CREATEWEBSITE## + PROGMSG_IIS_CREATEWEBSITES##IDS_PROGMSG_IIS_CREATEWEBSITES## + PROGMSG_IIS_EXTRACT##IDS_PROGMSG_IIS_EXTRACT## + PROGMSG_IIS_EXTRACTDONE##IDS_PROGMSG_IIS_EXTRACTDONE## + PROGMSG_IIS_EXTRACTDONEz##IDS_PROGMSG_IIS_EXTRACTDONE## + PROGMSG_IIS_EXTRACTzDONE##IDS_PROGMSG_IIS_EXTRACTDONE## + PROGMSG_IIS_REMOVEAPPPOOL##IDS_PROGMSG_IIS_REMOVEAPPPOOL## + PROGMSG_IIS_REMOVEAPPPOOLS##IDS_PROGMSG_IIS_REMOVEAPPPOOLS## + PROGMSG_IIS_REMOVESITE##IDS_PROGMSG_IIS_REMOVESITE## + PROGMSG_IIS_REMOVEVROOT##IDS_PROGMSG_IIS_REMOVEVROOT## + PROGMSG_IIS_REMOVEVROOTS##IDS_PROGMSG_IIS_REMOVEVROOTS## + PROGMSG_IIS_REMOVEWEBSERVICEEXTENSION##IDS_PROGMSG_IIS_REMOVEWEBSERVICEEXTENSION## + PROGMSG_IIS_REMOVEWEBSERVICEEXTENSIONS##IDS_PROGMSG_IIS_REMOVEWEBSERVICEEXTENSIONS## + PROGMSG_IIS_REMOVEWEBSITES##IDS_PROGMSG_IIS_REMOVEWEBSITES## + PROGMSG_IIS_ROLLBACKAPPPOOLS##IDS_PROGMSG_IIS_ROLLBACKAPPPOOLS## + PROGMSG_IIS_ROLLBACKVROOTS##IDS_PROGMSG_IIS_ROLLBACKVROOTS## + PROGMSG_IIS_ROLLBACKWEBSERVICEEXTENSIONS##IDS_PROGMSG_IIS_ROLLBACKWEBSERVICEEXTENSIONS## + ProductCode{8FDA5877-9833-4198-AFB4-9162F20F21F2} + ProductNamessisUnit 2017 + ProductVersion1.00.0000 + ProgressType0install + ProgressType1Installing + ProgressType2installed + ProgressType3installs + RebootYesNoYes + ReinstallFileVersiono + ReinstallModeTextomus + ReinstallRepairr + RestartManagerOptionCloseRestart + SERIALNUMBER + SERIALNUMVALSUCCESSRETVAL1 + SecureCustomPropertiesISFOUNDNEWERPRODUCTVERSION;USERNAME;COMPANYNAME;ISX_SERIALNUM;SUPPORTDIR;DOTNETVERSION40FULL + SelectedSetupType##IDS__DisplayName_Typical## + SetupTypeTypical + UpgradeCode{7B7A9646-237C-4E4E-9316-B32C1452BBB9} + _IsMaintenanceChange + _IsSetupTypeMinTypical +
+ + + ComponentId + Qualifier + Component_ + AppData + Feature_ +
+ + + Property + Order + Value + X + Y + Width + Height + Text + Help + ISControlId +
AgreeToLicense1No01529115##IDS__AgreeToLicense_0## + AgreeToLicense2Yes0029115##IDS__AgreeToLicense_1## + ApplicationUsers1AllUsers1729014##IDS__IsRegisterUserDlg_Anyone## + ApplicationUsers2OnlyCurrentUser12329014##IDS__IsRegisterUserDlg_OnlyMe## + RestartManagerOption1CloseRestart6933114##IDS__IsMsiRMFilesInUse_CloseRestart## + RestartManagerOption2Reboot62133114##IDS__IsMsiRMFilesInUse_RebootAfter## + _IsMaintenance1Change0029014##IDS__IsMaintenanceDlg_Modify## + _IsMaintenance2Reinstall06029014##IDS__IsMaintenanceDlg_Repair## + _IsMaintenance3Remove012029014##IDS__IsMaintenanceDlg_Remove## + _IsSetupTypeMin1Typical1626414##IDS__IsSetupTypeMinDlg_Typical## +
+ + + Signature_ + Root + Key + Name + Type + +
DotNet40Full2SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FullInstall2
+ + + Registry + Root + Key + Name + Value + Component_ + ISAttributes +
+ + + FileKey + Component_ + FileName + DirProperty + InstallMode +
+ + + RemoveIniFile + FileName + DirProperty + Section + Key + Value + Action + Component_ +
+ + + RemoveRegistry + Root + Key + Name + Component_ +
+ + + ReserveKey + Component_ + ReserveFolder + ReserveLocal + ReserveSource +
+ + + SFPCatalog + Catalog + Dependency +
+ + + File_ + Cost +
+ + + ServiceControl + Name + Event + Arguments + Wait + Component_ +
+ + + ServiceInstall + Name + DisplayName + ServiceType + StartType + ErrorControl + LoadOrderGroup + Dependencies + StartName + Password + Arguments + Component_ + Description +
+ + + Shortcut + Directory_ + Name + Component_ + Target + Arguments + Description + Hotkey + Icon_ + IconIndex + ShowCmd + WkDir + DisplayResourceDLL + DisplayResourceId + DescriptionResourceDLL + DescriptionResourceId + ISComments + ISShortcutName + ISAttributes +
+ + + Signature + FileName + MinVersion + MaxVersion + MinSize + MaxSize + MinDate + MaxDate + Languages +
+ + + TextStyle + FaceName + Size + Color + StyleBits + + + + + + + +
Arial8Arial8 + Arial9Arial9 + ArialBlue10Arial1016711680 + ArialBlueStrike10Arial10167116808CourierNew8Courier New8 + CourierNew9Courier New9 + ExpressDefaultTahoma8 + MSGothic9MS Gothic9 + MSSGreySerif8MS Sans Serif88421504 + MSSWhiteSerif8Tahoma816777215 + MSSansBold8Tahoma81MSSansSerif8MS Sans Serif8 + MSSansSerif9MS Sans Serif9 + Tahoma10Tahoma10 + Tahoma8Tahoma8 + Tahoma9Tahoma9 + TahomaBold10Tahoma101TahomaBold8Tahoma81Times8Times New Roman8 + Times9Times New Roman9 + TimesItalic12Times New Roman122TimesItalicBlue10Times New Roman10167116802TimesRed16Times New Roman16255 + VerdanaBold14Verdana131
+ + + LibID + Language + Component_ + Version + Description + Directory_ + Feature_ + Cost +
+ + + Key + Text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AbsentPath + GB##IDS_UITEXT_GB##KB##IDS_UITEXT_KB##MB##IDS_UITEXT_MB##MenuAbsent##IDS_UITEXT_FeatureNotAvailable##MenuAdvertise##IDS_UITEXT_FeatureInstalledWhenRequired2##MenuAllCD##IDS_UITEXT_FeatureInstalledCD##MenuAllLocal##IDS_UITEXT_FeatureInstalledLocal##MenuAllNetwork##IDS_UITEXT_FeatureInstalledNetwork##MenuCD##IDS_UITEXT_FeatureInstalledCD2##MenuLocal##IDS_UITEXT_FeatureInstalledLocal2##MenuNetwork##IDS_UITEXT_FeatureInstalledNetwork2##NewFolder##IDS_UITEXT_Folder##SelAbsentAbsent##IDS_UITEXT_GB##SelAbsentAdvertise##IDS_UITEXT_FeatureInstalledWhenRequired##SelAbsentCD##IDS_UITEXT_FeatureOnCD##SelAbsentLocal##IDS_UITEXT_FeatureLocal##SelAbsentNetwork##IDS_UITEXT_FeatureNetwork##SelAdvertiseAbsent##IDS_UITEXT_FeatureUnavailable##SelAdvertiseAdvertise##IDS_UITEXT_FeatureInstalledRequired##SelAdvertiseCD##IDS_UITEXT_FeatureOnCD2##SelAdvertiseLocal##IDS_UITEXT_FeatureLocal2##SelAdvertiseNetwork##IDS_UITEXT_FeatureNetwork2##SelCDAbsent##IDS_UITEXT_FeatureWillBeUninstalled##SelCDAdvertise##IDS_UITEXT_FeatureWasCD##SelCDCD##IDS_UITEXT_FeatureRunFromCD##SelCDLocal##IDS_UITEXT_FeatureWasCDLocal##SelChildCostNeg##IDS_UITEXT_FeatureFreeSpace##SelChildCostPos##IDS_UITEXT_FeatureRequiredSpace##SelCostPending##IDS_UITEXT_CompilingFeaturesCost##SelLocalAbsent##IDS_UITEXT_FeatureCompletelyRemoved##SelLocalAdvertise##IDS_UITEXT_FeatureRemovedUnlessRequired##SelLocalCD##IDS_UITEXT_FeatureRemovedCD##SelLocalLocal##IDS_UITEXT_FeatureRemainLocal##SelLocalNetwork##IDS_UITEXT_FeatureRemoveNetwork##SelNetworkAbsent##IDS_UITEXT_FeatureUninstallNoNetwork##SelNetworkAdvertise##IDS_UITEXT_FeatureWasOnNetworkInstalled##SelNetworkLocal##IDS_UITEXT_FeatureWasOnNetworkLocal##SelNetworkNetwork##IDS_UITEXT_FeatureContinueNetwork##SelParentCostNegNeg##IDS_UITEXT_FeatureSpaceFree##SelParentCostNegPos##IDS_UITEXT_FeatureSpaceFree2##SelParentCostPosNeg##IDS_UITEXT_FeatureSpaceFree3##SelParentCostPosPos##IDS_UITEXT_FeatureSpaceFree4##TimeRemaining##IDS_UITEXT_TimeRemaining##VolumeCostAvailable##IDS_UITEXT_Available##VolumeCostDifference##IDS_UITEXT_Differences##VolumeCostRequired##IDS_UITEXT_Required##VolumeCostSize##IDS_UITEXT_DiskSize##VolumeCostVolume##IDS_UITEXT_Volume##bytes##IDS_UITEXT_Bytes##
+ + + UpgradeCode + VersionMin + VersionMax + Language + Attributes + Remove + ActionProperty + ISDisplayName + +
{00000000-0000-0000-0000-000000000000}***ALL_VERSIONS***2ISFOUNDNEWERPRODUCTVERSIONISPreventDowngrade
+ + + Extension_ + Verb + Sequence + Command + Argument + +
ssisUnitopenRun Test/TESTCASE %1
+ + + Table + Column + Nullable + MinValue + MaxValue + KeyTable + KeyColumn + Category + Set + Description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActionTextActionNIdentifierName of action to be described.ActionTextDescriptionYTextLocalized description displayed in progress dialog and log when action is executing.ActionTextTemplateYTemplateOptional localized format template used to format action data records for display during action execution.AdminExecuteSequenceActionNIdentifierName of action to invoke, either in the engine or the handler DLL.AdminExecuteSequenceConditionYConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.AdminExecuteSequenceISAttributesYThis is used to store MM Custom Action TypesAdminExecuteSequenceISCommentsYTextAuthor’s comments on this Sequence.AdminExecuteSequenceSequenceY-432767Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AdminUISequenceActionNIdentifierName of action to invoke, either in the engine or the handler DLL.AdminUISequenceConditionYConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.AdminUISequenceISAttributesYThis is used to store MM Custom Action TypesAdminUISequenceISCommentsYTextAuthor’s comments on this Sequence.AdminUISequenceSequenceY-432767Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AdvtExecuteSequenceActionNIdentifierName of action to invoke, either in the engine or the handler DLL.AdvtExecuteSequenceConditionYConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.AdvtExecuteSequenceISAttributesYThis is used to store MM Custom Action TypesAdvtExecuteSequenceISCommentsYTextAuthor’s comments on this Sequence.AdvtExecuteSequenceSequenceY-432767Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AdvtUISequenceActionNIdentifierName of action to invoke, either in the engine or the handler DLL.AdvtUISequenceConditionYConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.AdvtUISequenceISAttributesYThis is used to store MM Custom Action TypesAdvtUISequenceISCommentsYTextAuthor’s comments on this Sequence.AdvtUISequenceSequenceY-432767Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.AppIdActivateAtStorageY01 + AppIdAppIdNGuid + AppIdDllSurrogateYText + AppIdLocalServiceYText + AppIdRemoteServerNameYFormatted + AppIdRunAsInteractiveUserY01 + AppIdServiceParametersYText + AppSearchPropertyNIdentifierThe property associated with a SignatureAppSearchSignature_NISXmlLocator;Signature1IdentifierThe Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, CompLocator and the DrLocator tables.BBControlAttributesY02147483647A 32-bit word that specifies the attribute flags to be applied to this control.BBControlBBControlNIdentifierName of the control. This name must be unique within a billboard, but can repeat on different billboard.BBControlBillboard_NBillboard1IdentifierExternal key to the Billboard table, name of the billboard.BBControlHeightN032767Height of the bounding rectangle of the control.BBControlTextYTextA string used to set the initial text contained within a control (if appropriate).BBControlTypeNIdentifierThe type of the control.BBControlWidthN032767Width of the bounding rectangle of the control.BBControlXN032767Horizontal coordinate of the upper left corner of the bounding rectangle of the control.BBControlYN032767Vertical coordinate of the upper left corner of the bounding rectangle of the control.BillboardActionYIdentifierThe name of an action. The billboard is displayed during the progress messages received from this action.BillboardBillboardNIdentifierName of the billboard.BillboardFeature_NFeature1IdentifierAn external key to the Feature Table. The billboard is shown only if this feature is being installed.BillboardOrderingY032767A positive integer. If there is more than one billboard corresponding to an action they will be shown in the order defined by this column.BinaryDataYBinaryBinary stream. The binary icon data in PE (.DLL or .EXE) or icon (.ICO) format.BinaryISBuildSourcePathYTextFull path to the ICO or EXE file.BinaryNameNIdentifierUnique key identifying the binary data.BindImageFile_NFile1IdentifierThe index into the File table. This must be an executable file.BindImagePathYPathsA list of ; delimited paths that represent the paths to be searched for the import DLLS. The list is usually a list of properties each enclosed within square brackets [] .CCPSearchSignature_NSignature1IdentifierThe Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, CompLocator and the DrLocator tables.CheckBoxPropertyNIdentifierA named property to be tied to the item.CheckBoxValueYFormattedThe value string associated with the item.ClassAppId_YAppId1GuidOptional AppID containing DCOM information for associated application (string GUID).ClassArgumentYFormattedoptional argument for LocalServers.ClassAttributesY32767Class registration attributes.ClassCLSIDNGuidThe CLSID of an OLE factory.ClassComponent_NComponent1IdentifierRequired foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent.ClassContextNIdentifierThe numeric server context for this server. CLSCTX_xxxxClassDefInprocHandlerYText1;2;3Optional default inproc handler. Only optionally provided if Context=CLSCTX_LOCAL_SERVER. Typically "ole32.dll" or "mapi32.dll"ClassDescriptionYTextLocalized description for the Class.ClassFeature_NFeature1IdentifierRequired foreign key into the Feature Table, specifying the feature to validate or install in order for the CLSID factory to be operational.ClassFileTypeMaskYTextOptional string containing information for the HKCRthis CLSID) key. If multiple patterns exist, they must be delimited by a semicolon, and numeric subkeys will be generated: 0,1,2...ClassIconIndexY-3276732767Optional icon index.ClassIcon_YIcon1IdentifierOptional foreign key into the Icon Table, specifying the icon file associated with this CLSID. Will be written under the DefaultIcon key.ClassProgId_DefaultYProgId1TextOptional ProgId associated with this CLSID.ComboBoxOrderN132767A positive integer used to determine the ordering of the items within one list. The integers do not have to be consecutive.ComboBoxPropertyNIdentifierA named property to be tied to this item. All the items tied to the same property become part of the same combobox.ComboBoxTextYFormattedThe visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value.ComboBoxValueNFormattedThe value string associated with this item. Selecting the line will set the associated property to this value.CompLocatorComponentIdNGuidA string GUID unique to this component, version, and language.CompLocatorSignature_NSignature1IdentifierThe table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table.CompLocatorTypeY01A boolean value that determines if the registry value is a filename or a directory location.ComplusComponent_NComponent1IdentifierForeign key referencing Component that controls the ComPlus component.ComplusExpTypeY032767ComPlus component attributes.ComponentAttributesNRemote execution option, one of irsEnumComponentComponentNIdentifierPrimary key used to identify a particular component record.ComponentComponentIdYGuidA string GUID unique to this component, version, and language.ComponentConditionYConditionA conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component.ComponentDirectory_NDirectory1IdentifierRequired key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table.ComponentISAttributesYThis is used to store Installshield custom properties of a component.ComponentISCommentsYTextUser Comments.ComponentISDotNetInstallerArgsCommitYTextArguments passed to the key file of the component if if implements the .NET Installer classComponentISDotNetInstallerArgsInstallYTextArguments passed to the key file of the component if if implements the .NET Installer classComponentISDotNetInstallerArgsRollbackYTextArguments passed to the key file of the component if if implements the .NET Installer classComponentISDotNetInstallerArgsUninstallYTextArguments passed to the key file of the component if if implements the .NET Installer classComponentISRegFileToMergeAtBuildYTextPath and File name of a .REG file to merge into the component at build time.ComponentISScanAtBuildFileYTextFile used by the Dot Net scanner to populate dependant assemblies' File_Application field.ComponentKeyPathYFile;ODBCDataSource;Registry1IdentifierEither the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.ConditionConditionYConditionExpression evaluated to determine if Level in the Feature table is to change.ConditionFeature_NFeature1IdentifierReference to a Feature entry in Feature table.ConditionLevelN032767New selection Level to set in Feature table if Condition evaluates to TRUE.ControlAttributesY02147483647A 32-bit word that specifies the attribute flags to be applied to this control.ControlBinary_YBinary1IdentifierExternal key to the Binary table.ControlControlNIdentifierName of the control. This name must be unique within a dialog, but can repeat on different dialogs.ControlControl_NextYControl2IdentifierThe name of an other control on the same dialog. This link defines the tab order of the controls. The links have to form one or more cycles!ControlDialog_NDialog1IdentifierExternal key to the Dialog table, name of the dialog.ControlHeightN032767Height of the bounding rectangle of the control.ControlHelpYTextThe help strings used with the button. The text is optional.ControlISBuildSourcePathYTextFull path to .rtf file for scrollable text controlControlISControlIdYA number used to represent the control ID of the Control, Used in Dialog exportControlISWindowStyleY02147483647A 32-bit word that specifies non-MSI window styles to be applied to this control.ControlPropertyYIdentifierThe name of a defined property to be linked to this control.ControlTextYFormattedA string used to set the initial text contained within a control (if appropriate).ControlTypeNIdentifierThe type of the control.ControlWidthN032767Width of the bounding rectangle of the control.ControlXN032767Horizontal coordinate of the upper left corner of the bounding rectangle of the control.ControlYN032767Vertical coordinate of the upper left corner of the bounding rectangle of the control.ControlConditionActionNDefault;Disable;Enable;Hide;ShowThe desired action to be taken on the specified control.ControlConditionConditionNConditionA standard conditional statement that specifies under which conditions the action should be triggered.ControlConditionControl_NControl2IdentifierA foreign key to the Control table, name of the control.ControlConditionDialog_NDialog1IdentifierA foreign key to the Dialog table, name of the dialog.ControlEventArgumentNFormattedA value to be used as a modifier when triggering a particular event.ControlEventConditionYConditionA standard conditional statement that specifies under which conditions an event should be triggered.ControlEventControl_NControl2IdentifierA foreign key to the Control table, name of the controlControlEventDialog_NDialog1IdentifierA foreign key to the Dialog table, name of the dialog.ControlEventEventNFormattedAn identifier that specifies the type of the event that should take place when the user interacts with control specified by the first two entries.ControlEventOrderingY02147483647An integer used to order several events tied to the same control. Can be left blank.CreateFolderComponent_NComponent1IdentifierForeign key into the Component table.CreateFolderDirectory_NDirectory1IdentifierPrimary key, could be foreign key into the Directory table.CustomActionActionNIdentifierPrimary key, name of action, normally appears in sequence table unless private use.CustomActionExtendedTypeY02147483647The numeric custom action type info flags.CustomActionISCommentsYTextAuthor’s comments for this custom action.CustomActionSourceYCustomSourceThe table reference of the source of the code.CustomActionTargetYISDLLWrapper;ISInstallScriptAction1FormattedExcecution parameter, depends on the type of custom actionCustomActionTypeN132767The numeric custom action type, consisting of source location, code type, entry, option flags.DialogAttributesY02147483647A 32-bit word that specifies the attribute flags to be applied to this dialog.DialogControl_CancelYControl2IdentifierDefines the cancel control. Hitting escape or clicking on the close icon on the dialog is equivalent to pushing this button.DialogControl_DefaultYControl2IdentifierDefines the default control. Hitting return is equivalent to pushing this button.DialogControl_FirstNControl2IdentifierDefines the control that has the focus when the dialog is created.DialogDialogNIdentifierName of the dialog.DialogHCenteringN0100Horizontal position of the dialog on a 0-100 scale. 0 means left end, 100 means right end of the screen, 50 center.DialogHeightN032767Height of the bounding rectangle of the dialog.DialogISCommentsYTextAuthor’s comments for this dialog.DialogISResourceIdYA Number the Specifies the Dialog ID to be used in Dialog ExportDialogISWindowStyleYA 32-bit word that specifies non-MSI window styles to be applied to this control. This is only used in Script Based Setups.DialogTextStyle_YIdentifierForeign Key into TextStyle table, only used in Script Based Projects.DialogTitleYFormattedA text string specifying the title to be displayed in the title bar of the dialog's window.DialogVCenteringN0100Vertical position of the dialog on a 0-100 scale. 0 means top end, 100 means bottom end of the screen, 50 center.DialogWidthN032767Width of the bounding rectangle of the dialog.DirectoryDefaultDirNTextThe default sub-path under parent's path.DirectoryDirectoryNIdentifierUnique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.DirectoryDirectory_ParentYDirectory1IdentifierReference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.DirectoryISAttributesY0;1;2;3;4;5;6;7This is used to store Installshield custom properties of a directory. Currently the only one is Shortcut.DirectoryISDescriptionYTextDescription of folderDirectoryISFolderNameYTextThis is used in Pro projects because the pro identifier used in the tree wasn't necessarily unique.DrLocatorDepthY032767The depth below the path to which the Signature_ is recursively searched. If absent, the depth is assumed to be 0.DrLocatorParentYIdentifierThe parent file signature. It is also a foreign key in the Signature table. If null and the Path column does not expand to a full path, then all the fixed drives of the user system are searched using the Path.DrLocatorPathYAnyPathThe path on the user system. This is a either a subpath below the value of the Parent or a full path. The path may contain properties enclosed within [ ] that will be expanded.DrLocatorSignature_NSignature1IdentifierThe Signature_ represents a unique file signature and is also the foreign key in the Signature table.DuplicateFileComponent_NComponent1IdentifierForeign key referencing Component that controls the duplicate file.DuplicateFileDestFolderYIdentifierName of a property whose value is assumed to resolve to the full pathname to a destination folder.DuplicateFileDestNameYTextFilename to be given to the duplicate file.DuplicateFileFileKeyNIdentifierPrimary key used to identify a particular file entryDuplicateFileFile_NFile1IdentifierForeign key referencing the source file to be duplicated.EnvironmentComponent_NComponent1IdentifierForeign key into the Component table referencing component that controls the installing of the environmental value.EnvironmentEnvironmentNIdentifierUnique identifier for the environmental variable settingEnvironmentNameNTextThe name of the environmental value.EnvironmentValueYFormattedThe value to set in the environmental settings.ErrorErrorN032767Integer error number, obtained from header file IError(...) macros.ErrorMessageYTemplateError formatting template, obtained from user ed. or localizers.EventMappingAttributeNIdentifierThe name of the control attribute, that is set when this event is received.EventMappingControl_NControl2IdentifierA foreign key to the Control table, name of the control.EventMappingDialog_NDialog1IdentifierA foreign key to the Dialog table, name of the Dialog.EventMappingEventNIdentifierAn identifier that specifies the type of the event that the control subscribes to.ExtensionComponent_NComponent1IdentifierRequired foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent.ExtensionExtensionNTextThe extension associated with the table row.ExtensionFeature_NFeature1IdentifierRequired foreign key into the Feature Table, specifying the feature to validate or install in order for the CLSID factory to be operational.ExtensionMIME_YMIME1TextOptional Context identifier, typically "type/format" associated with the extensionExtensionProgId_YProgId1TextOptional ProgId associated with this extension.FeatureAttributesN0;1;2;4;5;6;8;9;10;16;17;18;20;21;22;24;25;26;32;33;34;36;37;38;48;49;50;52;53;54Feature attributesFeatureDescriptionYTextLonger descriptive text describing a visible feature item.FeatureDirectory_YDirectory1UpperCaseThe name of the Directory that can be configured by the UI. A non-null value will enable the browse button.FeatureDisplayY032767Numeric sort order, used to force a specific display ordering.FeatureFeatureNIdentifierPrimary key used to identify a particular feature record.FeatureFeature_ParentYFeature1IdentifierOptional key of a parent record in the same table. If the parent is not selected, then the record will not be installed. Null indicates a root item.FeatureISCommentsYCommentsFeatureISFeatureCabNameYName of CAB used when compressing CABs by Feature. Used to override build generated name for CAB file.FeatureISProFeatureNameYTextThe name of the feature used by pro projects. This doesn't have to be unique.FeatureISReleaseFlagsYRelease Flags that specify whether this feature will be built in a particular release.FeatureLevelN032767The install level at which record will be initially selected. An install level of 0 will disable an item and prevent its display.FeatureTitleYTextShort text identifying a visible feature item.FeatureComponentsComponent_NComponent1IdentifierForeign key into Component table.FeatureComponentsFeature_NFeature1IdentifierForeign key into Feature table.FileAttributesY032767Integer containing bit flags representing file attributes (with the decimal value of each bit position in parentheses)FileComponent_NComponent1IdentifierForeign key referencing Component that controls the file.FileFileNIdentifierPrimary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.FileFileNameNTextFile name used for installation. This may contain a "short name|long name" pair. It may be just a long name, hence it cannot be of the Filename data type.FileFileSizeN02147483647Size of file in bytes (long integer).FileISAttributesY02147483647This field contains the following attributes: UseSystemSettings(0x1)FileISBuildSourcePathYTextFull path, the category is of Text instead of Path because of potential use of path variables.FileISComponentSubFolder_YIdentifierForeign key referencing component subfolder containing this file. Only for Pro.FileLanguageYLanguageList of decimal language Ids, comma-separated if more than one.FileSequenceN132767Sequence with respect to the media images; order must track cabinet order.FileVersionYFile1VersionVersion string for versioned files; Blank for unversioned files.FileSFPCatalogFile_NFile1IdentifierFile associated with the catalogFileSFPCatalogSFPCatalog_NSFPCatalog1TextCatalog associated with the fileFontFile_NFile1IdentifierPrimary key, foreign key into File table referencing font file.FontFontTitleYTextFont name.ISAssistantTagDataY + ISAssistantTagTagN + ISBillBoardColorY + ISBillBoardDisplayNameY + ISBillBoardDurationN032767 + ISBillBoardEffectN032767 + ISBillBoardFontY + ISBillBoardISBillboardN + ISBillBoardOriginN032767 + ISBillBoardSequenceN-3276732767 + ISBillBoardStyleY + ISBillBoardTargetN032767 + ISBillBoardTitleY + ISBillBoardXN032767 + ISBillBoardYN032767 + ISChainPackageDisplayNameYTextDisplay name for the chained package. Used only in the IDE.ISChainPackageISReleaseFlagsY + ISChainPackageInstallConditionYCondition + ISChainPackageInstallPropertiesYFormatted + ISChainPackageOptionsNInteger + ISChainPackageOrderNInteger + ISChainPackagePackageNIdentifier + ISChainPackageProductCodeY + ISChainPackageRemoveConditionYCondition + ISChainPackageRemovePropertiesYFormatted + ISChainPackageSourcePathY + ISChainPackageDataDataYBinaryBinary stream. The binary icon data in PE (.DLL or .EXE) or icon (.ICO) format.ISChainPackageDataFileNIdentifier + ISChainPackageDataFilePathNFormatted + ISChainPackageDataISBuildSourcePathYTextFull path to the ICO or EXE file.ISChainPackageDataOptionsY + ISChainPackageDataPackage_NISChainPackage1Identifier + ISClrWrapAction_NCustomAction1IdentifierForeign key into CustomAction tableISClrWrapNameNTextProperty associated with this ActionISClrWrapValueYTextValue associated with this PropertyISComCatalogAttributeISComCatalogObject_NISComCatalogObject1IdentifierForeign key into the ISComCatalogObject table.ISComCatalogAttributeItemNameNTextThe named attribute for a catalog object.ISComCatalogAttributeItemValueYTextA value associated with the attribute defined in the ItemName column.ISComCatalogCollectionCollectionNameNTextA catalog collection name.ISComCatalogCollectionISComCatalogCollectionNIdentifierA unique key for the ISComCatalogCollection table.ISComCatalogCollectionISComCatalogObject_NISComCatalogObject1IdentifierForeign key into the ISComCatalogObject table.ISComCatalogCollectionObjectsISComCatalogCollection_NISComCatalogCollection1IdentifierA unique key for the ISComCatalogCollection table.ISComCatalogCollectionObjectsISComCatalogObject_NISComCatalogObject1IdentifierForeign key into the ISComCatalogObject table.ISComCatalogObjectDisplayNameNThe display name of a catalog object.ISComCatalogObjectISComCatalogObjectNIdentifierA unique key for the ISComCatalogObject table.ISComPlusApplicationComponent_NComponent1IdentifierForeign key into the Component table that a COM+ application belongs to.ISComPlusApplicationComputerNameYTextComputer name that a COM+ application belongs to.ISComPlusApplicationDepFilesYTextList of the dependent files.ISComPlusApplicationISAttributesYInstallShield custom attributes associated with a COM+ application.ISComPlusApplicationISComCatalogObject_NISComCatalogObject1IdentifierForeign key into the ISComCatalogObject table.ISComPlusApplicationDLLAlterDLLYTextAlternate filename of the COM+ application component. Will be used for a .NET serviced component.ISComPlusApplicationDLLCLSIDNTextCLSID of the COM+ application component.ISComPlusApplicationDLLDLLYTextFilename of the COM+ application component.ISComPlusApplicationDLLISComCatalogObject_NISComCatalogObject1IdentifierForeign key into the ISComCatalogObject table.ISComPlusApplicationDLLISComPlusApplicationDLLNIdentifierA unique key for the ISComPlusApplicationDLL table.ISComPlusApplicationDLLISComPlusApplication_NISComPlusApplication1IdentifierForeign key into the ISComPlusApplication table.ISComPlusApplicationDLLProgIdYTextProgId of the COM+ application component.ISComPlusProxyComponent_YComponent1IdentifierForeign key into the Component table that a COM+ application proxy belongs to.ISComPlusProxyDepFilesYTextList of the dependent files.ISComPlusProxyISAttributesYInstallShield custom attributes associated with a COM+ application proxy.ISComPlusProxyISComPlusApplication_NISComPlusApplication1IdentifierForeign key into the ISComPlusApplication table that a COM+ application proxy belongs to.ISComPlusProxyISComPlusProxyNIdentifierA unique key for the ISComPlusProxy table.ISComPlusProxyDepFileFile_NFile1IdentifierForeign key into the File table.ISComPlusProxyDepFileISComPlusApplication_NISComPlusApplication1IdentifierForeign key into the ISComPlusApplication table.ISComPlusProxyDepFileISPathYTextFull path of the dependent file.ISComPlusProxyFileFile_NFile1IdentifierForeign key into the File table.ISComPlusProxyFileISComPlusApplicationDLL_NISComPlusApplicationDLL1IdentifierForeign key into the ISComPlusApplicationDLL table.ISComPlusServerDepFileFile_NFile1IdentifierForeign key into the File table.ISComPlusServerDepFileISComPlusApplication_NISComPlusApplication1IdentifierForeign key into the ISComPlusApplication table.ISComPlusServerDepFileISPathYTextFull path of the dependent file.ISComPlusServerFileFile_NFile1IdentifierForeign key into the File table.ISComPlusServerFileISComPlusApplicationDLL_NISComPlusApplicationDLL1IdentifierForeign key into the ISComPlusApplicationDLL table.ISComponentExtendedComponent_NComponent1IdentifierPrimary key used to identify a particular component record.ISComponentExtendedFTPLocationYTextFTP LocationISComponentExtendedFilterPropertyNIdentifierProperty to set if you want to filter a componentISComponentExtendedHTTPLocationYTextHTTP LocationISComponentExtendedLanguageYTextLanguageISComponentExtendedMiscellaneousYTextMiscellaneousISComponentExtendedOSYbitwise addition of OSsISComponentExtendedPlatformsYbitwise addition of Platforms.ISCustomActionReferenceAction_NCustomAction1IdentifierForeign key into theICustomAction table.ISCustomActionReferenceDescriptionYTextContents of the file speciifed in ISCAReferenceFilePath. This column is only used by MSI.ISCustomActionReferenceFileTypeYTextfile type of the file specified ISCAReferenceFilePath. This column is only used by MSI.ISCustomActionReferenceISCAReferenceFilePathYTextFull path, the category is of Text instead of Path because of potential use of path variables. This column only exists in ISM.ISDIMDependencyISDIMReference_NIdentifierThis is the primary key to the ISDIMDependency tableISDIMDependencyRequiredBuildVersionYTextthe build version identifying the required DIMISDIMDependencyRequiredMajorVersionYTextthe major version identifying the required DIMISDIMDependencyRequiredMinorVersionYTextthe minor version identifying the required DIMISDIMDependencyRequiredRevisionVersionYTextthe revision version identifying the required DIMISDIMDependencyRequiredUUIDNTextthe UUID identifying the required DIMISDIMReferenceISBuildSourcePathYTextFull path, the category is of Text instead of Path because of potential use of path variables.ISDIMReferenceISDIMReferenceNISDIMDependency1IdentifierThis is the primary key to the ISDIMReference tableISDIMReferenceDependenciesISDIMDependency_NISDIMDependency1IdentifierForeign key into ISDIMDependency table.ISDIMReferenceDependenciesISDIMReference_ParentNISDIMReference1IdentifierForeign key into ISDIMReference table.ISDIMVariableISDIMReference_NISDIMReference1IdentifierForeign key into ISDIMReference table.ISDIMVariableISDIMVariableNIdentifierThis is the primary key to the ISDIMVariable tableISDIMVariableNameNTextName of a variable defined in the .dim fileISDIMVariableNewValueYTextNew value that you want to override withISDIMVariableTypeYType of the variable. 0: Build Variable, 1: Runtime VariableISDLLWrapperEntryPointNTextThis is a foreign key to the target column in the CustomAction tableISDLLWrapperSourceNFormattedThis is column points to the source file for the DLLWrapper Custom ActionISDLLWrapperTargetNTextThe function signatureISDLLWrapperTypeYTypeISDRMFileFile_YFile1IdentifierForeign key into File table. A null value will cause a build warning.ISDRMFileISDRMFileNIdentifierUnique identifier for this item.ISDRMFileISDRMLicense_YISDRMLicense1IdentifierForeign key referencing License that packages this file.ISDRMFileShellNTextText indicating the activation shell used at runtime.ISDRMFileAttributeISDRMFile_NISDRMFile1IdentifierPrimary foreign key into ISDRMFile table.ISDRMFileAttributePropertyNTextThe name of the attributeISDRMFileAttributeValueYTextThe value of the attributeISDRMLicenseAttributesYNumberBitwise field used to specify binary attributes of this license.ISDRMLicenseDescriptionYTextAn internal description of this license.ISDRMLicenseISDRMLicenseNIdentifierUnique key identifying the license record.ISDRMLicenseLicenseNumberYTextThe license number.ISDRMLicenseProjectVersionYTextThe version of the project that this license is tied to.ISDRMLicenseRequestCodeYTextThe request code.ISDRMLicenseResponseCodeYTextThe response code.ISDependencyExcludeY + ISDependencyISDependencyY + ISDisk1FileDiskY-1;0;1Used to differentiate between disk1(1), last disk(-1), and other(0).ISDisk1FileISBuildSourcePathNTextFull path of file to be copied to Disk1 folderISDisk1FileISDisk1FileNIdentifierPrimary key for ISDisk1File tableISDynamicFileComponent_NComponent1IdentifierForeign key referencing Component that controls the file.ISDynamicFileExcludeFilesYTextWildcards for excluded files.ISDynamicFileISAttributesY0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15This is used to store Installshield custom properties of a dynamic filet. Currently the only one is SelfRegister.ISDynamicFileIncludeFilesYTextWildcards for included files.ISDynamicFileIncludeFlagsYInclude flags.ISDynamicFileSourceFolderNTextFull path, the category is of Text instead of Path because of potential use of path variables.ISFeatureDIMReferencesFeature_NFeature1IdentifierForeign key into Feature table.ISFeatureDIMReferencesISDIMReference_NISDIMReference1IdentifierForeign key into ISDIMReference table.ISFeatureMergeModuleExcludesFeature_NIdentifierForeign key into Feature table.ISFeatureMergeModuleExcludesLanguageNForeign key into ISMergeModule table.ISFeatureMergeModuleExcludesModuleIDNIdentifierForeign key into ISMergeModule table.ISFeatureMergeModulesFeature_NFeature1IdentifierForeign key into Feature table.ISFeatureMergeModulesISMergeModule_NISMergeModule1TextForeign key into ISMergeModule table.ISFeatureMergeModulesLanguage_NISMergeModule2Foreign key into ISMergeModule table.ISFeatureSetupPrerequisitesFeature_NFeature1IdentifierForeign key into Feature table.ISFeatureSetupPrerequisitesISSetupPrerequisites_NISSetupPrerequisites1 + ISFileManifestsFile_NIdentifierForeign key into File table.ISFileManifestsManifest_NIdentifierForeign key into File table.ISIISItemComponent_YComponent1IdentifierForeign key to Component table.ISIISItemDisplayNameYTextLocalizable Item Name.ISIISItemISIISItemNIdentifierPrimary key for each item.ISIISItemISIISItem_ParentYISIISItem1IdentifierThis record's parent record.ISIISItemTypeNIIS resource type.ISIISPropertyFriendlyNameYTextIIS property name.ISIISPropertyISAttributesYFlags.ISIISPropertyISIISItem_NISIISItem1IdentifierPrimary key for table, foreign key into ISIISItem.ISIISPropertyISIISPropertyNIdentifierPrimary key for table.ISIISPropertyMetaDataAttributesYIIS property attributes.ISIISPropertyMetaDataPropYIIS property ID.ISIISPropertyMetaDataTypeYIIS property data type.ISIISPropertyMetaDataUserTypeYIIS property user data type.ISIISPropertyMetaDataValueYTextIIS property value.ISIISPropertyOrderYOrder sequencing.ISIISPropertySchemaYTextIIS7 schema information.ISInstallScriptActionEntryPointNTextThis is a foreign key to the target column in the CustomAction tableISInstallScriptActionSourceNFormattedThis is column points to the source file for the DLLWrapper Custom ActionISInstallScriptActionTargetYTextThe function signatureISInstallScriptActionTypeYTypeISLanguageISLanguageNTextThis is the language ID.ISLanguageIncludedY0;1Specify whether this language should be included.ISLinkerLibraryISLinkerLibraryNIdentifierUnique identifier for the link library.ISLinkerLibraryLibraryNTextFull path of the object library (.obl file).ISLinkerLibraryOrderNOrder of the LibraryISLocalControlAttributesYA 32-bit word that specifies the attribute flags to be applied to this control.ISLocalControlBinary_YBinary1IdentifierExternal key to the Binary table.ISLocalControlControl_NControl2IdentifierName of the control. This name must be unique within a dialog, but can repeat on different dialogs.ISLocalControlDialog_NDialog1IdentifierExternal key to the Dialog table, name of the dialog.ISLocalControlHeightYHeight of the bounding rectangle of the control.ISLocalControlISBuildSourcePathYTextFull path to .rtf file for scrollable text controlISLocalControlISLanguage_NISLanguage1TextThis is a foreign key to the ISLanguage table.ISLocalControlWidthYWidth of the bounding rectangle of the control.ISLocalControlXYHorizontal coordinate of the upper left corner of the bounding rectangle of the control.ISLocalControlYYVertical coordinate of the upper left corner of the bounding rectangle of the control.ISLocalDialogAttributesYA 32-bit word that specifies the attribute flags to be applied to this dialog.ISLocalDialogDialog_YDialog1IdentifierName of the dialog.ISLocalDialogHeightN032767Height of the bounding rectangle of the dialog.ISLocalDialogISLanguage_YISLanguage1TextThis is a foreign key to the ISLanguage table.ISLocalDialogTextStyle_YIdentifierForeign Key into TextStyle table, only used in Script Based Projects.ISLocalDialogWidthN032767Width of the bounding rectangle of the dialog.ISLocalRadioButtonHeightN032767The height of the button.ISLocalRadioButtonISLanguage_NISLanguage1TextThis is a foreign key to the ISLanguage table.ISLocalRadioButtonOrderN132767RadioButton2A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.ISLocalRadioButtonPropertyNRadioButton1IdentifierA named property to be tied to this radio button. All the buttons tied to the same property become part of the same group.ISLocalRadioButtonWidthN032767The width of the button.ISLocalRadioButtonXN032767The horizontal coordinate of the upper left corner of the bounding rectangle of the radio button.ISLocalRadioButtonYN032767The vertical coordinate of the upper left corner of the bounding rectangle of the radio button.ISLockPermissionsAttributesY-21474836472147483647Permissions attributes mask, 1==Deny access; 2==No inherit, 4==Ignore apply failures, 8==Target object is 64-bitISLockPermissionsDomainYTextDomain name for user whose permissions are being set.ISLockPermissionsLockObjectNIdentifierForeign key into CreateFolder, Registry, or File tableISLockPermissionsPermissionY-21474836472147483647Permission Access mask.ISLockPermissionsTableNIdentifierCreateFolder;File;RegistryReference to another table nameISLockPermissionsUserNTextUser for permissions to be set. This can be a property, hardcoded named, or SID stringISLogicalDiskCabinetYCabinetIf some or all of the files stored on the media are compressed in a cabinet, the name of that cabinet.ISLogicalDiskDiskIdN132767Primary key, integer to determine sort order for table.ISLogicalDiskDiskPromptYTextDisk name: the visible text actually printed on the disk. This will be used to prompt the user when this disk needs to be inserted.ISLogicalDiskISProductConfiguration_NISProductConfiguration1TextForeign key into the ISProductConfiguration table.ISLogicalDiskISRelease_NISRelease1TextForeign key into the ISRelease table.ISLogicalDiskLastSequenceN032767File sequence number for the last file for this media.ISLogicalDiskSourceYPropertyThe property defining the location of the cabinet file.ISLogicalDiskVolumeLabelYTextThe label attributed to the volume.ISLogicalDiskFeaturesFeature_YFeature1IdentifierRequired foreign key into the Feature Table,ISLogicalDiskFeaturesISAttributesYThis is used to store Installshield custom properties, like Compressed, etc.ISLogicalDiskFeaturesISLogicalDisk_N132767ISLogicalDisk1IdentifierForeign key into the ISLogicalDisk table.ISLogicalDiskFeaturesISProductConfiguration_NISProductConfiguration1TextForeign key into the ISProductConfiguration table.ISLogicalDiskFeaturesISRelease_NISRelease1TextForeign key into the ISRelease table.ISLogicalDiskFeaturesSequenceN032767File sequence number for the file for this media.ISMergeModuleDestinationYTextDestination.ISMergeModuleISAttributesYThis is used to store Installshield custom properties of a merge module.ISMergeModuleISMergeModuleNTextThe GUID identifying the merge module.ISMergeModuleLanguageNDefault decimal language of module.ISMergeModuleNameNTextName of the merge module.ISMergeModuleCfgValuesAttributesYAttributes (from configurable merge module)ISMergeModuleCfgValuesContextDataYTextContextData (from configurable merge module)ISMergeModuleCfgValuesDefaultValueYTextDefaultValue (from configurable merge module)ISMergeModuleCfgValuesDescriptionYTextDescription (from configurable merge module)ISMergeModuleCfgValuesDisplayNameYTextDisplayName (from configurable merge module)ISMergeModuleCfgValuesFormatNFormat (from configurable merge module)ISMergeModuleCfgValuesHelpKeywordYTextHelpKeyword (from configurable merge module)ISMergeModuleCfgValuesHelpLocationYTextHelpLocation (from configurable merge module)ISMergeModuleCfgValuesISMergeModule_NISMergeModule1TextThe module signature, a foreign key into the ISMergeModule tableISMergeModuleCfgValuesLanguage_NISMergeModule2Default decimal language of module.ISMergeModuleCfgValuesModuleConfiguration_NIdentifierIdentifier, foreign key into ModuleConfiguration table (ModuleConfiguration.Name)ISMergeModuleCfgValuesTypeYTextType (from configurable merge module)ISMergeModuleCfgValuesValueYTextValue for this item.ISObjectLanguageNText + ISObjectObjectNameNText + ISObjectPropertyIncludeInBuildYBoolean, 0 for false non 0 for trueISObjectPropertyObjectNameYISObject1Text + ISObjectPropertyPropertyYText + ISObjectPropertyValueYText + ISPatchConfigImagePatchConfiguration_YISPatchConfiguration1TextForeign key to the ISPatchConfigurationTableISPatchConfigImageUpgradedImage_NISUpgradedImage1TextForeign key to the ISUpgradedImageTableISPatchConfigurationAttributesYPatchConfiguration attributesISPatchConfigurationCanPCDifferNThis is determine whether Product Codes may differISPatchConfigurationCanPVDifferNThis is determine whether the Major Product Version may differISPatchConfigurationEnablePatchCacheNThis is determine whether to Enable Patch cacheingISPatchConfigurationFlagsNPatching API FlagsISPatchConfigurationIncludeWholeFilesNThis is determine whether to build a binary level patchISPatchConfigurationLeaveDecompressedNThis is determine whether to leave intermediate files devcompressed when finishedISPatchConfigurationMinMsiVersionNMinimum Required MSI VersionISPatchConfigurationNameNTextName of the Patch ConfigurationISPatchConfigurationOptimizeForSizeNThis is determine whether to Optimize for large filesISPatchConfigurationOutputPathNTextBuild LocationISPatchConfigurationPatchCacheDirYTextDirectory to recieve the Patch Cache informationISPatchConfigurationPatchGuidNTextUnique Patch IdentifierISPatchConfigurationPatchGuidsToReplaceYTextList Of Patch Guids to unregisterISPatchConfigurationTargetProductCodesNTextList Of target Product CodesISPatchConfigurationPropertyISPatchConfiguration_YISPatchConfiguration1TextName of the Patch ConfigurationISPatchConfigurationPropertyPropertyYTextName of the Patch Configuration Property valueISPatchConfigurationPropertyValueYTextValue of the Patch Configuration PropertyISPatchExternalFileFileKeyNTextFilekeyISPatchExternalFileFilePathNTextFilepathISPatchExternalFileISUpgradedImage_NISUpgradedImage1TextForeign key to the isupgraded image tableISPatchExternalFileNameNTextUniqu name to identify this record.ISPatchWholeFileComponentYTextComponent containing file keyISPatchWholeFileFileKeyNTextKey of file to be included as wholeISPatchWholeFileUpgradedImageNISUpgradedImage1TextForeign key to ISUpgradedImage TableISPathVariableISPathVariableNThe name of the path variable.ISPathVariableTestValueYTextThe test value of the path variable.ISPathVariableTypeN1;2;4;8The type of the path variable.ISPathVariableValueYTextThe value of the path variable.ISPowerShellWrapAction_NCustomAction1IdentifierForeign key into CustomAction tableISPowerShellWrapNameNTextProperty associated with this ActionISPowerShellWrapValueYTextValue associated with this PropertyISProductConfigurationGeneratePackageCodeYNumber0;1Indicates whether or not to generate a package code.ISProductConfigurationISProductConfigurationNTextThe name of the product configuration.ISProductConfigurationProductConfigurationFlagsYTextProduct configuration (release) flags.ISProductConfigurationInstanceISProductConfiguration_NISProductConfiguration1TextForeign key into the ISProductConfiguration table.ISProductConfigurationInstanceInstanceIdN032767Identifies the instance number of this instance. This value is stored in the Property InstanceId.ISProductConfigurationInstancePropertyNTextProduct Congiuration property nameISProductConfigurationInstanceValueNTextString value for property.ISProductConfigurationPropertyISProductConfiguration_NISProductConfiguration1TextForeign key into the ISProductConfiguration table.ISProductConfigurationPropertyPropertyNProperty1TextProduct Congiuration property nameISProductConfigurationPropertyValueYTextString value for property. Never null or empty.ISReleaseAttributesNBitfield holding boolean values for various release attributes.ISReleaseBuildLocationNTextBuild location.ISReleaseCDBrowserYTextDemoshield browser location.ISReleaseDefaultLanguageNTextDefault language for setup.ISReleaseDigitalPVKYTextDigital signing private key (.pvk) file.ISReleaseDigitalSPCYTextDigital signing Software Publisher Certificate (.spc) file.ISReleaseDigitalURLYTextDigital signing URL.ISReleaseDiskClusterSizeNDisk cluster size.ISReleaseDiskSizeNTextDisk size.ISReleaseDiskSizeUnitN0;1;2Disk size units (KB or MB).ISReleaseDiskSpanningN0;1;2Disk spanning (automatic, enforce size, etc.).ISReleaseDotNetBuildConfigurationYTextBuild Configuration for .NET solutions.ISReleaseISProductConfiguration_NISProductConfiguration1TextForeign key into the ISProductConfiguration table.ISReleaseISReleaseNTextThe name of the release.ISReleaseISSetupPrerequisiteLocationY0;1;2;3Location the Setup Prerequisites will be placed inISReleaseMediaLocationNTextMedia location on disk.ISReleaseMsiCommandLineYTextCommand line passed to the msi package from setup.exeISReleaseMsiSourceTypeN-14MSI media source type.ISReleasePackageNameNTextPackage name.ISReleasePasswordYTextPassword.ISReleasePlatformsNTextPlatforms supported (Intel, Alpha, etc.).ISReleaseReleaseFlagsYTextRelease flags.ISReleaseReleaseTypeN1;2;4Release type (single, uncompressed, etc.).ISReleaseSupportedLanguagesDataYTextLanguages supported (for component filtering).ISReleaseSupportedLanguagesUINTextUI languages supported.ISReleaseSupportedOSsNIndicate which operating systmes are supported.ISReleaseSynchMsiYTextMSI file to synchronize file keys and other data with (patch-like functionality).ISReleaseTypeN06Release type (CDROM, Network, etc.).ISReleaseURLLocationYTextMedia location via URL.ISReleaseVersionCopyrightYTextVersion stamp information.ISReleaseASPublishInfoISProductConfiguration_NISProductConfiguration1TextForeign key into the ISProductConfiguration table.ISReleaseASPublishInfoISRelease_NISRelease1TextForeign key into the ISRelease table.ISReleaseASPublishInfoPropertyYTextAS Repository property nameISReleaseASPublishInfoValueYTextAS Repository property valueISReleaseExtendedAttributesYBitfield holding boolean values for various release attributes.ISReleaseExtendedCertPasswordYTextDigital certificate passwordISReleaseExtendedDigitalCertificateDBaseNSYTextPath to cerificate database for Netscape digital signatureISReleaseExtendedDigitalCertificateIdNSYTextPath to cerificate ID for Netscape digital signatureISReleaseExtendedDigitalCertificatePasswordNSYTextPassword for Netscape digital signatureISReleaseExtendedDotNetBaseLanguageYTextBase Languge of .NET RedistISReleaseExtendedDotNetFxCmdLineYTextCommand Line to pass to DotNetFx.exeISReleaseExtendedDotNetLangPackCmdLineYTextCommand Line to pass to LangPack.exeISReleaseExtendedDotNetLangaugePacksYText.NET Redist language packs to includeISReleaseExtendedDotNetRedistLocationY03Location of .NET framework Redist (Web, SetupExe, Source, None)ISReleaseExtendedDotNetRedistURLYTextURL to .NET framework RedistISReleaseExtendedDotNetVersionY02Version of .NET framework Redist (1.0, 1.1)ISReleaseExtendedEngineLocationY02Location of msi engine (Web, SetupExe...)ISReleaseExtendedISEngineLocationY02Location of ISScript engine (Web, SetupExe...)ISReleaseExtendedISEngineURLYTextURL to InstallShield scripting engineISReleaseExtendedISProductConfiguration_NTextForeign key into the ISProductConfiguration table.ISReleaseExtendedISRelease_NTextThe name of the release.ISReleaseExtendedJSharpCmdLineYTextCommand Line to pass to vjredist.exeISReleaseExtendedJSharpRedistLocationY03Location of J# framework Redist (Web, SetupExe, Source, None)ISReleaseExtendedMsiEngineVersionYBitfield holding selected MSI engine versions included in this releaseISReleaseExtendedOneClickCabNameYTextFile name of generated cabfileISReleaseExtendedOneClickHtmlNameYTextFile name of generated html pageISReleaseExtendedOneClickTargetBrowserY02Target browser (IE, Netscape, both...)ISReleaseExtendedWebCabSizeY02147483647Size of the cabfileISReleaseExtendedWebLocalCachePathYTextDirectory to cache downloaded packageISReleaseExtendedWebTypeY02Type of web install (One Executable, Downloader...)ISReleaseExtendedWebURLYTextURL to .msi packageISReleaseExtendedWin9xMsiUrlYTextURL to Ansi MSI engineISReleaseExtendedWinMsi30UrlYTextURL to MSI 3.0 engineISReleaseExtendedWinNTMsiUrlYTextURL to Unicode MSI engineISReleasePropertyISProductConfiguration_NTextForeign key into ISProductConfiguration table.ISReleasePropertyISRelease_NTextForeign key into ISRelease table.ISReleasePropertyNameNProperty nameISReleasePropertyValueNProperty valueISReleasePublishInfoDescriptionYTextRepository item descriptionISReleasePublishInfoDisplayNameYTextRepository item display nameISReleasePublishInfoISAttributesYBitfield holding various attributesISReleasePublishInfoISProductConfiguration_NISProductConfiguration1TextForeign key into the ISProductConfiguration table.ISReleasePublishInfoISRelease_NISRelease1TextThe name of the release.ISReleasePublishInfoPublisherYTextRepository item publisherISReleasePublishInfoRepositoryYTextRepository which to publish the built merge moduleISSQLConnectionAttributesN + ISSQLConnectionAuthenticationN + ISSQLConnectionBatchSeparatorY + ISSQLConnectionCmdTimeoutY + ISSQLConnectionCommentsY + ISSQLConnectionDatabaseN + ISSQLConnectionISSQLConnectionNIdentifierPrimary key used to identify a particular ISSQLConnection record.ISSQLConnectionOrderN + ISSQLConnectionPasswordN + ISSQLConnectionScriptVersion_ColumnY + ISSQLConnectionScriptVersion_TableY + ISSQLConnectionServerN + ISSQLConnectionUserNameN + ISSQLConnectionDBServerISSQLConnectionDBServerNIdentifierPrimary key used to identify a particular ISSQLConnectionDBServer record.ISSQLConnectionDBServerISSQLConnection_NISSQLConnection1IdentifierForeign key into ISSQLConnection table.ISSQLConnectionDBServerISSQLDBMetaData_NISSQLDBMetaData1IdentifierForeign key into ISSQLDBMetaData table.ISSQLConnectionDBServerOrderN + ISSQLConnectionScriptISSQLConnection_NISSQLConnection1IdentifierForeign key into ISSQLConnection table.ISSQLConnectionScriptISSQLScriptFile_NISSQLScriptFile1IdentifierForeign key into ISSQLScriptFile table.ISSQLConnectionScriptOrderN + ISSQLDBMetaDataAdoCxnAdditionalY + ISSQLDBMetaDataAdoCxnDatabaseY + ISSQLDBMetaDataAdoCxnDriverY + ISSQLDBMetaDataAdoCxnNetLibraryY + ISSQLDBMetaDataAdoCxnPasswordY + ISSQLDBMetaDataAdoCxnPortY + ISSQLDBMetaDataAdoCxnServerY + ISSQLDBMetaDataAdoCxnUserIDY + ISSQLDBMetaDataAdoCxnWindowsSecurityY + ISSQLDBMetaDataAdoDriverNameY + ISSQLDBMetaDataCreateDbCmdY + ISSQLDBMetaDataCreateTableCmdY + ISSQLDBMetaDataDisplayNameY + ISSQLDBMetaDataDsnODBCNameY + ISSQLDBMetaDataISAttributesY + ISSQLDBMetaDataISSQLDBMetaDataNIdentifierPrimary key used to identify a particular ISSQLDBMetaData record.ISSQLDBMetaDataInsertRecordCmdY + ISSQLDBMetaDataLocalInstanceNamesY + ISSQLDBMetaDataQueryDatabasesCmdY + ISSQLDBMetaDataScriptVersion_ColumnY + ISSQLDBMetaDataScriptVersion_ColumnTypeY + ISSQLDBMetaDataScriptVersion_TableY + ISSQLDBMetaDataSelectTableCmdY + ISSQLDBMetaDataSwitchDbCmdY + ISSQLDBMetaDataTestDatabaseCmdY + ISSQLDBMetaDataTestTableCmdY + ISSQLDBMetaDataTestTableCmd2Y + ISSQLDBMetaDataVersionBeginTokenY + ISSQLDBMetaDataVersionEndTokenY + ISSQLDBMetaDataVersionInfoCmdY + ISSQLDBMetaDataWinAuthentUserIdY + ISSQLRequirementAttributesN + ISSQLRequirementISSQLConnectionDBServer_YISSQLConnectionDBServer1IdentifierForeign key into ISSQLConnectionDBServer table.ISSQLRequirementISSQLConnection_NISSQLConnection1IdentifierForeign key into ISSQLConnection table.ISSQLRequirementISSQLRequirementNIdentifierPrimary key used to identify a particular ISSQLRequirement record.ISSQLRequirementMajorVersionY + ISSQLRequirementServicePackLevelY + ISSQLScriptErrorAttributesN + ISSQLScriptErrorErrHandlingN + ISSQLScriptErrorErrNumberN + ISSQLScriptErrorISSQLScriptFile_YISSQLScriptFile1IdentifierForeign key into ISSQLScriptFile tableISSQLScriptErrorMessageYTextCustom end-user message. Reserved for future use.ISSQLScriptFileAttributesN + ISSQLScriptFileCommentsYTextCommentsISSQLScriptFileComponent_NComponent1IdentifierForeign key referencing Component that controls the SQL script.ISSQLScriptFileConditionYConditionA conditional statement that will disable this script if the specified condition evaluates to the 'False' state. If a script is disabled, it will not be installed regardless of the 'Action' state associated with the component.ISSQLScriptFileDisplayNameYTextDisplay name for the SQL script file.ISSQLScriptFileErrorHandlingN + ISSQLScriptFileISBuildSourcePathYTextFull path, the category is of Text instead of Path because of potential use of path variables.ISSQLScriptFileISSQLScriptFileNIdentifierThis is the primary key to the ISSQLScriptFile tableISSQLScriptFileInstallTextYTextFeedback end-user text at installISSQLScriptFileSchedulingN + ISSQLScriptFileUninstallTextYTextFeedback end-user text at UninstallISSQLScriptFileVersionYTextSchema Version (#####.#####.#####.#####)ISSQLScriptImportAttributesN + ISSQLScriptImportAuthenticationN + ISSQLScriptImportDatabaseY + ISSQLScriptImportExcludeTablesY + ISSQLScriptImportISSQLScriptFile_NISSQLScriptFile1IdentifierForeign key into ISSQLScriptFile table.ISSQLScriptImportIncludeTablesY + ISSQLScriptImportPasswordY + ISSQLScriptImportServerY + ISSQLScriptImportUserNameY + ISSQLScriptReplaceAttributesN + ISSQLScriptReplaceISSQLScriptFile_NISSQLScriptFile1IdentifierForeign key into ISSQLScriptFile table.ISSQLScriptReplaceISSQLScriptReplaceNIdentifierPrimary key used to identify a particular ISSQLScriptReplace record.ISSQLScriptReplaceReplaceY + ISSQLScriptReplaceSearchY + ISScriptFileISScriptFileNTextThis is the full path of the script file. The path portion may be expressed in path variable form.ISSelfRegCmdLineY + ISSelfRegCostY + ISSelfRegFileKeyNFile1IdentifierForeign key to the file tableISSelfRegOrderY + ISSetupFileFileNameYTextThis is the file name to use when streaming the file to the support files locationISSetupFileISSetupFileNIdentifierThis is the primary key to the ISSetupFile tableISSetupFileLanguageYTextFour digit language identifier. 0 for Language NeutralISSetupFilePathYTextLink to the source file on the build machineISSetupFileSplashYShortBoolean value indication whether his setup file entry belongs in the Splasc Screen sectionISSetupFileStreamYBinaryBinary stream. The bits to stream to the support locationISSetupPrerequisitesISBuildSourcePathY + ISSetupPrerequisitesISReleaseFlagsYRelease Flags that specify whether this prereq will be included in a particular release.ISSetupPrerequisitesISSetupLocationY0;1;2 + ISSetupPrerequisitesISSetupPrerequisitesN + ISSetupPrerequisitesOrderY + ISSetupTypeCommentsYTextUser Comments.ISSetupTypeDescriptionYTextLonger descriptive text describing a visible feature item.ISSetupTypeDisplayN032767Numeric sort order, used to force a specific display ordering.ISSetupTypeDisplay_NameYFormattedA string used to set the initial text contained within a control (if appropriate).ISSetupTypeISSetupTypeNIdentifierPrimary key used to identify a particular feature record.ISSetupTypeFeaturesFeature_NFeature1IdentifierForeign key into Feature table.ISSetupTypeFeaturesISSetupType_NISSetupType1IdentifierForeign key into ISSetupType table.ISStoragesISBuildSourcePathYPath to the file to stream into sub-storageISStoragesNameNName of the sub-storage keyISStringCommentYTextCommentISStringEncodedYEncoding for multi-byte strings.ISStringISLanguage_NTextThis is a foreign key to the ISLanguage table.ISStringISStringNTextString id.ISStringTimeStampYTime/DateTime Stamp. MSI's Time/Date column type is just an int, with bits packed in a certain order.ISStringValueYTextreal string value.ISSwidtagPropertyNameNIdentifierProperty nameISSwidtagPropertyValueNTextProperty valueISTargetImageFlagsYrelative order of the target imageISTargetImageIgnoreMissingFilesNIf true, ignore missing source files when creating patchISTargetImageMsiPathNTextPath to the target imageISTargetImageNameNIdentifierName of the TargetImageISTargetImageOrderNrelative order of the target imageISTargetImageUpgradedImage_NISUpgradedImage1Textforeign key to the upgraded Image tableISUpgradeMsiItemISAttributesN0;1 + ISUpgradeMsiItemISReleaseFlagsY + ISUpgradeMsiItemObjectSetupPathNTextThe path to the setup you want to upgrade.ISUpgradeMsiItemUpgradeItemNTextThe name of the Upgrade Item.ISUpgradedImageFamilyNTextName of the image familyISUpgradedImageMsiPathNTextPath to the upgraded imageISUpgradedImageNameNIdentifierName of the UpgradedImageISVirtualDirectoryDirectory_NDirectory1IdentifierForeign key into Directory table.ISVirtualDirectoryNameNIdentifierProperty nameISVirtualDirectoryValueNProperty valueISVirtualFileFile_NFile1IdentifierForeign key into File table.ISVirtualFileNameNIdentifierProperty nameISVirtualFileValueNProperty valueISVirtualPackageNameNIdentifierProperty nameISVirtualPackageValueNProperty valueISVirtualRegistryNameNIdentifierProperty nameISVirtualRegistryRegistry_NRegistry1IdentifierForeign key into Registry table.ISVirtualRegistryValueNProperty valueISVirtualReleaseISProductConfiguration_NTextForeign key into ISProductConfiguration table.ISVirtualReleaseISRelease_NTextForeign key into ISRelease table.ISVirtualReleaseNameNProperty nameISVirtualReleaseValueNProperty valueISVirtualShortcutNameNIdentifierProperty nameISVirtualShortcutShortcut_NShortcut1IdentifierForeign key into Shortcut table.ISVirtualShortcutValueNProperty valueISXmlElementContentYTextElement contentsISXmlElementISAttributesYNumberInternal XML element attributesISXmlElementISXmlElementNIdentifierPrimary key, non-localized, internal token for Xml elementISXmlElementISXmlElement_ParentYISXmlElement1IdentifierForeign key into ISXMLElement table.ISXmlElementISXmlFile_NISXmlFile1IdentifierForeign key into XmlFile table.ISXmlElementXPathYTextXPath fragment including any operatorsISXmlElementAttribISAttributesYNumberInternal XML elementattib attributesISXmlElementAttribISXmlElementAttribNIdentifierPrimary key, non-localized, internal token for Xml element attributeISXmlElementAttribISXmlElement_NISXmlElement1IdentifierForeign key into ISXMLElement table.ISXmlElementAttribNameYTextLocalized attribute nameISXmlElementAttribValueYTextLocalized attribute valueISXmlFileComponent_NComponent1IdentifierForeign key into Component table.ISXmlFileDirectoryNIdentifierForeign key into Directory table.ISXmlFileEncodingYTextXML File EncodingISXmlFileFileNameNTextLocalized XML file nameISXmlFileISAttributesYNumberInternal XML file attributesISXmlFileISXmlFileNIdentifierPrimary key, non-localized,internal token for Xml fileISXmlFileSelectionNamespacesYTextSelection namespacesISXmlLocatorAttributeYThe name of an attribute within the XML element.ISXmlLocatorElementYXPath query that will locate an element in an XML file.ISXmlLocatorISAttributesY0;1;2 + ISXmlLocatorParentYIdentifierThe parent file signature. It is also a foreign key in the Signature table.ISXmlLocatorSignature_NIdentifierThe Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, ISXmlLocator, CompLocator and the DrLocator tables.IconDataYBinaryBinary stream. The binary icon data in PE (.DLL or .EXE) or icon (.ICO) format.IconISBuildSourcePathYTextFull path to the ICO or EXE file.IconISIconIndexY-3276732767Optional icon index to be extracted.IconNameNIdentifierPrimary key. Name of the icon file.IniFileActionN0;1;3The type of modification to be made, one of iifEnumIniFileComponent_NComponent1IdentifierForeign key into the Component table referencing component that controls the installing of the .INI value.IniFileDirPropertyYIdentifierForeign key into the Directory table denoting the directory where the .INI file is.IniFileFileNameNTextThe .INI file name in which to write the informationIniFileIniFileNIdentifierPrimary key, non-localized token.IniFileKeyNFormattedThe .INI file key below Section.IniFileSectionNFormattedThe .INI file Section.IniFileValueNFormattedThe value to be written.IniLocatorFieldY032767The field in the .INI line. If Field is null or 0 the entire line is read.IniLocatorFileNameNTextThe .INI file name.IniLocatorKeyNTextKey value (followed by an equals sign in INI file).IniLocatorSectionNTextSection name within in file (within square brackets in INI file).IniLocatorSignature_NSignature1IdentifierThe table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table.IniLocatorTypeY02An integer value that determines if the .INI value read is a filename or a directory location or to be used as is w/o interpretation.InstallExecuteSequenceActionNIdentifierName of action to invoke, either in the engine or the handler DLL.InstallExecuteSequenceConditionYConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.InstallExecuteSequenceISAttributesYThis is used to store MM Custom Action TypesInstallExecuteSequenceISCommentsYTextAuthor’s comments on this Sequence.InstallExecuteSequenceSequenceY-432767Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.InstallShieldPropertyNIdentifierName of property, uppercase if settable by launcher or loader.InstallShieldValueYTextString value for property.InstallUISequenceActionNIdentifierName of action to invoke, either in the engine or the handler DLL.InstallUISequenceConditionYConditionOptional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.InstallUISequenceISAttributesYThis is used to store MM Custom Action TypesInstallUISequenceISCommentsYTextAuthor’s comments on this Sequence.InstallUISequenceSequenceY-432767Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.IsolatedComponentComponent_ApplicationNComponent1IdentifierKey to Component table item for applicationIsolatedComponentComponent_SharedNComponent1IdentifierKey to Component table item to be isolatedLaunchConditionConditionNConditionExpression which must evaluate to TRUE in order for install to commence.LaunchConditionDescriptionNTextLocalizable text to display when condition fails and install must abort.ListBoxOrderN132767A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.ListBoxPropertyNIdentifierA named property to be tied to this item. All the items tied to the same property become part of the same listbox.ListBoxTextYTextThe visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value.ListBoxValueNFormattedThe value string associated with this item. Selecting the line will set the associated property to this value.ListViewBinary_YBinary1IdentifierThe name of the icon to be displayed with the icon. The binary information is looked up from the Binary Table.ListViewOrderN132767A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.ListViewPropertyNIdentifierA named property to be tied to this item. All the items tied to the same property become part of the same listview.ListViewTextYTextThe visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value.ListViewValueNTextThe value string associated with this item. Selecting the line will set the associated property to this value.LockPermissionsDomainYTextDomain name for user whose permissions are being set. (usually a property)LockPermissionsLockObjectNIdentifierForeign key into Registry or File tableLockPermissionsPermissionY-21474836472147483647Permission Access mask. Full Control = 268435456 (GENERIC_ALL = 0x10000000)LockPermissionsTableNIdentifierDirectory;File;RegistryReference to another table nameLockPermissionsUserNTextUser for permissions to be set. (usually a property)MIMECLSIDYClass1GuidOptional associated CLSID.MIMEContentTypeNTextPrimary key. Context identifier, typically "type/format".MIMEExtension_NExtension1TextOptional associated extension (without dot)MediaCabinetYCabinetIf some or all of the files stored on the media are compressed in a cabinet, the name of that cabinet.MediaDiskIdN132767Primary key, integer to determine sort order for table.MediaDiskPromptYTextDisk name: the visible text actually printed on the disk. This will be used to prompt the user when this disk needs to be inserted.MediaLastSequenceN032767File sequence number for the last file for this media.MediaSourceYPropertyThe property defining the location of the cabinet file.MediaVolumeLabelYTextThe label attributed to the volume.MoveFileComponent_NComponent1IdentifierIf this component is not "selected" for installation or removal, no action will be taken on the associated MoveFile entryMoveFileDestFolderNIdentifierName of a property whose value is assumed to resolve to the full path to the destination directoryMoveFileDestNameYTextName to be given to the original file after it is moved or copied. If blank, the destination file will be given the same name as the source fileMoveFileFileKeyNIdentifierPrimary key that uniquely identifies a particular MoveFile recordMoveFileOptionsN01Integer value specifying the MoveFile operating mode, one of imfoEnumMoveFileSourceFolderYIdentifierName of a property whose value is assumed to resolve to the full path to the source directoryMoveFileSourceNameYTextName of the source file(s) to be moved or copied. Can contain the '*' or '?' wildcards.MsiAssemblyAttributesYAssembly attributesMsiAssemblyComponent_NComponent1IdentifierForeign key into Component table.MsiAssemblyFeature_NFeature1IdentifierForeign key into Feature table.MsiAssemblyFile_ApplicationYFile1IdentifierForeign key into File table, denoting the application context for private assemblies. Null for global assemblies.MsiAssemblyFile_ManifestYFile1IdentifierForeign key into the File table denoting the manifest file for the assembly.MsiAssemblyNameComponent_NComponent1IdentifierForeign key into Component table.MsiAssemblyNameNameNTextThe name part of the name-value pairs for the assembly name.MsiAssemblyNameValueNTextThe value part of the name-value pairs for the assembly name.MsiDigitalCertificateCertDataNBinaryA certificate context blob for a signer certificateMsiDigitalCertificateDigitalCertificateNMsiPackageCertificate2IdentifierA unique identifier for the rowMsiDigitalSignatureDigitalCertificate_NMsiDigitalCertificate1IdentifierForeign key to MsiDigitalCertificate table identifying the signer certificateMsiDigitalSignatureHashYBinaryThe encoded hash blob from the digital signatureMsiDigitalSignatureSignObjectNTextForeign key to Media tableMsiDigitalSignatureTableNIdentifierReference to another table name (only Media table is supported)MsiDriverPackagesComponentNComponent1IdentifierPrimary key used to identify a particular component record.MsiDriverPackagesFlagsNDriver package flagsMsiDriverPackagesReferenceComponentsY + MsiDriverPackagesSequenceYInstallation sequence numberMsiEmbeddedChainerCommandLineYFormatted + MsiEmbeddedChainerConditionYCondition + MsiEmbeddedChainerMsiEmbeddedChainerNIdentifier + MsiEmbeddedChainerSourceNCustomSource + MsiEmbeddedChainerTypeYInteger2;18;50 + MsiEmbeddedUIAttributesN03IntegerInformation about the data in the Data column.MsiEmbeddedUIDataYBinaryThis column contains binary information.MsiEmbeddedUIFileNameNFilenameThe name of the file that receives the binary information in the Data column.MsiEmbeddedUIISBuildSourcePathYText + MsiEmbeddedUIMessageFilterY0234913791IntegerSpecifies the types of messages that are sent to the user interface DLL. This column is only relevant for rows with the msidbEmbeddedUI attribute.MsiEmbeddedUIMsiEmbeddedUINIdentifierThe primary key for the table.MsiFileHashFile_NFile1IdentifierPrimary key, foreign key into File table referencing file with this hashMsiFileHashHashPart1NSize of file in bytes (long integer).MsiFileHashHashPart2NSize of file in bytes (long integer).MsiFileHashHashPart3NSize of file in bytes (long integer).MsiFileHashHashPart4NSize of file in bytes (long integer).MsiFileHashOptionsN032767Various options and attributes for this hash.MsiLockPermissionsExConditionYFormattedExpression which must evaluate to TRUE in order for this set of permissions to be appliedMsiLockPermissionsExLockObjectNIdentifierForeign key into Registry, File, CreateFolder, or ServiceInstall tableMsiLockPermissionsExMsiLockPermissionsExNIdentifierPrimary key, non-localized tokenMsiLockPermissionsExSDDLTextNFormattedSDDLTextString to indicate permissions to be applied to the LockObjectMsiLockPermissionsExTableNIdentifierCreateFolder;File;Registry;ServiceInstallReference to another table nameMsiPackageCertificateDigitalCertificate_NIdentifierA foreign key to the digital certificate tableMsiPackageCertificatePackageCertificateNIdentifierA unique identifier for the rowMsiPatchCertificateDigitalCertificate_NMsiDigitalCertificate1IdentifierA foreign key to the digital certificate tableMsiPatchCertificatePatchCertificateNIdentifierA unique identifier for the rowMsiPatchMetadataCompanyYTextOptional company nameMsiPatchMetadataPatchConfiguration_NISPatchConfiguration1TextForeign key to the ISPatchConfiguration tableMsiPatchMetadataPropertyNTextName of the metadataMsiPatchMetadataValueYTextValue of the metadataMsiPatchOldAssemblyFileAssembly_YMsiPatchOldAssemblyName1 + MsiPatchOldAssemblyFileFile_NFile1 + MsiPatchOldAssemblyNameAssemblyN + MsiPatchOldAssemblyNameNameN + MsiPatchOldAssemblyNameValueY + MsiPatchSequencePatchConfiguration_NISPatchConfiguration1TextForeign key to the patch configuration tableMsiPatchSequencePatchFamilyNTextName of the family to which this patch belongsMsiPatchSequenceSequenceNVersionThe version of this patch in this familyMsiPatchSequenceSupersedeNIntegerSupersedeMsiPatchSequenceTargetYTextTarget product codes for this patch familyMsiServiceConfigArgumentYTextArgument(s) for service configuration. Value depends on the content of the ConfigType fieldMsiServiceConfigComponent_NComponent1IdentifierRequired foreign key into the Component Table that controls the configuration of the serviceMsiServiceConfigConfigTypeN-21474836472147483647Service Configuration OptionMsiServiceConfigEventN07Bit field: 0x1 = Install, 0x2 = Uninstall, 0x4 = ReinstallMsiServiceConfigMsiServiceConfigNIdentifierPrimary key, non-localized token.MsiServiceConfigNameNFormattedName of a service. /, \, comma and space are invalidMsiServiceConfigFailureActionsActionsYTextA list of integer actions separated by [~] delimiters: 0 = SC_ACTION_NONE, 1 = SC_ACTION_RESTART, 2 = SC_ACTION_REBOOT, 3 = SC_ACTION_RUN_COMMAND. Terminate with [~][~]MsiServiceConfigFailureActionsCommandYFormattedCommand line of the process to CreateProcess function to executeMsiServiceConfigFailureActionsComponent_NComponent1IdentifierRequired foreign key into the Component Table that controls the configuration of the serviceMsiServiceConfigFailureActionsDelayActionsYTextA list of delays (time in milli-seconds), separated by [~] delmiters, to wait before taking the corresponding Action. Terminate with [~][~]MsiServiceConfigFailureActionsEventN07Bit field: 0x1 = Install, 0x2 = Uninstall, 0x4 = ReinstallMsiServiceConfigFailureActionsMsiServiceConfigFailureActionsNIdentifierPrimary key, non-localized tokenMsiServiceConfigFailureActionsNameNFormattedName of a service. /, \, comma and space are invalidMsiServiceConfigFailureActionsRebootMessageYFormattedMessage to be broadcast to server users before rebootingMsiServiceConfigFailureActionsResetPeriodY02147483647Time in seconds after which to reset the failure count to zero. Leave blank if it should never be resetMsiShortcutPropertyMsiShortcutPropertyNIdentifierPrimary key, non-localized tokenMsiShortcutPropertyPropVariantValueNFormattedString representation of the value in the propertyMsiShortcutPropertyPropertyKeyNFormattedCanonical string representation of the Property Key being setMsiShortcutPropertyShortcut_NShortcut1IdentifierForeign key into the Shortcut tableODBCAttributeAttributeNTextName of ODBC driver attributeODBCAttributeDriver_NODBCDriver1IdentifierReference to ODBC driver in ODBCDriver tableODBCAttributeValueYTextValue for ODBC driver attributeODBCDataSourceComponent_NComponent1IdentifierReference to associated componentODBCDataSourceDataSourceNIdentifierPrimary key, non-localized.internal token for data sourceODBCDataSourceDescriptionNTextText used as registered name for data sourceODBCDataSourceDriverDescriptionNTextReference to driver description, may be existing driverODBCDataSourceRegistrationN01Registration option: 0=machine, 1=user, others t.b.d.ODBCDriverComponent_NComponent1IdentifierReference to associated componentODBCDriverDescriptionNTextText used as registered name for driver, non-localizedODBCDriverDriverNIdentifierPrimary key, non-localized.internal token for driverODBCDriverFile_NFile1IdentifierReference to key driver fileODBCDriverFile_SetupYFile1IdentifierOptional reference to key driver setup DLLODBCSourceAttributeAttributeNTextName of ODBC data source attributeODBCSourceAttributeDataSource_NODBCDataSource1IdentifierReference to ODBC data source in ODBCDataSource tableODBCSourceAttributeValueYTextValue for ODBC data source attributeODBCTranslatorComponent_NComponent1IdentifierReference to associated componentODBCTranslatorDescriptionNTextText used as registered name for translatorODBCTranslatorFile_NFile1IdentifierReference to key translator fileODBCTranslatorFile_SetupYFile1IdentifierOptional reference to key translator setup DLLODBCTranslatorTranslatorNIdentifierPrimary key, non-localized.internal token for translatorPatchAttributesN032767Integer containing bit flags representing patch attributesPatchFile_NFile1IdentifierPrimary key, non-localized token, foreign key to File table, must match identifier in cabinet.PatchHeaderYBinaryBinary stream. The patch header, used for patch validation.PatchISBuildSourcePathYTextFull path to patch header.PatchPatchSizeN02147483647Size of patch in bytes (long integer).PatchSequenceN032767Primary key, sequence with respect to the media images; order must track cabinet order.PatchStreamRef_YIdentifierExternal key into the MsiPatchHeaders table specifying the row that contains the patch header stream.PatchPackageMedia_N032767Foreign key to DiskId column of Media table. Indicates the disk containing the patch package.PatchPackagePatchIdNGuidA unique string GUID representing this patch.ProgIdClass_YClass1GuidThe CLSID of an OLE factory corresponding to the ProgId.ProgIdDescriptionYTextLocalized description for the Program identifier.ProgIdISAttributesYThis is used to store Installshield custom properties of a component, like ExtractIcon, etc.ProgIdIconIndexY-3276732767Optional icon index.ProgIdIcon_YIcon1IdentifierOptional foreign key into the Icon Table, specifying the icon file associated with this ProgId. Will be written under the DefaultIcon key.ProgIdProgIdNTextThe Program Identifier. Primary key.ProgIdProgId_ParentYProgId1TextThe Parent Program Identifier. If specified, the ProgId column becomes a version independent prog id.PropertyISCommentsYTextUser Comments.PropertyPropertyNIdentifierName of property, uppercase if settable by launcher or loader.PropertyValueYTextString value for property.PublishComponentAppDataYTextThis is localisable Application specific data that can be associated with a Qualified Component.PublishComponentComponentIdNGuidA string GUID that represents the component id that will be requested by the alien product.PublishComponentComponent_NComponent1IdentifierForeign key into the Component table.PublishComponentFeature_NFeature1IdentifierForeign key into the Feature table.PublishComponentQualifierNTextThis is defined only when the ComponentId column is an Qualified Component Id. This is the Qualifier for ProvideComponentIndirect.RadioButtonHeightN032767The height of the button.RadioButtonHelpYTextThe help strings used with the button. The text is optional.RadioButtonISControlIdYA number used to represent the control ID of the Control, Used in Dialog exportRadioButtonOrderN132767A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.RadioButtonPropertyNIdentifierA named property to be tied to this radio button. All the buttons tied to the same property become part of the same group.RadioButtonTextYTextThe visible title to be assigned to the radio button.RadioButtonValueNFormattedThe value string associated with this button. Selecting the button will set the associated property to this value.RadioButtonWidthN032767The width of the button.RadioButtonXN032767The horizontal coordinate of the upper left corner of the bounding rectangle of the radio button.RadioButtonYN032767The vertical coordinate of the upper left corner of the bounding rectangle of the radio button.RegLocatorKeyNRegPathThe key for the registry value.RegLocatorNameYFormattedThe registry value name.RegLocatorRootN03The predefined root key for the registry value, one of rrkEnum.RegLocatorSignature_NSignature1IdentifierThe table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table. If the type is 0, the registry values refers a directory, and _Signature is not a foreign key.RegLocatorTypeY018An integer value that determines if the registry value is a filename or a directory location or to be used as is w/o interpretation.RegistryComponent_NComponent1IdentifierForeign key into the Component table referencing component that controls the installing of the registry value.RegistryISAttributesYThis is used to store Installshield custom properties of a registry item. Currently the only one is Automatic.RegistryKeyNRegPathThe key for the registry value.RegistryNameYFormattedThe registry value name.RegistryRegistryNIdentifierPrimary key, non-localized token.RegistryRootN-13The predefined root key for the registry value, one of rrkEnum.RegistryValueYTextThe registry value.RemoveFileComponent_NComponent1IdentifierForeign key referencing Component that controls the file to be removed.RemoveFileDirPropertyNIdentifierName of a property whose value is assumed to resolve to the full pathname to the folder of the file to be removed.RemoveFileFileKeyNIdentifierPrimary key used to identify a particular file entryRemoveFileFileNameYTextName of the file to be removed.RemoveFileInstallModeN1;2;3Installation option, one of iimEnum.RemoveIniFileActionN2;4The type of modification to be made, one of iifEnum.RemoveIniFileComponent_NComponent1IdentifierForeign key into the Component table referencing component that controls the deletion of the .INI value.RemoveIniFileDirPropertyYIdentifierForeign key into the Directory table denoting the directory where the .INI file is.RemoveIniFileFileNameNTextThe .INI file name in which to delete the informationRemoveIniFileKeyNFormattedThe .INI file key below Section.RemoveIniFileRemoveIniFileNIdentifierPrimary key, non-localized token.RemoveIniFileSectionNFormattedThe .INI file Section.RemoveIniFileValueYFormattedThe value to be deleted. The value is required when Action is iifIniRemoveTagRemoveRegistryComponent_NComponent1IdentifierForeign key into the Component table referencing component that controls the deletion of the registry value.RemoveRegistryKeyNRegPathThe key for the registry value.RemoveRegistryNameYFormattedThe registry value name.RemoveRegistryRemoveRegistryNIdentifierPrimary key, non-localized token.RemoveRegistryRootN-13The predefined root key for the registry value, one of rrkEnumReserveCostComponent_NComponent1IdentifierReserve a specified amount of space if this component is to be installed.ReserveCostReserveFolderYIdentifierName of a property whose value is assumed to resolve to the full path to the destination directoryReserveCostReserveKeyNIdentifierPrimary key that uniquely identifies a particular ReserveCost recordReserveCostReserveLocalN02147483647Disk space to reserve if linked component is installed locally.ReserveCostReserveSourceN02147483647Disk space to reserve if linked component is installed to run from the source location.SFPCatalogCatalogYBinarySFP CatalogSFPCatalogDependencyYFormattedParent catalog - only used by SFPSFPCatalogSFPCatalogNFilenameFile name for the catalog.SelfRegCostY032767The cost of registering the module.SelfRegFile_NFile1IdentifierForeign key into the File table denoting the module that needs to be registered.ServiceControlArgumentsYFormattedArguments for the service. Separate by [~].ServiceControlComponent_NComponent1IdentifierRequired foreign key into the Component Table that controls the startup of the serviceServiceControlEventN0187Bit field: Install: 0x1 = Start, 0x2 = Stop, 0x8 = Delete, Uninstall: 0x10 = Start, 0x20 = Stop, 0x80 = DeleteServiceControlNameNFormattedName of a service. /, \, comma and space are invalidServiceControlServiceControlNIdentifierPrimary key, non-localized token.ServiceControlWaitY01Boolean for whether to wait for the service to fully startServiceInstallArgumentsYFormattedArguments to include in every start of the service, passed to WinMainServiceInstallComponent_NComponent1IdentifierRequired foreign key into the Component Table that controls the startup of the serviceServiceInstallDependenciesYFormattedOther services this depends on to start. Separate by [~], and end with [~][~]ServiceInstallDescriptionYTextDescription of service.ServiceInstallDisplayNameYFormattedExternal Name of the ServiceServiceInstallErrorControlN-21474836472147483647Severity of error if service fails to startServiceInstallLoadOrderGroupYFormattedLoadOrderGroupServiceInstallNameNFormattedInternal Name of the ServiceServiceInstallPasswordYFormattedpassword to run service with. (with StartName)ServiceInstallServiceInstallNIdentifierPrimary key, non-localized token.ServiceInstallServiceTypeN-21474836472147483647Type of the serviceServiceInstallStartNameYFormattedUser or object name to run service asServiceInstallStartTypeN04Type of the serviceShortcutArgumentsYFormattedThe command-line arguments for the shortcut.ShortcutComponent_NComponent1IdentifierForeign key into the Component table denoting the component whose selection gates the the shortcut creation/deletion.ShortcutDescriptionYTextThe description for the shortcut.ShortcutDescriptionResourceDLLYFormattedThis field contains a Formatted string value for the full path to the language neutral file that contains the MUI manifest.ShortcutDescriptionResourceIdY032767The description name index for the shortcut.ShortcutDirectory_NDirectory1IdentifierForeign key into the Directory table denoting the directory where the shortcut file is created.ShortcutDisplayResourceDLLYFormattedThis field contains a Formatted string value for the full path to the language neutral file that contains the MUI manifest.ShortcutDisplayResourceIdY032767The display name index for the shortcut.ShortcutHotkeyY032767The hotkey for the shortcut. It has the virtual-key code for the key in the low-order byte, and the modifier flags in the high-order byte.ShortcutISAttributesYThis is used to store Installshield custom properties of a shortcut. Mainly used in pro project types.ShortcutISCommentsYTextAuthor’s comments on this Shortcut.ShortcutISShortcutNameYTextA non-unique name for the shortcut. Mainly used by pro pro project types.ShortcutIconIndexY-3276732767The icon index for the shortcut.ShortcutIcon_YIcon1IdentifierForeign key into the File table denoting the external icon file for the shortcut.ShortcutNameNTextThe name of the shortcut to be created.ShortcutShortcutNIdentifierPrimary key, non-localized token.ShortcutShowCmdY1;3;7The show command for the application window.The following values may be used.ShortcutTargetNShortcutThe shortcut target. This is usually a property that is expanded to a file or a folder that the shortcut points to.ShortcutWkDirYIdentifierName of property defining location of working directory.SignatureFileNameNTextThe name of the file. This may contain a "short name|long name" pair.SignatureLanguagesYLanguageThe languages supported by the file.SignatureMaxDateY02147483647The maximum creation date of the file.SignatureMaxSizeY02147483647The maximum size of the file.SignatureMaxVersionYTextThe maximum version of the file.SignatureMinDateY02147483647The minimum creation date of the file.SignatureMinSizeY02147483647The minimum size of the file.SignatureMinVersionYTextThe minimum version of the file.SignatureSignatureNIdentifierThe table key. The Signature represents a unique file signature.TextStyleColorY016777215A long integer indicating the color of the string in the RGB format (Red, Green, Blue each 0-255, RGB = R + 256*G + 256^2*B).TextStyleFaceNameNTextA string indicating the name of the font used. Required. The string must be at most 31 characters long.TextStyleSizeN032767The size of the font used. This size is given in our units (1/12 of the system font height). Assuming that the system font is set to 12 point size, this is equivalent to the point size.TextStyleStyleBitsY015A combination of style bits.TextStyleTextStyleNIdentifierName of the style. The primary key of this table. This name is embedded in the texts to indicate a style change.TypeLibComponent_NComponent1IdentifierRequired foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent.TypeLibCostY02147483647The cost associated with the registration of the typelib. This column is currently optional.TypeLibDescriptionYText + TypeLibDirectory_YDirectory1IdentifierOptional. The foreign key into the Directory table denoting the path to the help file for the type library.TypeLibFeature_NFeature1IdentifierRequired foreign key into the Feature Table, specifying the feature to validate or install in order for the type library to be operational.TypeLibLanguageN032767The language of the library.TypeLibLibIDNGuidThe GUID that represents the library.TypeLibVersionY02147483647The version of the library. The major version is in the upper 8 bits of the short integer. The minor version is in the lower 8 bits.UITextKeyNIdentifierA unique key that identifies the particular string.UITextTextYTextThe localized version of the string.UpgradeActionPropertyNUpperCaseThe property to set when a product in this set is found.UpgradeAttributesN02147483647The attributes of this product set.UpgradeISDisplayNameYISUpgradeMsiItem1 + UpgradeLanguageYLanguageA comma-separated list of languages for either products in this set or products not in this set.UpgradeRemoveYFormattedThe list of features to remove when uninstalling a product from this set. The default is "ALL".UpgradeUpgradeCodeNGuidThe UpgradeCode GUID belonging to the products in this set.UpgradeVersionMaxYTextThe maximum ProductVersion of the products in this set. The set may or may not include products with this particular version.UpgradeVersionMinYTextThe minimum ProductVersion of the products in this set. The set may or may not include products with this particular version.VerbArgumentYFormattedOptional value for the command arguments.VerbCommandYFormattedThe command text.VerbExtension_NExtension1TextThe extension associated with the table row.VerbSequenceY032767Order within the verbs for a particular extension. Also used simply to specify the default verb.VerbVerbNTextThe verb for the command._ValidationCategoryY"Text";"Formatted";"Template";"Condition";"Guid";"Path";"Version";"Language";"Identifier";"Binary";"UpperCase";"LowerCase";"Filename";"Paths";"AnyPath";"WildCardFilename";"RegPath";"KeyFormatted";"CustomSource";"Property";"Cabinet";"Shortcut";"URL";"DefaultDir"String category_ValidationColumnNIdentifierName of column_ValidationDescriptionYTextDescription of column_ValidationKeyColumnY132Column to which foreign key connects_ValidationKeyTableYIdentifierFor foreign key, Name of table to which data must link_ValidationMaxValueY-21474836472147483647Maximum value allowed_ValidationMinValueY-21474836472147483647Minimum value allowed_ValidationNullableNY;N;@Whether the column is nullable_ValidationSetYTextSet of values that are permitted_ValidationTableNIdentifierName of table
+
diff --git a/ssisUnit2012Setup/ssisUnit2017Setup.isproj b/ssisUnit2012Setup/ssisUnit2017Setup.isproj new file mode 100644 index 0000000..db5f487 --- /dev/null +++ b/ssisUnit2012Setup/ssisUnit2017Setup.isproj @@ -0,0 +1,57 @@ + + + + + Express + + Debug + $(Configuration) + + + + + + + + + + + + + + + + + + + + SSISUnit.2017 + {8C839F0E-0AFD-4D9A-8DEE-5C7963E3E6C7} + + + SsisUnit.Design_SQL2017 + {3B38F252-0DE8-4639-9AF9-AB8B216B685C} + + + SsisUnit.TestComponents.2017 + {6C8078E0-99DD-40D0-94DA-E17B3FC50679} + + + SsisUnitBase + {E693CCE8-9EDF-4117-AB7F-EB87B87E29EA} + + + ssisUnit.TestRunner.2017 + {8EDF3C6B-F9B0-4547-8B8B-B21F2FF8C9C0} + + + ssisUnitTestRunnerUI.2017 + {A943E51D-D0CC-4EF1-875B-937D0B179241} + + + \ No newline at end of file diff --git a/ssisUnitTestDb/ssisUnitTestDb.jfm b/ssisUnitTestDb/ssisUnitTestDb.jfm new file mode 100644 index 0000000000000000000000000000000000000000..9d8db665d6ad67dd7ab9cd9f5a3c13df66875019 GIT binary patch literal 16384 zcmeI&F$)247{~F)U58G%NU2*c7G+XWl%nnh7_7>BxH<-dNhYu17A3DhCWDQ#8@&gk zIPPvyB=h&bJpcdmd!FSp|BsWxR+aB3=EucyKBKsYc&U{$6xY#f&4OREdbAn5Q(-@? z-