// -------------------------------------------------------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. // // // Information context surrounded data emitted from JET_PFNEMITLOGDATA. // // -------------------------------------------------------------------------------------------------------------------- namespace Microsoft.Isam.Esent.Interop.Windows8 { using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Runtime.InteropServices; /// /// Information context surrounded data emitted from JET_PFNEMITLOGDATA. /// [SuppressMessage( "Microsoft.StyleCop.CSharp.NamingRules", "SA1305:FieldNamesMustNotUseHungarianNotation", Justification = "This should match the name of the unmanaged structure.")] [SuppressMessage( "Microsoft.StyleCop.CSharp.NamingRules", "SA1307:AccessibleFieldsMustBeginWithUpperCaseLetter", Justification = "This should match the unmanaged API, which isn't capitalized.")] [StructLayout(LayoutKind.Sequential)] [Serializable] internal struct NATIVE_COMMIT_ID { /// /// Signature for this log sequence. /// public NATIVE_SIGNATURE signLog; /// /// Reserved value for proper alignment on x86. /// public int reserved; /// /// Commit-id for this commit transaction. /// public long commitId; } /// /// Information context surrounded data emitted from JET_PFNEMITLOGDATA. /// [SuppressMessage( "Microsoft.StyleCop.CSharp.NamingRules", "SA1300:ElementMustBeginWithUpperCaseLetter", Justification = "This should match the unmanaged API, which isn't capitalized.")] public class JET_COMMIT_ID : IComparable, IEquatable { /// /// Signature for this log sequence. /// private readonly JET_SIGNATURE signLog; /// /// Commit-id for this commit transaction. /// private readonly long commitId; /// /// Initializes a new instance of the class. /// /// The native version of the structure. /// to use as the data source. internal JET_COMMIT_ID(NATIVE_COMMIT_ID native) { this.signLog = new JET_SIGNATURE(native.signLog); this.commitId = native.commitId; } #if MANAGEDESENT_ON_CORECLR /// /// Initializes a new instance of the class. This /// is for testing purposes only. /// /// This is being implemented in new Windows UI only because the Desktop test /// code uses reflection to create the object, and the new Windows UI reflection does not /// appear to work in this scenario -- Activator.CreateInstance() reflection seems to only /// work with exising public constructors. /// The log signature for this sequence. /// The commit identifier for this commit transaction. internal JET_COMMIT_ID(JET_SIGNATURE signature, long commitId) { this.signLog = signature; this.commitId = commitId; } #endif // MANAGEDESENT_ON_CORECLR /// /// Determine whether one commitid is before another commitid. /// /// The first commitid to compare. /// The second commitid to compare. /// True if lhs comes before rhs. public static bool operator <(JET_COMMIT_ID lhs, JET_COMMIT_ID rhs) { return lhs.CompareTo(rhs) < 0; } /// /// Determine whether one commitid is before another commitid. /// /// The first commitid to compare. /// The second commitid to compare. /// True if lhs comes after rhs. public static bool operator >(JET_COMMIT_ID lhs, JET_COMMIT_ID rhs) { return lhs.CompareTo(rhs) > 0; } /// /// Determine whether one commitid is before another commitid. /// /// The first commitid to compare. /// The second commitid to compare. /// True if lhs comes before or equal to rhs. public static bool operator <=(JET_COMMIT_ID lhs, JET_COMMIT_ID rhs) { return lhs.CompareTo(rhs) <= 0; } /// /// Determine whether one commitid is before another commitid. /// /// The first commitid to compare. /// The second commitid to compare. /// True if lhs comes after or equal to rhs. public static bool operator >=(JET_COMMIT_ID lhs, JET_COMMIT_ID rhs) { return lhs.CompareTo(rhs) >= 0; } /// /// Determine whether one commitid is is equal to another commitid. /// /// The first commitid to compare. /// The second commitid to compare. /// True if lhs comes is equal to rhs. public static bool operator ==(JET_COMMIT_ID lhs, JET_COMMIT_ID rhs) { return lhs.CompareTo(rhs) == 0; } /// /// Determine whether one commitid is not equal to another commitid. /// /// The first commitid to compare. /// The second commitid to compare. /// True if lhs comes is not equal to rhs. public static bool operator !=(JET_COMMIT_ID lhs, JET_COMMIT_ID rhs) { return lhs.CompareTo(rhs) != 0; } /// /// Generate a string representation of the structure. /// /// The structure as a string. public override string ToString() { return string.Format( CultureInfo.InvariantCulture, "JET_COMMIT_ID({0}:{1}", this.signLog, this.commitId); } /// /// Returns a value comparing this instance with another. /// /// An instance to compare with this instance. /// /// A signed value representing the relative positions of the instances. /// public int CompareTo(JET_COMMIT_ID other) { if ((object)other == null) { return this.commitId > 0 ? 1 : 0; } if (this.signLog != other.signLog) { throw new ArgumentException("The commit-ids belong to different log-streams"); } return this.commitId.CompareTo(other.commitId); } /// /// 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 bool Equals(JET_COMMIT_ID other) { return this.CompareTo(other) == 0; } /// /// 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 || GetType() != obj.GetType()) { return false; } return this.CompareTo((JET_COMMIT_ID)obj) == 0; } /// /// Returns the hash code for this instance. /// /// The hash code for this instance. public override int GetHashCode() { return this.commitId.GetHashCode() ^ this.signLog.GetHashCode(); } /// /// Converts the class to a NATIVE_COMMIT_ID structure. /// /// A NATIVE_COMMIT_ID structure. internal NATIVE_COMMIT_ID GetNativeCommitId() { NATIVE_COMMIT_ID native = new NATIVE_COMMIT_ID(); native.signLog = this.signLog.GetNativeSignature(); native.commitId = checked((long)this.commitId); return native; } } }