public void Setup() { this.managed = new JET_UNICODEINDEX() { szLocaleName = LocaleName, dwMapFlags = 0x400, }; this.native = this.managed.GetNativeUnicodeIndex2(); }
public void VerifyUnicodeIndexConversionToNative2ThrowsWithLcid() { var unicodeIndexWithLcid = new JET_UNICODEINDEX() { lcid = 1001, dwMapFlags = 0x30403, }; try { NATIVE_UNICODEINDEX2 unicodeindex2 = unicodeIndexWithLcid.GetNativeUnicodeIndex2(); Assert.Fail("The conversion should have thrown an ArgumentException!"); } catch (ArgumentException) { } }
/// <summary> /// Make native indexcreate structures from the managed ones. /// </summary> /// <param name="managedIndexCreates">Index create structures to convert.</param> /// <param name="handles">The handle collection used to pin the data.</param> /// <returns>Pinned native versions of the index creates.</returns> private static unsafe NATIVE_INDEXCREATE3[] GetNativeIndexCreate3s( IList <JET_INDEXCREATE> managedIndexCreates, ref GCHandleCollection handles) { NATIVE_INDEXCREATE3[] nativeIndices = null; if (managedIndexCreates != null && managedIndexCreates.Count > 0) { nativeIndices = new NATIVE_INDEXCREATE3[managedIndexCreates.Count]; for (int i = 0; i < managedIndexCreates.Count; ++i) { nativeIndices[i] = managedIndexCreates[i].GetNativeIndexcreate3(); if (null != managedIndexCreates[i].pidxUnicode) { NATIVE_UNICODEINDEX2 unicode = managedIndexCreates[i].pidxUnicode.GetNativeUnicodeIndex2(); unicode.szLocaleName = handles.Add(Util.ConvertToNullTerminatedUnicodeByteArray(managedIndexCreates[i].pidxUnicode.GetEffectiveLocaleName())); nativeIndices[i].pidxUnicode = (NATIVE_UNICODEINDEX2 *)handles.Add(unicode); nativeIndices[i].grbit |= (uint)VistaGrbits.IndexUnicode; } nativeIndices[i].szKey = handles.Add(Util.ConvertToNullTerminatedUnicodeByteArray(managedIndexCreates[i].szKey)); nativeIndices[i].szIndexName = handles.Add(Util.ConvertToNullTerminatedUnicodeByteArray(managedIndexCreates[i].szIndexName)); nativeIndices[i].rgconditionalcolumn = GetNativeConditionalColumns(managedIndexCreates[i].rgconditionalcolumn, true, ref handles); // Convert pSpaceHints. if (managedIndexCreates[i].pSpaceHints != null) { NATIVE_SPACEHINTS nativeSpaceHints = managedIndexCreates[i].pSpaceHints.GetNativeSpaceHints(); nativeIndices[i].pSpaceHints = handles.Add(nativeSpaceHints); } } } return(nativeIndices); }
/// <summary> /// Creates a temporary table with a single index. A temporary table /// stores and retrieves records just like an ordinary table created /// using JetCreateTableColumnIndex. However, temporary tables are /// much faster than ordinary tables due to their volatile nature. /// They can also be used to very quickly sort and perform duplicate /// removal on record sets when accessed in a purely sequential manner. /// </summary> /// <param name="sesid">The session to use.</param> /// <param name="temporarytable"> /// Description of the temporary table to create on input. After a /// successful call, the structure contains the handle to the temporary /// table and column identifications. /// </param> /// <returns>An error code.</returns> public int JetOpenTemporaryTable2(JET_SESID sesid, JET_OPENTEMPORARYTABLE temporarytable) { TraceFunctionCall(); this.CheckSupportsWindows8Features("JetOpenTemporaryTable2"); CheckNotNull(temporarytable, "temporarytable"); NATIVE_OPENTEMPORARYTABLE2 nativetemporarytable = temporarytable.GetNativeOpenTemporaryTable2(); var nativecolumnids = new uint[nativetemporarytable.ccolumn]; NATIVE_COLUMNDEF[] nativecolumndefs = GetNativecolumndefs(temporarytable.prgcolumndef, temporarytable.ccolumn); unsafe { using (var gchandlecollection = new GCHandleCollection()) { // Pin memory nativetemporarytable.prgcolumndef = (NATIVE_COLUMNDEF *)gchandlecollection.Add(nativecolumndefs); nativetemporarytable.rgcolumnid = (uint *)gchandlecollection.Add(nativecolumnids); if (null != temporarytable.pidxunicode) { NATIVE_UNICODEINDEX2 unicode = temporarytable.pidxunicode.GetNativeUnicodeIndex2(); unicode.szLocaleName = gchandlecollection.Add(Util.ConvertToNullTerminatedUnicodeByteArray(temporarytable.pidxunicode.GetEffectiveLocaleName())); nativetemporarytable.pidxunicode = (NATIVE_UNICODEINDEX2 *)gchandlecollection.Add(unicode); } // Call the interop method int err = Err(NativeMethods.JetOpenTemporaryTable2(sesid.Value, ref nativetemporarytable)); // Convert the return values SetColumnids(temporarytable.prgcolumndef, temporarytable.prgcolumnid, nativecolumnids, temporarytable.ccolumn); temporarytable.tableid = new JET_TABLEID { Value = nativetemporarytable.tableid }; return(err); } } }