//----------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. // //----------------------------------------------------------------------- namespace Microsoft.Isam.Esent.Interop { using System.Text; using Microsoft.Isam.Esent.Interop.Implementation; /// /// Base class for enumerators that return ColumnInfo objects. Subclasses differ /// by how they open the table. /// internal abstract class ColumnInfoEnumerator : TableEnumerator { /// /// Initializes a new instance of the class. /// /// /// The session to use. /// protected ColumnInfoEnumerator(JET_SESID sesid) : base(sesid) { } /// /// Gets or sets the columnlist used to retrieve data. /// protected JET_COLUMNLIST Columnlist { get; set; } /// /// Gets the entry the cursor is currently positioned on. /// /// The entry the cursor is currently positioned on. protected override ColumnInfo GetCurrent() { return GetColumnInfoFromColumnlist(this.Sesid, this.Columnlist); } /// /// Create a ColumnInfo object from the data in the current JET_COLUMNLIST entry. /// /// The session to use. /// The columnlist to take the data from. /// A ColumnInfo object containing the information from that record. private static ColumnInfo GetColumnInfoFromColumnlist(JET_SESID sesid, JET_COLUMNLIST columnlist) { // As of Sep 2015, JetGetColumnInfoW is only called for Win8+. Even though Unicode should have // worked in Win7, it wasn't reliable until Win8. Encoding encodingOfTextColumns = EsentVersion.SupportsWindows8Features ? Encoding.Unicode : LibraryHelpers.EncodingASCII; string name = Api.RetrieveColumnAsString( sesid, columnlist.tableid, columnlist.columnidcolumnname, encodingOfTextColumns, RetrieveColumnGrbit.None); name = StringCache.TryToIntern(name); var columnidValue = (uint)Api.RetrieveColumnAsUInt32(sesid, columnlist.tableid, columnlist.columnidcolumnid); var coltypValue = (uint)Api.RetrieveColumnAsUInt32(sesid, columnlist.tableid, columnlist.columnidcoltyp); uint codepageValue = (ushort)Api.RetrieveColumnAsUInt16(sesid, columnlist.tableid, columnlist.columnidCp); var maxLength = (uint)Api.RetrieveColumnAsUInt32(sesid, columnlist.tableid, columnlist.columnidcbMax); byte[] defaultValue = Api.RetrieveColumn(sesid, columnlist.tableid, columnlist.columnidDefault); var grbitValue = (uint)Api.RetrieveColumnAsUInt32(sesid, columnlist.tableid, columnlist.columnidgrbit); return new ColumnInfo( name, new JET_COLUMNID { Value = columnidValue }, (JET_coltyp)coltypValue, (JET_CP)codepageValue, unchecked((int)maxLength), defaultValue, (ColumndefGrbit)grbitValue); } } }