From 6ff680e386b1543ad1a58d1b1d465ce8aa20bc7d Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Fri, 24 Jan 2020 15:27:20 -0800 Subject: Start on new patch infrastructure --- .../Unbind/UnbindTranformCommand.cs | 125 ++++++++++----------- 1 file changed, 58 insertions(+), 67 deletions(-) (limited to 'src/WixToolset.Core.WindowsInstaller/Unbind/UnbindTranformCommand.cs') diff --git a/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindTranformCommand.cs b/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindTranformCommand.cs index bdf8d542..9261fda0 100644 --- a/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindTranformCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindTranformCommand.cs @@ -4,6 +4,7 @@ namespace WixToolset.Core.WindowsInstaller.Unbind { using System; using System.Collections; + using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.IO; @@ -12,7 +13,6 @@ namespace WixToolset.Core.WindowsInstaller.Unbind using WixToolset.Core.WindowsInstaller.Msi; using WixToolset.Data; using WixToolset.Data.WindowsInstaller; - using WixToolset.Extensibility; using WixToolset.Extensibility.Services; internal class UnbindTransformCommand @@ -41,21 +41,21 @@ namespace WixToolset.Core.WindowsInstaller.Unbind public WindowsInstallerData Execute() { - WindowsInstallerData transform = new WindowsInstallerData(new SourceLineNumber(this.TransformFile)); + var transform = new WindowsInstallerData(new SourceLineNumber(this.TransformFile)); transform.Type = OutputType.Transform; // get the summary information table - using (SummaryInformation summaryInformation = new SummaryInformation(this.TransformFile)) + using (var summaryInformation = new SummaryInformation(this.TransformFile)) { - Table table = transform.EnsureTable(this.TableDefinitions["_SummaryInformation"]); + var table = transform.EnsureTable(this.TableDefinitions["_SummaryInformation"]); - for (int i = 1; 19 >= i; i++) + for (var i = 1; 19 >= i; i++) { - string value = summaryInformation.GetProperty(i); + var value = summaryInformation.GetProperty(i); if (0 < value.Length) { - Row row = table.CreateRow(transform.SourceLineNumbers); + var row = table.CreateRow(transform.SourceLineNumbers); row[0] = i; row[1] = value; } @@ -63,9 +63,9 @@ namespace WixToolset.Core.WindowsInstaller.Unbind } // create a schema msi which hopefully matches the table schemas in the transform - WindowsInstallerData schemaOutput = new WindowsInstallerData(null); - string msiDatabaseFile = Path.Combine(this.IntermediateFolder, "schema.msi"); - foreach (TableDefinition tableDefinition in this.TableDefinitions) + var schemaOutput = new WindowsInstallerData(null); + var msiDatabaseFile = Path.Combine(this.IntermediateFolder, "schema.msi"); + foreach (var tableDefinition in this.TableDefinitions) { // skip unreal tables and the Patch table if (!tableDefinition.Unreal && "Patch" != tableDefinition.Name) @@ -74,40 +74,40 @@ namespace WixToolset.Core.WindowsInstaller.Unbind } } - Hashtable addedRows = new Hashtable(); + var addedRows = new Dictionary(); Table transformViewTable; // Bind the schema msi. this.GenerateDatabase(schemaOutput, msiDatabaseFile); // apply the transform to the database and retrieve the modifications - using (Database msiDatabase = new Database(msiDatabaseFile, OpenDatabase.Transact)) + using (var msiDatabase = new Database(msiDatabaseFile, OpenDatabase.Transact)) { // apply the transform with the ViewTransform option to collect all the modifications msiDatabase.ApplyTransform(this.TransformFile, TransformErrorConditions.All | TransformErrorConditions.ViewTransform); // unbind the database var unbindCommand = new UnbindDatabaseCommand(this.Messaging, msiDatabase, msiDatabaseFile, OutputType.Product, this.ExportBasePath, this.IntermediateFolder, false, false, skipSummaryInfo: true); - WindowsInstallerData transformViewOutput = unbindCommand.Execute(); + var transformViewOutput = unbindCommand.Execute(); // index the added and possibly modified rows (added rows may also appears as modified rows) transformViewTable = transformViewOutput.Tables["_TransformView"]; - Hashtable modifiedRows = new Hashtable(); - foreach (Row row in transformViewTable.Rows) + var modifiedRows = new Hashtable(); + foreach (var row in transformViewTable.Rows) { - string tableName = (string)row[0]; - string columnName = (string)row[1]; - string primaryKeys = (string)row[2]; + var tableName = (string)row[0]; + var columnName = (string)row[1]; + var primaryKeys = (string)row[2]; if ("INSERT" == columnName) { - string index = String.Concat(tableName, ':', primaryKeys); + var index = String.Concat(tableName, ':', primaryKeys); addedRows.Add(index, null); } else if ("CREATE" != columnName && "DELETE" != columnName && "DROP" != columnName && null != primaryKeys) // modified row { - string index = String.Concat(tableName, ':', primaryKeys); + var index = String.Concat(tableName, ':', primaryKeys); modifiedRows[index] = row; } @@ -116,16 +116,16 @@ namespace WixToolset.Core.WindowsInstaller.Unbind // create placeholder rows for modified rows to make the transform insert the updated values when its applied foreach (Row row in modifiedRows.Values) { - string tableName = (string)row[0]; - string columnName = (string)row[1]; - string primaryKeys = (string)row[2]; + var tableName = (string)row[0]; + var columnName = (string)row[1]; + var primaryKeys = (string)row[2]; - string index = String.Concat(tableName, ':', primaryKeys); + var index = String.Concat(tableName, ':', primaryKeys); // ignore information for added rows - if (!addedRows.Contains(index)) + if (!addedRows.ContainsKey(index)) { - Table table = schemaOutput.Tables[tableName]; + var table = schemaOutput.Tables[tableName]; this.CreateRow(table, primaryKeys, true); } } @@ -135,7 +135,7 @@ namespace WixToolset.Core.WindowsInstaller.Unbind this.GenerateDatabase(schemaOutput, msiDatabaseFile); // apply the transform to the database and retrieve the modifications - using (Database msiDatabase = new Database(msiDatabaseFile, OpenDatabase.Transact)) + using (var msiDatabase = new Database(msiDatabaseFile, OpenDatabase.Transact)) { try { @@ -158,26 +158,26 @@ namespace WixToolset.Core.WindowsInstaller.Unbind // unbind the database var unbindCommand = new UnbindDatabaseCommand(this.Messaging, msiDatabase, msiDatabaseFile, OutputType.Product, this.ExportBasePath, this.IntermediateFolder, false, false, skipSummaryInfo: true); - WindowsInstallerData output = unbindCommand.Execute(); + var output = unbindCommand.Execute(); // index all the rows to easily find modified rows - Hashtable rows = new Hashtable(); - foreach (Table table in output.Tables) + var rows = new Dictionary(); + foreach (var table in output.Tables) { - foreach (Row row in table.Rows) + foreach (var row in table.Rows) { rows.Add(String.Concat(table.Name, ':', row.GetPrimaryKey('\t', " ")), row); } } // process the _TransformView rows into transform rows - foreach (Row row in transformViewTable.Rows) + foreach (var row in transformViewTable.Rows) { - string tableName = (string)row[0]; - string columnName = (string)row[1]; - string primaryKeys = (string)row[2]; + var tableName = (string)row[0]; + var columnName = (string)row[1]; + var primaryKeys = (string)row[2]; - Table table = transform.EnsureTable(this.TableDefinitions[tableName]); + var table = transform.EnsureTable(this.TableDefinitions[tableName]); if ("CREATE" == columnName) // added table { @@ -185,7 +185,7 @@ namespace WixToolset.Core.WindowsInstaller.Unbind } else if ("DELETE" == columnName) // deleted row { - Row deletedRow = this.CreateRow(table, primaryKeys, false); + var deletedRow = this.CreateRow(table, primaryKeys, false); deletedRow.Operation = RowOperation.Delete; } else if ("DROP" == columnName) // dropped table @@ -194,24 +194,24 @@ namespace WixToolset.Core.WindowsInstaller.Unbind } else if ("INSERT" == columnName) // added row { - string index = String.Concat(tableName, ':', primaryKeys); - Row addedRow = (Row)rows[index]; + var index = String.Concat(tableName, ':', primaryKeys); + var addedRow = rows[index]; addedRow.Operation = RowOperation.Add; table.Rows.Add(addedRow); } else if (null != primaryKeys) // modified row { - string index = String.Concat(tableName, ':', primaryKeys); + var index = String.Concat(tableName, ':', primaryKeys); // the _TransformView table includes information for added rows // that looks like modified rows so it sometimes needs to be ignored - if (!addedRows.Contains(index)) + if (!addedRows.ContainsKey(index)) { - Row modifiedRow = (Row)rows[index]; + var modifiedRow = rows[index]; // mark the field as modified - int indexOfModifiedValue = -1; - for (int i = 0; i < modifiedRow.TableDefinition.Columns.Length; ++i) + var indexOfModifiedValue = -1; + for (var i = 0; i < modifiedRow.TableDefinition.Columns.Length; ++i) { if (columnName.Equals(modifiedRow.TableDefinition.Columns[i].Name, StringComparison.Ordinal)) { @@ -231,7 +231,7 @@ namespace WixToolset.Core.WindowsInstaller.Unbind } else // added column { - ColumnDefinition column = table.Definition.Columns.Single(c => c.Name.Equals(columnName, StringComparison.Ordinal)); + var column = table.Definition.Columns.Single(c => c.Name.Equals(columnName, StringComparison.Ordinal)); column.Added = true; } } @@ -240,21 +240,6 @@ namespace WixToolset.Core.WindowsInstaller.Unbind return transform; } - private void GenerateDatabase(WindowsInstallerData output, string databaseFile) - { - var command = new GenerateDatabaseCommand(); - command.Extensions = Array.Empty(); - command.Output = output; - command.OutputPath = databaseFile; - command.KeepAddedColumns = true; - command.UseSubDirectory = false; - command.SuppressAddingValidationRows = true; - command.TableDefinitions = this.TableDefinitions; - command.IntermediateFolder = this.IntermediateFolder; - command.Codepage = -1; - command.Execute(); - } - /// /// Create a deleted or modified row. /// @@ -264,14 +249,14 @@ namespace WixToolset.Core.WindowsInstaller.Unbind /// The new row. private Row CreateRow(Table table, string primaryKeys, bool setRequiredFields) { - Row row = table.CreateRow(null); + var row = table.CreateRow(null); - string[] primaryKeyParts = primaryKeys.Split('\t'); - int primaryKeyPartIndex = 0; + var primaryKeyParts = primaryKeys.Split('\t'); + var primaryKeyPartIndex = 0; - for (int i = 0; i < table.Definition.Columns.Length; i++) + for (var i = 0; i < table.Definition.Columns.Length; i++) { - ColumnDefinition columnDefinition = table.Definition.Columns[i]; + var columnDefinition = table.Definition.Columns[i]; if (columnDefinition.PrimaryKey) { @@ -294,8 +279,8 @@ namespace WixToolset.Core.WindowsInstaller.Unbind { if (null == this.EmptyFile) { - this.EmptyFile = Path.GetTempFileName() + ".empty"; - using (FileStream fileStream = File.Create(this.EmptyFile)) + this.EmptyFile = Path.Combine(this.IntermediateFolder, ".empty"); + using (var fileStream = File.Create(this.EmptyFile)) { } } @@ -311,5 +296,11 @@ namespace WixToolset.Core.WindowsInstaller.Unbind return row; } + + private void GenerateDatabase(WindowsInstallerData output, string databaseFile) + { + var command = new GenerateDatabaseCommand(this.Messaging, null, null, output, databaseFile, this.TableDefinitions, this.IntermediateFolder, codepage: -1, keepAddedColumns: true, suppressAddingValidationRows: true, useSubdirectory: false); + command.Execute(); + } } } -- cgit v1.2.3-55-g6feb