aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core.WindowsInstaller/Msi
diff options
context:
space:
mode:
Diffstat (limited to 'src/WixToolset.Core.WindowsInstaller/Msi')
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Msi/Database.cs65
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Msi/WixInvalidIdtException.cs33
2 files changed, 39 insertions, 59 deletions
diff --git a/src/WixToolset.Core.WindowsInstaller/Msi/Database.cs b/src/WixToolset.Core.WindowsInstaller/Msi/Database.cs
index 801ebdde..ccb0e6cf 100644
--- a/src/WixToolset.Core.WindowsInstaller/Msi/Database.cs
+++ b/src/WixToolset.Core.WindowsInstaller/Msi/Database.cs
@@ -3,13 +3,11 @@
3namespace WixToolset.Msi 3namespace WixToolset.Msi
4{ 4{
5 using System; 5 using System;
6 using System.ComponentModel;
7 using System.Globalization; 6 using System.Globalization;
8 using System.IO; 7 using System.IO;
9 using System.Text;
10 using System.Threading; 8 using System.Threading;
11 using WixToolset.Data;
12 using WixToolset.Core.Native; 9 using WixToolset.Core.Native;
10 using WixToolset.Data;
13 11
14 /// <summary> 12 /// <summary>
15 /// Wrapper class for managing MSI API database handles. 13 /// Wrapper class for managing MSI API database handles.
@@ -25,8 +23,7 @@ namespace WixToolset.Msi
25 /// <param name="type">Persist mode to use when opening the database.</param> 23 /// <param name="type">Persist mode to use when opening the database.</param>
26 public Database(string path, OpenDatabase type) 24 public Database(string path, OpenDatabase type)
27 { 25 {
28 uint handle = 0; 26 int error = MsiInterop.MsiOpenDatabase(path, new IntPtr((int)type), out var handle);
29 int error = MsiInterop.MsiOpenDatabase(path, new IntPtr((int)type), out handle);
30 if (0 != error) 27 if (0 != error)
31 { 28 {
32 throw new MsiException(error); 29 throw new MsiException(error);
@@ -153,9 +150,9 @@ namespace WixToolset.Msi
153 /// <param name="fileName">Specifies the name of the exported table archive file.</param> 150 /// <param name="fileName">Specifies the name of the exported table archive file.</param>
154 public void Export(string tableName, string folderPath, string fileName) 151 public void Export(string tableName, string folderPath, string fileName)
155 { 152 {
156 if (null == folderPath || 0 == folderPath.Length) 153 if (String.IsNullOrEmpty(folderPath))
157 { 154 {
158 folderPath = System.Environment.CurrentDirectory; 155 folderPath = Environment.CurrentDirectory;
159 } 156 }
160 157
161 int error = MsiInterop.MsiDatabaseExport(this.Handle, tableName, folderPath, fileName); 158 int error = MsiInterop.MsiDatabaseExport(this.Handle, tableName, folderPath, fileName);
@@ -241,63 +238,13 @@ namespace WixToolset.Msi
241 /// primary key columns for a specified table.</returns> 238 /// primary key columns for a specified table.</returns>
242 public Record PrimaryKeys(string tableName) 239 public Record PrimaryKeys(string tableName)
243 { 240 {
244 uint recordHandle; 241 var error = MsiInterop.MsiDatabaseGetPrimaryKeys(this.Handle, tableName, out var recordHandle);
245 int error = MsiInterop.MsiDatabaseGetPrimaryKeys(this.Handle, tableName, out recordHandle); 242 if (error != 0)
246 if (0 != error)
247 { 243 {
248 throw new MsiException(error); 244 throw new MsiException(error);
249 } 245 }
250 246
251 return new Record(recordHandle); 247 return new Record(recordHandle);
252 } 248 }
253
254 /// <summary>
255 /// Imports a table into the database.
256 /// </summary>
257 /// <param name="codepage">Codepage of the database to import table to.</param>
258 /// <param name="table">Table to import into database.</param>
259 /// <param name="baseDirectory">The base directory where intermediate files are created.</param>
260 /// <param name="keepAddedColumns">Whether to keep columns added in a transform.</param>
261 public void ImportTable(int codepage, Table table, string baseDirectory, bool keepAddedColumns)
262 {
263 // write out the table to an IDT file
264 string idtPath = Path.Combine(baseDirectory, String.Concat(table.Name, ".idt"));
265 Encoding encoding;
266
267 // If UTF8 encoding, use the UTF8-specific constructor to avoid writing
268 // the byte order mark at the beginning of the file
269 if (Encoding.UTF8.CodePage == codepage)
270 {
271 encoding = new UTF8Encoding(false, true);
272 }
273 else
274 {
275 if (0 == codepage)
276 {
277 codepage = Encoding.ASCII.CodePage;
278 }
279
280 encoding = Encoding.GetEncoding(codepage, new EncoderExceptionFallback(), new DecoderExceptionFallback());
281 }
282
283 using (StreamWriter idtWriter = new StreamWriter(idtPath, false, encoding))
284 {
285 table.ToIdtDefinition(idtWriter, keepAddedColumns);
286 }
287
288 // try to import the table into the MSI
289 try
290 {
291 this.Import(idtPath);
292 }
293 catch (WixInvalidIdtException)
294 {
295 table.ValidateRows();
296
297 // If ValidateRows finds anything it doesn't like, it throws. Otherwise, we'll
298 // throw WixInvalidIdtException here which is caught in light and turns off tidy.
299 throw new WixInvalidIdtException(idtPath, table.Name);
300 }
301 }
302 } 249 }
303} 250}
diff --git a/src/WixToolset.Core.WindowsInstaller/Msi/WixInvalidIdtException.cs b/src/WixToolset.Core.WindowsInstaller/Msi/WixInvalidIdtException.cs
new file mode 100644
index 00000000..a603d5a7
--- /dev/null
+++ b/src/WixToolset.Core.WindowsInstaller/Msi/WixInvalidIdtException.cs
@@ -0,0 +1,33 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Msi
4{
5 using System;
6 using WixToolset.Data;
7
8 /// <summary>
9 /// WiX invalid idt exception.
10 /// </summary>
11 [Serializable]
12 public sealed class WixInvalidIdtException : WixException
13 {
14 /// <summary>
15 /// Instantiate a new WixInvalidIdtException.
16 /// </summary>
17 /// <param name="idtFile">The invalid idt file.</param>
18 public WixInvalidIdtException(string idtFile) :
19 base(WixDataErrors.InvalidIdt(new SourceLineNumber(idtFile), idtFile))
20 {
21 }
22
23 /// <summary>
24 /// Instantiate a new WixInvalidIdtException.
25 /// </summary>
26 /// <param name="idtFile">The invalid idt file.</param>
27 /// <param name="tableName">The table name of the invalid idt file.</param>
28 public WixInvalidIdtException(string idtFile, string tableName) :
29 base(WixDataErrors.InvalidIdt(new SourceLineNumber(idtFile), idtFile, tableName))
30 {
31 }
32 }
33}