// 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. namespace WixToolset.Dtf.WindowsInstaller { using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Diagnostics.CodeAnalysis; public partial class Database { /// /// Gets a View object representing the query specified by a SQL string. /// /// SQL query string, which may contain format items /// Zero or more objects to format /// A View object representing the query specified by a SQL string /// the SQL syntax is invalid /// the Database handle is invalid ///

/// The parameter is formatted using . ///

/// The View object should be d after use. /// It is best that the handle be closed manually as soon as it is no longer /// needed, as leaving lots of unused handles open can degrade performance. ///

/// Win32 MSI API: /// MsiDatabaseOpenView ///

public View OpenView(string sqlFormat, params object[] args) { if (String.IsNullOrEmpty(sqlFormat)) { throw new ArgumentNullException("sqlFormat"); } string sql = (args == null || args.Length == 0 ? sqlFormat : String.Format(CultureInfo.InvariantCulture, sqlFormat, args)); int viewHandle; uint ret = RemotableNativeMethods.MsiDatabaseOpenView((int) this.Handle, sql, out viewHandle); if (ret != 0) { throw InstallerException.ExceptionFromReturnCode(ret); } return new View((IntPtr) viewHandle, sql, this); } /// /// Executes the query specified by a SQL string. The query may not be a SELECT statement. /// /// SQL query string, which may contain format items /// Zero or more objects to format /// the SQL syntax is invalid /// the View could not be executed /// the Database handle is invalid ///

/// The parameter is formatted using /// . ///

/// Win32 MSI APIs: /// MsiDatabaseOpenView, /// MsiViewExecute ///

public void Execute(string sqlFormat, params object[] args) { if (String.IsNullOrEmpty(sqlFormat)) { throw new ArgumentNullException("sqlFormat"); } this.Execute( args == null || args.Length == 0 ? sqlFormat : String.Format(CultureInfo.InvariantCulture, sqlFormat, args), (Record) null); } /// /// Executes the query specified by a SQL string. The query may not be a SELECT statement. /// /// SQL query string /// Optional Record object containing the values that replace /// the parameter tokens (?) in the SQL query. /// the SQL syntax is invalid /// the View could not be executed /// the Database handle is invalid ///

/// Win32 MSI APIs: /// MsiDatabaseOpenView, /// MsiViewExecute ///

public void Execute(string sql, Record record) { if (String.IsNullOrEmpty(sql)) { throw new ArgumentNullException("sql"); } using (View view = this.OpenView(sql)) { view.Execute(record); } } /// /// Executes the specified SQL SELECT query and returns all results. /// /// SQL query string, which may contain format items /// Zero or more objects to format /// All results combined into an array /// the SQL syntax is invalid /// the View could not be executed /// the Database handle is invalid ///

/// The parameter is formatted using /// . ///

/// Multiple rows columns will be collapsed into a single one-dimensional list. ///

/// Win32 MSI APIs: /// MsiDatabaseOpenView, /// MsiViewExecute, /// MsiViewFetch ///

public IList ExecuteQuery(string sqlFormat, params object[] args) { if (String.IsNullOrEmpty(sqlFormat)) { throw new ArgumentNullException("sqlFormat"); } return this.ExecuteQuery( args == null || args.Length == 0 ? sqlFormat : String.Format(CultureInfo.InvariantCulture, sqlFormat, args), (Record) null); } /// /// Executes the specified SQL SELECT query and returns all results. /// /// SQL SELECT query string /// Optional Record object containing the values that replace /// the parameter tokens (?) in the SQL query. /// All results combined into an array /// the SQL syntax is invalid /// the View could not be executed /// the Database handle is invalid ///

/// Multiple rows columns will be collapsed into a single one-dimensional list. ///

/// Win32 MSI APIs: /// MsiDatabaseOpenView, /// MsiViewExecute, /// MsiViewFetch ///

public IList ExecuteQuery(string sql, Record record) { if (String.IsNullOrEmpty(sql)) { throw new ArgumentNullException("sql"); } using (View view = this.OpenView(sql)) { view.Execute(record); IList results = new ArrayList(); int fieldCount = 0; foreach (Record rec in view) using (rec) { if (fieldCount == 0) fieldCount = rec.FieldCount; for (int i = 1; i <= fieldCount; i++) { results.Add(rec[i]); } } return results; } } /// /// Executes the specified SQL SELECT query and returns all results as integers. /// /// SQL query string, which may contain format items /// Zero or more objects to format /// All results combined into an array /// the SQL syntax is invalid /// the View could not be executed /// the Database handle is invalid ///

/// The parameter is formatted using /// . ///

/// Multiple rows columns will be collapsed into a single one-dimensional list. ///

/// Win32 MSI APIs: /// MsiDatabaseOpenView, /// MsiViewExecute, /// MsiViewFetch ///

public IList ExecuteIntegerQuery(string sqlFormat, params object[] args) { if (String.IsNullOrEmpty(sqlFormat)) { throw new ArgumentNullException("sqlFormat"); } return this.ExecuteIntegerQuery( args == null || args.Length == 0 ? sqlFormat : String.Format(CultureInfo.InvariantCulture, sqlFormat, args), (Record) null); } /// /// Executes the specified SQL SELECT query and returns all results as integers. /// /// SQL SELECT query string /// Optional Record object containing the values that replace /// the parameter tokens (?) in the SQL query. /// All results combined into an array /// the SQL syntax is invalid /// the View could not be executed /// the Database handle is invalid ///

/// Multiple rows columns will be collapsed into a single one-dimensional list. ///

/// Win32 MSI APIs: /// MsiDatabaseOpenView, /// MsiViewExecute, /// MsiViewFetch ///

public IList ExecuteIntegerQuery(string sql, Record record) { if (String.IsNullOrEmpty(sql)) { throw new ArgumentNullException("sql"); } using (View view = this.OpenView(sql)) { view.Execute(record); IList results = new List(); int fieldCount = 0; foreach (Record rec in view) using (rec) { if (fieldCount == 0) fieldCount = rec.FieldCount; for (int i = 1; i <= fieldCount; i++) { results.Add(rec.GetInteger(i)); } } return results; } } /// /// Executes the specified SQL SELECT query and returns all results as strings. /// /// SQL query string, which may contain format items /// Zero or more objects to format /// All results combined into an array /// the SQL syntax is invalid /// the View could not be executed /// the Database handle is invalid ///

/// The parameter is formatted using /// . ///

/// Multiple rows columns will be collapsed into a single on-dimensional list. ///

/// Win32 MSI APIs: /// MsiDatabaseOpenView, /// MsiViewExecute, /// MsiViewFetch ///

public IList ExecuteStringQuery(string sqlFormat, params object[] args) { if (String.IsNullOrEmpty(sqlFormat)) { throw new ArgumentNullException("sqlFormat"); } return this.ExecuteStringQuery( args == null || args.Length == 0 ? sqlFormat : String.Format(CultureInfo.InvariantCulture, sqlFormat, args), (Record) null); } /// /// Executes the specified SQL SELECT query and returns all results as strings. /// /// SQL SELECT query string /// Optional Record object containing the values that replace /// the parameter tokens (?) in the SQL query. /// All results combined into an array /// the SQL syntax is invalid /// the View could not be executed /// the Database handle is invalid ///

/// Multiple rows columns will be collapsed into a single on-dimensional list. ///

/// Win32 MSI APIs: /// MsiDatabaseOpenView, /// MsiViewExecute, /// MsiViewFetch ///

public IList ExecuteStringQuery(string sql, Record record) { if (String.IsNullOrEmpty(sql)) { throw new ArgumentNullException("sql"); } using (View view = this.OpenView(sql)) { view.Execute(record); IList results = new List(); int fieldCount = 0; foreach (Record rec in view) using (rec) { if (fieldCount == 0) fieldCount = rec.FieldCount; for (int i = 1; i <= fieldCount; i++) { results.Add(rec.GetString(i)); } } return results; } } /// /// Executes the specified SQL SELECT query and returns a single result. /// /// SQL query string, which may contain format items /// Zero or more objects to format /// First field of the first result /// the SQL syntax is invalid /// the View could not be executed /// or the query returned 0 results /// the Database handle is invalid ///

/// The parameter is formatted using /// . ///

/// Win32 MSI APIs: /// MsiDatabaseOpenView, /// MsiViewExecute, /// MsiViewFetch ///

public object ExecuteScalar(string sqlFormat, params object[] args) { if (String.IsNullOrEmpty(sqlFormat)) { throw new ArgumentNullException("sqlFormat"); } return this.ExecuteScalar( args == null || args.Length == 0 ? sqlFormat : String.Format(CultureInfo.InvariantCulture, sqlFormat, args), (Record) null); } /// /// Executes the specified SQL SELECT query and returns a single result. /// /// SQL SELECT query string /// Optional Record object containing the values that replace /// the parameter tokens (?) in the SQL query. /// First field of the first result /// the SQL syntax is invalid /// the View could not be executed /// or the query returned 0 results /// the Database handle is invalid ///

/// Win32 MSI APIs: /// MsiDatabaseOpenView, /// MsiViewExecute, /// MsiViewFetch ///

public object ExecuteScalar(string sql, Record record) { if (String.IsNullOrEmpty(sql)) { throw new ArgumentNullException("sql"); } View view = this.OpenView(sql); Record rec = null; try { view.Execute(record); rec = view.Fetch(); if (rec == null) { throw InstallerException.ExceptionFromReturnCode((uint) NativeMethods.Error.NO_MORE_ITEMS); } return rec[1]; } finally { if (rec != null) rec.Close(); view.Close(); } } } }