//-----------------------------------------------------------------------
// 
//     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;
    using Microsoft.Isam.Esent.Interop.Implementation;
    /// 
    /// The native version of the  structure. This includes callbacks,
    /// space hints, and uses NATIVE_INDEXCREATE4.
    /// 
    [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_TABLECREATE4
    {
        /// 
        /// Size of the structure.
        /// 
        public uint cbStruct;
        /// 
        /// Name of the table to create.
        /// 
        [MarshalAs(UnmanagedType.LPWStr)]
        public string szTableName;
        /// 
        /// Name of the table from which to inherit base DDL.
        /// 
        [MarshalAs(UnmanagedType.LPWStr)]
        public string szTemplateTableName;
        /// 
        /// Initial pages to allocate for table.
        /// 
        public uint ulPages;
        /// 
        /// Table density.
        /// 
        public uint ulDensity;
        /// 
        /// Array of column creation info.
        /// 
        public NATIVE_COLUMNCREATE* rgcolumncreate;
        /// 
        /// Number of columns to create.
        /// 
        public uint cColumns;
        /// 
        /// Array of indices to create, pointer to .
        /// 
        public IntPtr rgindexcreate;
        /// 
        /// Number of indices to create.
        /// 
        public uint cIndexes;
        /// 
        /// Callback function to use for the table.
        /// 
        [MarshalAs(UnmanagedType.LPWStr)]
        public string szCallback;
        /// 
        /// Type of the callback function.
        /// 
        public JET_cbtyp cbtyp;
        /// 
        /// Table options.
        /// 
        public uint grbit;
        /// 
        /// Space allocation, maintenance, and usage hints for default sequential index.
        /// 
        public NATIVE_SPACEHINTS* pSeqSpacehints;
        /// 
        /// Space allocation, maintenance, and usage hints for Separated LV tree.
        /// 
        public NATIVE_SPACEHINTS* pLVSpacehints;
        /// 
        /// Heuristic size to separate a intrinsic LV from the primary record.
        /// 
        public uint cbSeparateLV;
        /// 
        /// Returned tableid.
        /// 
        public IntPtr tableid;
        /// 
        /// Count of objects created (columns+table+indexes+callbacks).
        /// 
        public uint cCreated;
    }
    /// 
    /// Contains the information needed to create a table in an ESE database.
    /// 
    public partial class JET_TABLECREATE : IContentEquatable, IDeepCloneable
    {
        /// 
        /// Gets the native (interop) version of this object. The following members are
        /// NOT converted: , ,
        /// , and .
        /// 
        /// The native (interop) version of this object.
        internal NATIVE_TABLECREATE4 GetNativeTableCreate4()
        {
            this.CheckMembersAreValid();
            var native = new NATIVE_TABLECREATE4();
            native.cbStruct = checked((uint)Marshal.SizeOf(typeof(NATIVE_TABLECREATE4)));
            native.szTableName = this.szTableName;
            native.szTemplateTableName = this.szTemplateTableName;
            native.ulPages = checked((uint)this.ulPages);
            native.ulDensity = checked((uint)this.ulDensity);
            // native.rgcolumncreate is done at pinvoke time.
            native.cColumns = checked((uint)this.cColumns);
            // native.rgindexcreate is done at pinvoke time.
            native.cIndexes = checked((uint)this.cIndexes);
            native.szCallback = this.szCallback;
            native.cbtyp = this.cbtyp;
            native.grbit = checked((uint)this.grbit);
            // native.pSeqSpacehints is done at pinvoke time.
            // native.pLVSpacehints is done at pinvoke time.
            native.cbSeparateLV = checked((uint)this.cbSeparateLV);
            native.tableid = this.tableid.Value;
            native.cCreated = checked((uint)this.cCreated);
            return native;
        }
    }
}