diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2019-11-25 14:35:27 +1000 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2019-11-25 18:06:33 +1000 |
commit | 229a74c78a403bdd9c065bac372438968a421833 (patch) | |
tree | e0b775dc3da2a72a7c26255b9bee4e905d53e26f /src | |
parent | 94b3c44ea27e29253a26e18bf0c70295d0fc48e5 (diff) | |
download | wix-229a74c78a403bdd9c065bac372438968a421833.tar.gz wix-229a74c78a403bdd9c065bac372438968a421833.tar.bz2 wix-229a74c78a403bdd9c065bac372438968a421833.zip |
Refactor creating the TableDefinition into a method before changing the logic
Diffstat (limited to 'src')
-rw-r--r-- | src/WixToolset.Core.WindowsInstaller/Unbind/UnbindDatabaseCommand.cs | 297 |
1 files changed, 151 insertions, 146 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindDatabaseCommand.cs b/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindDatabaseCommand.cs index 2a26be8c..038db0fa 100644 --- a/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindDatabaseCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Unbind/UnbindDatabaseCommand.cs | |||
@@ -134,152 +134,7 @@ namespace WixToolset.Core.WindowsInstaller.Unbind | |||
134 | 134 | ||
135 | using (var tableView = this.Database.OpenExecuteView(String.Format(CultureInfo.InvariantCulture, "SELECT * FROM `{0}`", tableName))) | 135 | using (var tableView = this.Database.OpenExecuteView(String.Format(CultureInfo.InvariantCulture, "SELECT * FROM `{0}`", tableName))) |
136 | { | 136 | { |
137 | ColumnDefinition[] columns; | 137 | var tableDefinition = this.GetTableDefinition(tableName, tableView, validationView); |
138 | using (Record columnNameRecord = tableView.GetColumnInfo(MsiInterop.MSICOLINFONAMES), | ||
139 | columnTypeRecord = tableView.GetColumnInfo(MsiInterop.MSICOLINFOTYPES)) | ||
140 | { | ||
141 | // index the primary keys | ||
142 | var tablePrimaryKeys = new HashSet<string>(); | ||
143 | using (var primaryKeysRecord = this.Database.PrimaryKeys(tableName)) | ||
144 | { | ||
145 | var primaryKeysFieldCount = primaryKeysRecord.GetFieldCount(); | ||
146 | |||
147 | for (var i = 1; i <= primaryKeysFieldCount; i++) | ||
148 | { | ||
149 | tablePrimaryKeys.Add(primaryKeysRecord.GetString(i)); | ||
150 | } | ||
151 | } | ||
152 | |||
153 | var columnCount = columnNameRecord.GetFieldCount(); | ||
154 | columns = new ColumnDefinition[columnCount]; | ||
155 | for (var i = 1; i <= columnCount; i++) | ||
156 | { | ||
157 | var columnName = columnNameRecord.GetString(i); | ||
158 | var idtType = columnTypeRecord.GetString(i); | ||
159 | |||
160 | ColumnType columnType; | ||
161 | int length; | ||
162 | bool nullable; | ||
163 | |||
164 | var columnCategory = ColumnCategory.Unknown; | ||
165 | var columnModularizeType = ColumnModularizeType.None; | ||
166 | var primary = tablePrimaryKeys.Contains(columnName); | ||
167 | int? minValue = null; | ||
168 | int? maxValue = null; | ||
169 | string keyTable = null; | ||
170 | int? keyColumn = null; | ||
171 | string category = null; | ||
172 | string set = null; | ||
173 | string description = null; | ||
174 | |||
175 | // get the column type, length, and whether its nullable | ||
176 | switch (Char.ToLower(idtType[0], CultureInfo.InvariantCulture)) | ||
177 | { | ||
178 | case 'i': | ||
179 | columnType = ColumnType.Number; | ||
180 | break; | ||
181 | case 'l': | ||
182 | columnType = ColumnType.Localized; | ||
183 | break; | ||
184 | case 's': | ||
185 | columnType = ColumnType.String; | ||
186 | break; | ||
187 | case 'v': | ||
188 | columnType = ColumnType.Object; | ||
189 | break; | ||
190 | default: | ||
191 | // TODO: error | ||
192 | columnType = ColumnType.Unknown; | ||
193 | break; | ||
194 | } | ||
195 | length = Convert.ToInt32(idtType.Substring(1), CultureInfo.InvariantCulture); | ||
196 | nullable = Char.IsUpper(idtType[0]); | ||
197 | |||
198 | // try to get validation information | ||
199 | if (null != validationView) | ||
200 | { | ||
201 | using (var validationRecord = new Record(2)) | ||
202 | { | ||
203 | validationRecord.SetString(1, tableName); | ||
204 | validationRecord.SetString(2, columnName); | ||
205 | |||
206 | validationView.Execute(validationRecord); | ||
207 | } | ||
208 | |||
209 | using (var validationRecord = validationView.Fetch()) | ||
210 | { | ||
211 | if (null != validationRecord) | ||
212 | { | ||
213 | var validationNullable = validationRecord.GetString(3); | ||
214 | minValue = validationRecord.IsNull(4) ? null : (int?)validationRecord.GetInteger(4); | ||
215 | maxValue = validationRecord.IsNull(5) ? null : (int?)validationRecord.GetInteger(5); | ||
216 | keyTable = validationRecord.IsNull(6) ? null : validationRecord.GetString(6); | ||
217 | keyColumn = validationRecord.IsNull(7) ? null : (int?)validationRecord.GetInteger(7); | ||
218 | category = validationRecord.IsNull(8) ? null : validationRecord.GetString(8); | ||
219 | set = validationRecord.IsNull(9) ? null : validationRecord.GetString(9); | ||
220 | description = validationRecord.IsNull(10) ? null : validationRecord.GetString(10); | ||
221 | |||
222 | // check the validation nullable value against the column definition | ||
223 | if (null == validationNullable) | ||
224 | { | ||
225 | // TODO: warn for illegal validation nullable column | ||
226 | } | ||
227 | else if ((nullable && "Y" != validationNullable) || (!nullable && "N" != validationNullable)) | ||
228 | { | ||
229 | // TODO: warn for mismatch between column definition and validation nullable | ||
230 | } | ||
231 | |||
232 | // convert category to ColumnCategory | ||
233 | if (null != category) | ||
234 | { | ||
235 | try | ||
236 | { | ||
237 | columnCategory = (ColumnCategory)Enum.Parse(typeof(ColumnCategory), category, true); | ||
238 | } | ||
239 | catch (ArgumentException) | ||
240 | { | ||
241 | columnCategory = ColumnCategory.Unknown; | ||
242 | } | ||
243 | } | ||
244 | } | ||
245 | else | ||
246 | { | ||
247 | // TODO: warn about no validation information | ||
248 | } | ||
249 | } | ||
250 | } | ||
251 | |||
252 | // guess the modularization type | ||
253 | if ("Icon" == keyTable && 1 == keyColumn) | ||
254 | { | ||
255 | columnModularizeType = ColumnModularizeType.Icon; | ||
256 | } | ||
257 | else if ("Condition" == columnName) | ||
258 | { | ||
259 | columnModularizeType = ColumnModularizeType.Condition; | ||
260 | } | ||
261 | else if (ColumnCategory.Formatted == columnCategory || ColumnCategory.FormattedSDDLText == columnCategory) | ||
262 | { | ||
263 | columnModularizeType = ColumnModularizeType.Property; | ||
264 | } | ||
265 | else if (ColumnCategory.Identifier == columnCategory) | ||
266 | { | ||
267 | columnModularizeType = ColumnModularizeType.Column; | ||
268 | } | ||
269 | |||
270 | columns[i - 1] = new ColumnDefinition(columnName, columnType, length, primary, nullable, columnCategory, minValue, maxValue, keyTable, keyColumn, set, description, columnModularizeType, (ColumnType.Localized == columnType), true); | ||
271 | } | ||
272 | } | ||
273 | |||
274 | var tableDefinition = new TableDefinition(tableName, columns, false); | ||
275 | |||
276 | // use our table definitions if core properties are the same; this allows us to take advantage | ||
277 | // of wix concepts like localizable columns which current code assumes | ||
278 | if (this.TableDefinitions.Contains(tableName) && 0 == tableDefinition.CompareTo(this.TableDefinitions[tableName])) | ||
279 | { | ||
280 | tableDefinition = this.TableDefinitions[tableName]; | ||
281 | } | ||
282 | |||
283 | var table = new Table(tableDefinition); | 138 | var table = new Table(tableDefinition); |
284 | 139 | ||
285 | while (true) | 140 | while (true) |
@@ -437,6 +292,156 @@ namespace WixToolset.Core.WindowsInstaller.Unbind | |||
437 | return output; | 292 | return output; |
438 | } | 293 | } |
439 | 294 | ||
295 | private TableDefinition GetTableDefinition(string tableName, View tableView, View validationView) | ||
296 | { | ||
297 | ColumnDefinition[] columns; | ||
298 | using (Record columnNameRecord = tableView.GetColumnInfo(MsiInterop.MSICOLINFONAMES), | ||
299 | columnTypeRecord = tableView.GetColumnInfo(MsiInterop.MSICOLINFOTYPES)) | ||
300 | { | ||
301 | // index the primary keys | ||
302 | var tablePrimaryKeys = new HashSet<string>(); | ||
303 | using (var primaryKeysRecord = this.Database.PrimaryKeys(tableName)) | ||
304 | { | ||
305 | var primaryKeysFieldCount = primaryKeysRecord.GetFieldCount(); | ||
306 | |||
307 | for (var i = 1; i <= primaryKeysFieldCount; i++) | ||
308 | { | ||
309 | tablePrimaryKeys.Add(primaryKeysRecord.GetString(i)); | ||
310 | } | ||
311 | } | ||
312 | |||
313 | var columnCount = columnNameRecord.GetFieldCount(); | ||
314 | columns = new ColumnDefinition[columnCount]; | ||
315 | for (var i = 1; i <= columnCount; i++) | ||
316 | { | ||
317 | var columnName = columnNameRecord.GetString(i); | ||
318 | var idtType = columnTypeRecord.GetString(i); | ||
319 | |||
320 | ColumnType columnType; | ||
321 | int length; | ||
322 | bool nullable; | ||
323 | |||
324 | var columnCategory = ColumnCategory.Unknown; | ||
325 | var columnModularizeType = ColumnModularizeType.None; | ||
326 | var primary = tablePrimaryKeys.Contains(columnName); | ||
327 | int? minValue = null; | ||
328 | int? maxValue = null; | ||
329 | string keyTable = null; | ||
330 | int? keyColumn = null; | ||
331 | string category = null; | ||
332 | string set = null; | ||
333 | string description = null; | ||
334 | |||
335 | // get the column type, length, and whether its nullable | ||
336 | switch (Char.ToLower(idtType[0], CultureInfo.InvariantCulture)) | ||
337 | { | ||
338 | case 'i': | ||
339 | columnType = ColumnType.Number; | ||
340 | break; | ||
341 | case 'l': | ||
342 | columnType = ColumnType.Localized; | ||
343 | break; | ||
344 | case 's': | ||
345 | columnType = ColumnType.String; | ||
346 | break; | ||
347 | case 'v': | ||
348 | columnType = ColumnType.Object; | ||
349 | break; | ||
350 | default: | ||
351 | // TODO: error | ||
352 | columnType = ColumnType.Unknown; | ||
353 | break; | ||
354 | } | ||
355 | length = Convert.ToInt32(idtType.Substring(1), CultureInfo.InvariantCulture); | ||
356 | nullable = Char.IsUpper(idtType[0]); | ||
357 | |||
358 | // try to get validation information | ||
359 | if (null != validationView) | ||
360 | { | ||
361 | using (var validationRecord = new Record(2)) | ||
362 | { | ||
363 | validationRecord.SetString(1, tableName); | ||
364 | validationRecord.SetString(2, columnName); | ||
365 | |||
366 | validationView.Execute(validationRecord); | ||
367 | } | ||
368 | |||
369 | using (var validationRecord = validationView.Fetch()) | ||
370 | { | ||
371 | if (null != validationRecord) | ||
372 | { | ||
373 | var validationNullable = validationRecord.GetString(3); | ||
374 | minValue = validationRecord.IsNull(4) ? null : (int?)validationRecord.GetInteger(4); | ||
375 | maxValue = validationRecord.IsNull(5) ? null : (int?)validationRecord.GetInteger(5); | ||
376 | keyTable = validationRecord.IsNull(6) ? null : validationRecord.GetString(6); | ||
377 | keyColumn = validationRecord.IsNull(7) ? null : (int?)validationRecord.GetInteger(7); | ||
378 | category = validationRecord.IsNull(8) ? null : validationRecord.GetString(8); | ||
379 | set = validationRecord.IsNull(9) ? null : validationRecord.GetString(9); | ||
380 | description = validationRecord.IsNull(10) ? null : validationRecord.GetString(10); | ||
381 | |||
382 | // check the validation nullable value against the column definition | ||
383 | if (null == validationNullable) | ||
384 | { | ||
385 | // TODO: warn for illegal validation nullable column | ||
386 | } | ||
387 | else if ((nullable && "Y" != validationNullable) || (!nullable && "N" != validationNullable)) | ||
388 | { | ||
389 | // TODO: warn for mismatch between column definition and validation nullable | ||
390 | } | ||
391 | |||
392 | // convert category to ColumnCategory | ||
393 | if (null != category) | ||
394 | { | ||
395 | try | ||
396 | { | ||
397 | columnCategory = (ColumnCategory)Enum.Parse(typeof(ColumnCategory), category, true); | ||
398 | } | ||
399 | catch (ArgumentException) | ||
400 | { | ||
401 | columnCategory = ColumnCategory.Unknown; | ||
402 | } | ||
403 | } | ||
404 | } | ||
405 | else | ||
406 | { | ||
407 | // TODO: warn about no validation information | ||
408 | } | ||
409 | } | ||
410 | } | ||
411 | |||
412 | // guess the modularization type | ||
413 | if ("Icon" == keyTable && 1 == keyColumn) | ||
414 | { | ||
415 | columnModularizeType = ColumnModularizeType.Icon; | ||
416 | } | ||
417 | else if ("Condition" == columnName) | ||
418 | { | ||
419 | columnModularizeType = ColumnModularizeType.Condition; | ||
420 | } | ||
421 | else if (ColumnCategory.Formatted == columnCategory || ColumnCategory.FormattedSDDLText == columnCategory) | ||
422 | { | ||
423 | columnModularizeType = ColumnModularizeType.Property; | ||
424 | } | ||
425 | else if (ColumnCategory.Identifier == columnCategory) | ||
426 | { | ||
427 | columnModularizeType = ColumnModularizeType.Column; | ||
428 | } | ||
429 | |||
430 | columns[i - 1] = new ColumnDefinition(columnName, columnType, length, primary, nullable, columnCategory, minValue, maxValue, keyTable, keyColumn, set, description, columnModularizeType, (ColumnType.Localized == columnType), true); | ||
431 | } | ||
432 | } | ||
433 | |||
434 | var tableDefinition = new TableDefinition(tableName, columns, false); | ||
435 | |||
436 | // use our table definitions if core properties are the same; this allows us to take advantage | ||
437 | // of wix concepts like localizable columns which current code assumes | ||
438 | if (this.TableDefinitions.Contains(tableName) && 0 == tableDefinition.CompareTo(this.TableDefinitions[tableName])) | ||
439 | { | ||
440 | tableDefinition = this.TableDefinitions[tableName]; | ||
441 | } | ||
442 | return tableDefinition; | ||
443 | } | ||
444 | |||
440 | /// <summary> | 445 | /// <summary> |
441 | /// Generates the WixFile table based on a path to an admin image msi and an Output. | 446 | /// Generates the WixFile table based on a path to an admin image msi and an Output. |
442 | /// </summary> | 447 | /// </summary> |