//----------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. // //----------------------------------------------------------------------- #if !MANAGEDESENT_ON_WSA // Not exposed in MSDK namespace Microsoft.Isam.Esent.Interop { using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Runtime.InteropServices; /// /// The native version of the JET_INSTANCE_INFO structure. /// [StructLayout(LayoutKind.Sequential)] [SuppressMessage("Microsoft.StyleCop.CSharp.NamingRules", "SA1305:FieldNamesMustNotUseHungarianNotation", Justification = "This should match the unmanaged API, which isn't capitalized.")] [SuppressMessage( "Microsoft.StyleCop.CSharp.NamingRules", "SA1307:AccessibleFieldsMustBeginWithUpperCaseLetter", Justification = "This should match the unmanaged API, which isn't capitalized.")] internal unsafe struct NATIVE_INSTANCE_INFO { /// /// The JET_INSTANCE of the given instance. /// public IntPtr hInstanceId; /// /// The name of the database instance. This value can be NULL if the /// instance does not have a name. /// public IntPtr szInstanceName; /// /// The number of databases that are attached to the database instance. /// cDatabases also holds the size of the arrays of strings that are /// returned in szDatabaseFileName, szDatabaseDisplayName, and /// szDatabaseSLVFileName. /// public IntPtr cDatabases; /// /// An array of strings, each holding the file name of a database that /// is attached to the database instance. The array has cDatabases /// elements. /// public IntPtr* szDatabaseFileName; /// /// An array of strings, each holding the display name of a database. /// This string is always null. The array has cDatabases elements. /// public IntPtr* szDatabaseDisplayName; /// /// An array of strings, each holding the file name of the SLV file that /// is attached to the database instance. The array has cDatabases /// elements. SLV files are not supported, so this field should be ignored. /// [Obsolete("SLV files are not supported")] public IntPtr* szDatabaseSLVFileName; } /// /// Receives information about running database instances when used with the /// JetGetInstanceInfo and JetOSSnapshotFreeze functions. /// [SuppressMessage( "Microsoft.StyleCop.CSharp.NamingRules", "SA1300:ElementMustBeginWithUpperCaseLetter", Justification = "This should match the unmanaged API, which isn't capitalized.")] public class JET_INSTANCE_INFO : IEquatable { /// /// Collection of database file names. /// private ReadOnlyCollection databases; /// /// Initializes a new instance of the class. /// internal JET_INSTANCE_INFO() { } /// /// Initializes a new instance of the class. /// /// /// The instance. /// /// /// The name of the instance. /// /// /// The databases in the instance. /// internal JET_INSTANCE_INFO(JET_INSTANCE instance, string instanceName, string[] databases) { this.hInstanceId = instance; this.szInstanceName = instanceName; if (null == databases) { this.cDatabases = 0; this.databases = null; } else { this.cDatabases = databases.Length; this.databases = new ReadOnlyCollection(databases); } } /// /// Gets the JET_INSTANCE of the given instance. /// public JET_INSTANCE hInstanceId { get; private set; } /// /// Gets the name of the database instance. This value can be null if /// the instance does not have a name. /// public string szInstanceName { get; private set; } /// /// Gets the number of databases that are attached to the database instance. /// public int cDatabases { get; private set; } /// /// Gets a collection of strings, each holding the file name of a database /// that is attached to the database instance. The array has cDatabases /// elements. /// public IList szDatabaseFileName { get { return this.databases; } } /// /// Returns a value indicating whether this instance is equal /// to another instance. /// /// An object to compare with this instance. /// True if the two instances are equal. public override bool Equals(object obj) { if (obj == null || this.GetType() != obj.GetType()) { return false; } return this.Equals((JET_INSTANCE_INFO)obj); } /// /// Generate a string representation of the instance. /// /// The structure as a string. public override string ToString() { return string.Format(CultureInfo.InvariantCulture, "JET_INSTANCE_INFO({0})", this.szInstanceName); } /// /// Returns the hash code for this instance. /// /// The hash code for this instance. public override int GetHashCode() { int hash = this.hInstanceId.GetHashCode() ^ (this.szInstanceName ?? string.Empty).GetHashCode() ^ this.cDatabases << 20; for (int i = 0; i < this.cDatabases; ++i) { hash ^= this.szDatabaseFileName[i].GetHashCode(); } return hash; } /// /// Returns a value indicating whether this instance is equal /// to another instance. /// /// An instance to compare with this instance. /// True if the two instances are equal. public bool Equals(JET_INSTANCE_INFO other) { if (null == other) { return false; } if (this.hInstanceId != other.hInstanceId || this.szInstanceName != other.szInstanceName || this.cDatabases != other.cDatabases) { return false; } for (int i = 0; i < this.cDatabases; ++i) { if (this.szDatabaseFileName[i] != other.szDatabaseFileName[i]) { return false; } } return true; } /// /// Set the properties of the object from a native instance info where the /// strings in the NATIVE_INSTANCE_INFO are ASCII. /// /// The native instance info. internal void SetFromNativeAscii(NATIVE_INSTANCE_INFO native) { this.hInstanceId = new JET_INSTANCE { Value = native.hInstanceId }; this.szInstanceName = Marshal.PtrToStringAnsi(native.szInstanceName); this.cDatabases = checked((int)native.cDatabases); string[] files = new string[this.cDatabases]; unsafe { for (int i = 0; i < this.cDatabases; ++i) { files[i] = Marshal.PtrToStringAnsi(native.szDatabaseFileName[i]); } } this.databases = new ReadOnlyCollection(files); } /// /// Set the properties of the object from a native instance info where the /// strings in the NATIVE_INSTANCE_INFO are Unicode. /// /// The native instance info. internal void SetFromNativeUnicode(NATIVE_INSTANCE_INFO native) { this.hInstanceId = new JET_INSTANCE { Value = native.hInstanceId }; this.szInstanceName = Marshal.PtrToStringUni(native.szInstanceName); this.cDatabases = checked((int)native.cDatabases); string[] files = new string[this.cDatabases]; unsafe { for (int i = 0; i < this.cDatabases; ++i) { files[i] = Marshal.PtrToStringUni(native.szDatabaseFileName[i]); } } this.databases = new ReadOnlyCollection(files); } } } #endif // !MANAGEDESENT_ON_WSA