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; }