//-----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation.
//
//-----------------------------------------------------------------------
namespace Microsoft.Isam.Esent.Interop
{
using System;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Runtime.InteropServices;
///
/// The native (unmanaged) version of the
/// class.
///
[StructLayout(LayoutKind.Sequential)]
[SuppressMessage(
"Microsoft.StyleCop.CSharp.NamingRules",
"SA1307:AccessibleFieldsMustBeginWithUpperCaseLetter",
Justification = "This should match the unmanaged API, which isn't capitalized.")]
internal unsafe struct NATIVE_ENUMCOLUMNID
{
///
/// Column ID to enumerate.
///
public uint columnid;
///
/// Count of column values to enumerate.
///
public uint ctagSequence;
///
/// Column values to enumerate.
///
public uint* rgtagSequence;
}
///
/// Enumerates a specific set of columns and, optionally, a specific set
/// of multiple values for those columns when the JetEnumerateColumns
/// function is used. JetEnumerateColumns optionally takes an array of
/// JET_ENUMCOLUMNID structures.
///
[SuppressMessage(
"Microsoft.StyleCop.CSharp.NamingRules",
"SA1300:ElementMustBeginWithUpperCaseLetter",
Justification = "This should match the unmanaged API, which isn't capitalized.")]
public class JET_ENUMCOLUMNID
{
///
/// Gets or sets the columnid ID to enumerate.
///
///
/// If the column ID is 0 (zero) then the enumeration of this column is
/// skipped and a corresponding slot in the output array of JET_ENUMCOLUMN
/// structures will be generated with a column state of JET_wrnColumnSkipped.
///
public JET_COLUMNID columnid { get; set; }
///
/// Gets or sets the count of column values (by one-based index) to
/// enumerate for the specified column ID. If ctagSequence is 0 (zero) then
/// rgtagSequence is ignored and all column values for the specified column
/// ID will be enumerated.
///
public int ctagSequence { get; set; }
///
/// Gets or sets the array of one-based indices into the array of column values for a
/// given column. A single element is an itagSequence which is defined in
/// JET_RETRIEVECOLUMN. An itagSequence of 0 (zero) means "skip". An
/// itagSequence of 1 means return the first column value of the column,
/// 2 means the second, and so on.
///
public int[] rgtagSequence { get; set; }
///
/// Returns a that represents the current .
///
///
/// A that represents the current .
///
public override string ToString()
{
return string.Format(CultureInfo.InvariantCulture, "JET_ENUMCOLUMNID(0x{0:x})", this.columnid);
}
///
/// Check to see if ctagSequence is negative or greater than the length
/// of rgtagSequence.
///
internal void CheckDataSize()
{
if (this.ctagSequence < 0)
{
throw new ArgumentOutOfRangeException("ctagSequence", "ctagSequence cannot be negative");
}
if ((null == this.rgtagSequence && 0 != this.ctagSequence) || (null != this.rgtagSequence && this.ctagSequence > this.rgtagSequence.Length))
{
throw new ArgumentOutOfRangeException(
"ctagSequence",
this.ctagSequence,
"cannot be greater than the length of the pvData");
}
}
///
/// Gets the native (interop) version of this object.
///
/// A NATIVE_ENUMCOLUMNID representing this object.
internal NATIVE_ENUMCOLUMNID GetNativeEnumColumnid()
{
this.CheckDataSize();
var value = new NATIVE_ENUMCOLUMNID
{
columnid = this.columnid.Value,
ctagSequence = checked((uint)this.ctagSequence)
};
return value;
}
}
}