//-----------------------------------------------------------------------
// 
//     Copyright (c) Microsoft Corporation.
// 
//-----------------------------------------------------------------------
namespace Microsoft.Isam.Esent.Interop
{
    using System;
    using System.Diagnostics;
    using System.Diagnostics.CodeAnalysis;
    using System.Globalization;
    using System.Runtime.InteropServices;
    /// 
    /// The native version of the JET_RSTMAP 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 struct NATIVE_RSTMAP
    {
        /// 
        /// The old name/path of the database. Can be null if it is unchanged.
        /// 
        public IntPtr szDatabaseName;
        /// 
        ///  The current name/path of the database. Must not be null.
        /// 
        public IntPtr szNewDatabaseName;
        /// 
        /// Free the string memory.
        /// 
        public void FreeHGlobal()
        {
            LibraryHelpers.MarshalFreeHGlobal(this.szDatabaseName);
            LibraryHelpers.MarshalFreeHGlobal(this.szNewDatabaseName);
        }
    }
    /// 
    /// Enables the remapping of database file paths that are stored in the transaction logs during recovery.
    /// 
    [SuppressMessage(
        "Microsoft.StyleCop.CSharp.NamingRules",
        "SA1300:ElementMustBeginWithUpperCaseLetter",
        Justification = "This should match the unmanaged API, which isn't capitalized.")]
    [Serializable]
    public class JET_RSTMAP : IContentEquatable, IDeepCloneable
    {
        /// 
        /// The old name/path of the database. Can be null if it is unchanged.
        /// 
        private string databaseName;
        /// 
        ///  The current name/path of the database. Must not be null.
        /// 
        private string newDatabaseName;
        /// 
        /// Gets or sets the old name/path of the database. Can be null if it is unchanged.
        /// 
        public string szDatabaseName
        {
            [DebuggerStepThrough]
            get { return this.databaseName; }
            set { this.databaseName = value; }
        }
        /// 
        ///  Gets or sets the current name/path of the database. Must not be null.
        /// 
        public string szNewDatabaseName
        {
            [DebuggerStepThrough]
            get { return this.newDatabaseName; }
            set { this.newDatabaseName = value; }
        }
        /// 
        /// Returns a  that represents the current .
        /// 
        /// 
        /// A  that represents the current .
        /// 
        public override string ToString()
        {
            return string.Format(
                CultureInfo.InvariantCulture,
                "JET_RSTINFO(szDatabaseName={0},szNewDatabaseName={1})",
                this.szDatabaseName,
                this.szNewDatabaseName);
        }
        /// 
        /// 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 ContentEquals(JET_RSTMAP other)
        {
            if (null == other)
            {
                return false;
            }
            return string.Equals(this.szDatabaseName, other.szDatabaseName, StringComparison.OrdinalIgnoreCase)
                   && string.Equals(this.szNewDatabaseName, other.szNewDatabaseName, StringComparison.OrdinalIgnoreCase);
        }
        /// 
        /// Returns a deep copy of the object.
        /// 
        /// A deep copy of the object.
        public JET_RSTMAP DeepClone()
        {
            return (JET_RSTMAP)this.MemberwiseClone();
        }
        /// 
        /// Get a native version of this managed structure.
        /// 
        /// A native version of this object.
        internal NATIVE_RSTMAP GetNativeRstmap()
        {
            return new NATIVE_RSTMAP
            {
                // Don't pin this memory -- these structures are used by JetInit3,
                // which can run for a long time and we don't want to fragment the
                // heap. We do have to remember to free the memory though.
                szDatabaseName = LibraryHelpers.MarshalStringToHGlobalUni(this.szDatabaseName),
                szNewDatabaseName = LibraryHelpers.MarshalStringToHGlobalUni(this.szNewDatabaseName),
            };
        }
    }
}