From 9317f7c8ea709da55e4602eaaba06952bbf315b7 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 3 Jun 2020 02:19:16 -0700 Subject: Redesign CustomTable tuples to support resolving binary columns --- .../Bind/LoadTableDefinitionsCommand.cs | 257 ++++++++++----------- 1 file changed, 117 insertions(+), 140 deletions(-) (limited to 'src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs') diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs index eba7bdbe..d7809034 100644 --- a/src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Bind/LoadTableDefinitionsCommand.cs @@ -32,11 +32,15 @@ namespace WixToolset.Core.WindowsInstaller.Bind public TableDefinitionCollection Execute() { var tableDefinitions = new TableDefinitionCollection(WindowsInstallerTableDefinitions.All); + var customColumnsById = this.Section.Tuples.OfType().ToDictionary(t => t.Id.Id); - foreach (var tuple in this.Section.Tuples.OfType()) + if (customColumnsById.Any()) { - var customTableDefinition = this.CreateCustomTable(tuple); - tableDefinitions.Add(customTableDefinition); + foreach (var tuple in this.Section.Tuples.OfType()) + { + var customTableDefinition = this.CreateCustomTable(tuple, customColumnsById); + tableDefinitions.Add(customTableDefinition); + } } foreach (var backendExtension in this.BackendExtensions) @@ -56,177 +60,150 @@ namespace WixToolset.Core.WindowsInstaller.Bind return this.TableDefinitions; } - private TableDefinition CreateCustomTable(WixCustomTableTuple tuple) + private TableDefinition CreateCustomTable(WixCustomTableTuple tuple, Dictionary customColumnsById) { - var columnNames = tuple.ColumnNames.Split('\t'); - var columnTypes = tuple.ColumnTypes.Split('\t'); - var primaryKeys = tuple.PrimaryKeys.Split('\t'); - var minValues = tuple.MinValues?.Split('\t'); - var maxValues = tuple.MaxValues?.Split('\t'); - var keyTables = tuple.KeyTables?.Split('\t'); - var keyColumns = tuple.KeyColumns?.Split('\t'); - var categories = tuple.Categories?.Split('\t'); - var sets = tuple.Sets?.Split('\t'); - var descriptions = tuple.Descriptions?.Split('\t'); - var modularizations = tuple.Modularizations?.Split('\t'); - - var currentPrimaryKey = 0; - + var columnNames = tuple.ColumnNamesSeparated; var columns = new List(columnNames.Length); - for (var i = 0; i < columnNames.Length; ++i) + + foreach (var name in columnNames) { - var name = columnNames[i]; + var column = customColumnsById[tuple.Id.Id + "/" + name]; + var type = ColumnType.Unknown; - if (columnTypes[i].StartsWith("s", StringComparison.OrdinalIgnoreCase)) - { - type = ColumnType.String; - } - else if (columnTypes[i].StartsWith("l", StringComparison.OrdinalIgnoreCase)) + if (column.Type == IntermediateFieldType.String) { - type = ColumnType.Localized; + type = column.Localizable ? ColumnType.Localized : ColumnType.String; } - else if (columnTypes[i].StartsWith("i", StringComparison.OrdinalIgnoreCase)) + else if (column.Type == IntermediateFieldType.Number) { type = ColumnType.Number; } - else if (columnTypes[i].StartsWith("v", StringComparison.OrdinalIgnoreCase)) + else if (column.Type == IntermediateFieldType.Path) { type = ColumnType.Object; } - var nullable = columnTypes[i].Substring(0, 1) == columnTypes[i].Substring(0, 1).ToUpperInvariant(); - var length = Convert.ToInt32(columnTypes[i].Substring(1), CultureInfo.InvariantCulture); - - var primaryKey = false; - if (currentPrimaryKey < primaryKeys.Length && primaryKeys[currentPrimaryKey] == columnNames[i]) - { - primaryKey = true; - currentPrimaryKey++; - } - - var minValue = String.IsNullOrEmpty(minValues?[i]) ? (int?)null : Convert.ToInt32(minValues[i], CultureInfo.InvariantCulture); - var maxValue = String.IsNullOrEmpty(maxValues?[i]) ? (int?)null : Convert.ToInt32(maxValues[i], CultureInfo.InvariantCulture); - var keyColumn = String.IsNullOrEmpty(keyColumns?[i]) ? (int?)null : Convert.ToInt32(keyColumns[i], CultureInfo.InvariantCulture); - var category = ColumnCategory.Unknown; - if (null != categories && null != categories[i] && 0 < categories[i].Length) + switch (column.Category) { - switch (categories[i]) - { - case "Text": - category = ColumnCategory.Text; - break; - case "UpperCase": - category = ColumnCategory.UpperCase; - break; - case "LowerCase": - category = ColumnCategory.LowerCase; - break; - case "Integer": - category = ColumnCategory.Integer; - break; - case "DoubleInteger": - category = ColumnCategory.DoubleInteger; - break; - case "TimeDate": - category = ColumnCategory.TimeDate; - break; - case "Identifier": - category = ColumnCategory.Identifier; - break; - case "Property": - category = ColumnCategory.Property; - break; - case "Filename": - category = ColumnCategory.Filename; - break; - case "WildCardFilename": - category = ColumnCategory.WildCardFilename; - break; - case "Path": - category = ColumnCategory.Path; - break; - case "Paths": - category = ColumnCategory.Paths; - break; - case "AnyPath": - category = ColumnCategory.AnyPath; - break; - case "DefaultDir": - category = ColumnCategory.DefaultDir; - break; - case "RegPath": - category = ColumnCategory.RegPath; - break; - case "Formatted": - category = ColumnCategory.Formatted; - break; - case "FormattedSddl": - category = ColumnCategory.FormattedSDDLText; - break; - case "Template": - category = ColumnCategory.Template; - break; - case "Condition": - category = ColumnCategory.Condition; - break; - case "Guid": - category = ColumnCategory.Guid; - break; - case "Version": - category = ColumnCategory.Version; - break; - case "Language": - category = ColumnCategory.Language; - break; - case "Binary": - category = ColumnCategory.Binary; - break; - case "CustomSource": - category = ColumnCategory.CustomSource; - break; - case "Cabinet": - category = ColumnCategory.Cabinet; - break; - case "Shortcut": - category = ColumnCategory.Shortcut; - break; - default: - break; - } + case "Text": + category = ColumnCategory.Text; + break; + case "UpperCase": + category = ColumnCategory.UpperCase; + break; + case "LowerCase": + category = ColumnCategory.LowerCase; + break; + case "Integer": + category = ColumnCategory.Integer; + break; + case "DoubleInteger": + category = ColumnCategory.DoubleInteger; + break; + case "TimeDate": + category = ColumnCategory.TimeDate; + break; + case "Identifier": + category = ColumnCategory.Identifier; + break; + case "Property": + category = ColumnCategory.Property; + break; + case "Filename": + category = ColumnCategory.Filename; + break; + case "WildCardFilename": + category = ColumnCategory.WildCardFilename; + break; + case "Path": + category = ColumnCategory.Path; + break; + case "Paths": + category = ColumnCategory.Paths; + break; + case "AnyPath": + category = ColumnCategory.AnyPath; + break; + case "DefaultDir": + category = ColumnCategory.DefaultDir; + break; + case "RegPath": + category = ColumnCategory.RegPath; + break; + case "Formatted": + category = ColumnCategory.Formatted; + break; + case "FormattedSddl": + category = ColumnCategory.FormattedSDDLText; + break; + case "Template": + category = ColumnCategory.Template; + break; + case "Condition": + category = ColumnCategory.Condition; + break; + case "Guid": + category = ColumnCategory.Guid; + break; + case "Version": + category = ColumnCategory.Version; + break; + case "Language": + category = ColumnCategory.Language; + break; + case "Binary": + category = ColumnCategory.Binary; + break; + case "CustomSource": + category = ColumnCategory.CustomSource; + break; + case "Cabinet": + category = ColumnCategory.Cabinet; + break; + case "Shortcut": + category = ColumnCategory.Shortcut; + break; + default: + break; } - var keyTable = keyTables?[i]; - var setValue = sets?[i]; - var description = descriptions?[i]; - var modString = modularizations?[i]; var modularization = ColumnModularizeType.None; - switch (modString) + switch (column.Modularize) { case null: - case "None": + case WixCustomTableColumnModularizeType.None: modularization = ColumnModularizeType.None; break; - case "Column": + case WixCustomTableColumnModularizeType.Column: modularization = ColumnModularizeType.Column; break; - case "Property": - modularization = ColumnModularizeType.Property; + case WixCustomTableColumnModularizeType.CompanionFile: + modularization = ColumnModularizeType.CompanionFile; break; - case "Condition": + case WixCustomTableColumnModularizeType.Condition: modularization = ColumnModularizeType.Condition; break; - case "CompanionFile": - modularization = ColumnModularizeType.CompanionFile; + case WixCustomTableColumnModularizeType.ControlEventArgument: + modularization = ColumnModularizeType.ControlEventArgument; + break; + case WixCustomTableColumnModularizeType.ControlText: + modularization = ColumnModularizeType.ControlText; + break; + case WixCustomTableColumnModularizeType.Icon: + modularization = ColumnModularizeType.Icon; + break; + case WixCustomTableColumnModularizeType.Property: + modularization = ColumnModularizeType.Property; break; - case "SemicolonDelimited": + case WixCustomTableColumnModularizeType.SemicolonDelimited: modularization = ColumnModularizeType.SemicolonDelimited; break; } - var columnDefinition = new ColumnDefinition(name, type, length, primaryKey, nullable, category, minValue, maxValue, keyTable, keyColumn, setValue, description, modularization, ColumnType.Localized == type, true); + var columnDefinition = new ColumnDefinition(name, type, column.Width, column.PrimaryKey, column.Nullable, category, column.MinValue, column.MaxValue, column.KeyTable, column.KeyColumn, column.Set, column.Description, modularization, ColumnType.Localized == type, useCData: true, column.Unreal); columns.Add(columnDefinition); } -- cgit v1.2.3-55-g6feb