// 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();
}
}
}
}