internal void DumpToSchemaTable(System.Data.Common.UnsafeNativeMethods.IRowset rowset)
 {
     List<System.Data.OleDb.MetaData> list = new List<System.Data.OleDb.MetaData>();
     object propertyValue = null;
     using (OleDbDataReader reader = new OleDbDataReader(this._connection, this._command, -2147483648, CommandBehavior.Default))
     {
         reader.InitializeIRowset(rowset, ChapterHandle.DB_NULL_HCHAPTER, IntPtr.Zero);
         reader.BuildSchemaTableInfo(rowset, true, false);
         propertyValue = this.GetPropertyValue(0x102);
         if (reader.FieldCount == 0)
         {
             return;
         }
         FieldNameLookup lookup = new FieldNameLookup(reader, -1);
         reader._fieldNameLookup = lookup;
         System.Data.OleDb.MetaData data20 = reader.FindMetaData("DBCOLUMN_IDNAME");
         System.Data.OleDb.MetaData data19 = reader.FindMetaData("DBCOLUMN_GUID");
         System.Data.OleDb.MetaData data18 = reader.FindMetaData("DBCOLUMN_PROPID");
         System.Data.OleDb.MetaData data17 = reader.FindMetaData("DBCOLUMN_NAME");
         System.Data.OleDb.MetaData data12 = reader.FindMetaData("DBCOLUMN_NUMBER");
         System.Data.OleDb.MetaData data16 = reader.FindMetaData("DBCOLUMN_TYPE");
         System.Data.OleDb.MetaData data11 = reader.FindMetaData("DBCOLUMN_COLUMNSIZE");
         System.Data.OleDb.MetaData data15 = reader.FindMetaData("DBCOLUMN_PRECISION");
         System.Data.OleDb.MetaData data14 = reader.FindMetaData("DBCOLUMN_SCALE");
         System.Data.OleDb.MetaData data13 = reader.FindMetaData("DBCOLUMN_FLAGS");
         System.Data.OleDb.MetaData data10 = reader.FindMetaData("DBCOLUMN_BASESCHEMANAME");
         System.Data.OleDb.MetaData data9 = reader.FindMetaData("DBCOLUMN_BASECATALOGNAME");
         System.Data.OleDb.MetaData data8 = reader.FindMetaData("DBCOLUMN_BASETABLENAME");
         System.Data.OleDb.MetaData data7 = reader.FindMetaData("DBCOLUMN_BASECOLUMNNAME");
         System.Data.OleDb.MetaData data6 = reader.FindMetaData("DBCOLUMN_ISAUTOINCREMENT");
         System.Data.OleDb.MetaData data5 = reader.FindMetaData("DBCOLUMN_ISUNIQUE");
         System.Data.OleDb.MetaData data4 = reader.FindMetaData("DBCOLUMN_KEYCOLUMN");
         reader.CreateAccessors(false);
         while (reader.ReadRowset())
         {
             reader.GetRowDataFromHandle();
             System.Data.OleDb.MetaData item = new System.Data.OleDb.MetaData();
             ColumnBinding columnBinding = data20.columnBinding;
             if (!columnBinding.IsValueNull())
             {
                 item.idname = (string) columnBinding.Value();
                 item.kind = 2;
             }
             columnBinding = data19.columnBinding;
             if (!columnBinding.IsValueNull())
             {
                 item.guid = columnBinding.Value_GUID();
                 item.kind = (2 == item.kind) ? 0 : 6;
             }
             columnBinding = data18.columnBinding;
             if (!columnBinding.IsValueNull())
             {
                 item.propid = new IntPtr((long) columnBinding.Value_UI4());
                 item.kind = (6 == item.kind) ? 1 : 5;
             }
             columnBinding = data17.columnBinding;
             if (!columnBinding.IsValueNull())
             {
                 item.columnName = (string) columnBinding.Value();
             }
             else
             {
                 item.columnName = "";
             }
             if (4 == ADP.PtrSize)
             {
                 item.ordinal = (IntPtr) data12.columnBinding.Value_UI4();
             }
             else
             {
                 item.ordinal = (IntPtr) data12.columnBinding.Value_UI8();
             }
             short dbType = (short) data16.columnBinding.Value_UI2();
             if (4 == ADP.PtrSize)
             {
                 item.size = (int) data11.columnBinding.Value_UI4();
             }
             else
             {
                 item.size = ADP.IntPtrToInt32((IntPtr) data11.columnBinding.Value_UI8());
             }
             columnBinding = data15.columnBinding;
             if (!columnBinding.IsValueNull())
             {
                 item.precision = (byte) columnBinding.Value_UI2();
             }
             columnBinding = data14.columnBinding;
             if (!columnBinding.IsValueNull())
             {
                 item.scale = (byte) columnBinding.Value_I2();
             }
             item.flags = (int) data13.columnBinding.Value_UI4();
             bool isLong = IsLong(item.flags);
             bool isFixed = IsFixed(item.flags);
             NativeDBType type = NativeDBType.FromDBType(dbType, isLong, isFixed);
             item.type = type;
             if (data6 != null)
             {
                 columnBinding = data6.columnBinding;
                 if (!columnBinding.IsValueNull())
                 {
                     item.isAutoIncrement = columnBinding.Value_BOOL();
                 }
             }
             if (data5 != null)
             {
                 columnBinding = data5.columnBinding;
                 if (!columnBinding.IsValueNull())
                 {
                     item.isUnique = columnBinding.Value_BOOL();
                 }
             }
             if (data4 != null)
             {
                 columnBinding = data4.columnBinding;
                 if (!columnBinding.IsValueNull())
                 {
                     item.isKeyColumn = columnBinding.Value_BOOL();
                 }
             }
             if (data10 != null)
             {
                 columnBinding = data10.columnBinding;
                 if (!columnBinding.IsValueNull())
                 {
                     item.baseSchemaName = columnBinding.ValueString();
                 }
             }
             if (data9 != null)
             {
                 columnBinding = data9.columnBinding;
                 if (!columnBinding.IsValueNull())
                 {
                     item.baseCatalogName = columnBinding.ValueString();
                 }
             }
             if (data8 != null)
             {
                 columnBinding = data8.columnBinding;
                 if (!columnBinding.IsValueNull())
                 {
                     item.baseTableName = columnBinding.ValueString();
                 }
             }
             if (data7 != null)
             {
                 columnBinding = data7.columnBinding;
                 if (!columnBinding.IsValueNull())
                 {
                     item.baseColumnName = columnBinding.ValueString();
                 }
             }
             list.Add(item);
         }
     }
     int count = list.Count;
     if (propertyValue is int)
     {
         count -= (int) propertyValue;
     }
     bool flag = false;
     for (int i = list.Count - 1; count <= i; i--)
     {
         System.Data.OleDb.MetaData data3 = list[i];
         data3.isHidden = true;
         if (flag)
         {
             data3.isKeyColumn = false;
         }
         else if (data3.guid.Equals(ODB.DBCOL_SPECIALCOL))
         {
             data3.isKeyColumn = false;
             flag = true;
             for (int k = list.Count - 1; i < k; k--)
             {
                 list[k].isKeyColumn = false;
             }
         }
     }
     for (int j = count - 1; 0 <= j; j--)
     {
         System.Data.OleDb.MetaData data2 = list[j];
         if (flag)
         {
             data2.isKeyColumn = false;
         }
         if (data2.guid.Equals(ODB.DBCOL_SPECIALCOL))
         {
             data2.isHidden = true;
             count--;
         }
         else if (0 >= ((int) data2.ordinal))
         {
             data2.isHidden = true;
             count--;
         }
         else if (DoColumnDropFilter(data2.flags))
         {
             data2.isHidden = true;
             count--;
         }
     }
     list.Sort();
     this._visibleFieldCount = count;
     this._metadata = list.ToArray();
 }
        private void BuildSchemaTableInfoTable(int columnCount, IntPtr columnInfos, bool filterITypeInfo, bool filterChapters)
        {
            int index = 0;
            System.Data.OleDb.MetaData[] dataArray = new System.Data.OleDb.MetaData[columnCount];
            tagDBCOLUMNINFO structure = new tagDBCOLUMNINFO();
            int num4 = 0;
            for (int i = 0; num4 < columnCount; i += ODB.SizeOf_tagDBCOLUMNINFO)
            {
                Marshal.PtrToStructure(ADP.IntPtrOffset(columnInfos, i), structure);
                if ((0 >= ((int) structure.iOrdinal)) || DoColumnDropFilter(structure.dwFlags))
                {
                    goto Label_01EC;
                }
                if (structure.pwszName == null)
                {
                    structure.pwszName = "";
                }
                if ((filterITypeInfo && ("DBCOLUMN_TYPEINFO" == structure.pwszName)) || (filterChapters && (0x88 == structure.wType)))
                {
                    goto Label_01EC;
                }
                bool isLong = IsLong(structure.dwFlags);
                bool isFixed = IsFixed(structure.dwFlags);
                NativeDBType type = NativeDBType.FromDBType(structure.wType, isLong, isFixed);
                System.Data.OleDb.MetaData data = new System.Data.OleDb.MetaData {
                    columnName = structure.pwszName,
                    type = type,
                    ordinal = structure.iOrdinal,
                    size = (int) structure.ulColumnSize,
                    flags = structure.dwFlags,
                    precision = structure.bPrecision,
                    scale = structure.bScale,
                    kind = structure.columnid.eKind
                };
                switch (structure.columnid.eKind)
                {
                    case 0:
                    case 1:
                    case 6:
                        data.guid = structure.columnid.uGuid;
                        break;

                    default:
                        data.guid = Guid.Empty;
                        break;
                }
                switch (structure.columnid.eKind)
                {
                    case 0:
                    case 2:
                        if (!(ADP.PtrZero != structure.columnid.ulPropid))
                        {
                            break;
                        }
                        data.idname = Marshal.PtrToStringUni(structure.columnid.ulPropid);
                        goto Label_01E3;

                    case 1:
                    case 5:
                        data.propid = structure.columnid.ulPropid;
                        goto Label_01E3;

                    default:
                        data.propid = ADP.PtrZero;
                        goto Label_01E3;
                }
                data.idname = null;
            Label_01E3:
                dataArray[index] = data;
                index++;
            Label_01EC:
                num4++;
            }
            if (index < columnCount)
            {
                System.Data.OleDb.MetaData[] dataArray2 = new System.Data.OleDb.MetaData[index];
                for (int j = 0; j < index; j++)
                {
                    dataArray2[j] = dataArray[j];
                }
                dataArray = dataArray2;
            }
            this._visibleFieldCount = index;
            this._metadata = dataArray;
        }