示例#1
0
        protected override void ReadMetadata(
            string providerManifestToken,
            DbProviderServices providerServices,
            DbDataReader reader)
        {
            base.ReadMetadata(providerManifestToken, providerServices, reader);
            int  fieldCount = this.FieldCount;
            bool flag       = false;
            DbSpatialDataReader spatialDataReader = (DbSpatialDataReader)null;

            if (fieldCount > 0)
            {
                spatialDataReader = providerServices.GetSpatialDataReader(reader, providerManifestToken);
            }
            if (spatialDataReader != null)
            {
                this._geographyColumns = new bool[fieldCount];
                this._geometryColumns  = new bool[fieldCount];
                for (int ordinal = 0; ordinal < fieldCount; ++ordinal)
                {
                    this._geographyColumns[ordinal] = spatialDataReader.IsGeographyColumn(ordinal);
                    this._geometryColumns[ordinal]  = spatialDataReader.IsGeometryColumn(ordinal);
                    flag = flag || this._geographyColumns[ordinal] || this._geometryColumns[ordinal];
                }
            }
            this._spatialDataReader = flag ? spatialDataReader : (DbSpatialDataReader)null;
        }
示例#2
0
        public DbSpatialDataReader GetSpatialDataReader(DbDataReader fromReader, string manifestToken)
        {
            try
            {
                DbSpatialDataReader spatialReader = GetDbSpatialDataReader(fromReader, manifestToken);
                if (spatialReader == null)
                {
                    throw EntityUtil.ProviderIncompatible(Strings.ProviderDidNotReturnSpatialServices);
                }

                return(spatialReader);
            }
            catch (ProviderIncompatibleException)
            {
                throw;
            }
            catch (Exception e)
            {
                if (EntityUtil.IsCatchableExceptionType(e))
                {
                    throw EntityUtil.ProviderIncompatible(System.Data.Entity.Strings.ProviderDidNotReturnSpatialServices, e);
                }
                throw;
            }
        }
示例#3
0
        protected override void ReadMetadata(string providerManifestToken, DbProviderServices providerServices, DbDataReader reader)
        {
            base.ReadMetadata(providerManifestToken, providerServices, reader);

            var fieldCount        = FieldCount;
            var hasSpatialColumns = false;
            DbSpatialDataReader spatialDataReader = null;

            if (fieldCount > 0)
            {
                // FieldCount == 0 indicates NullDataReader
                spatialDataReader = providerServices.GetSpatialDataReader(reader, providerManifestToken);
            }

            if (spatialDataReader != null)
            {
                _geographyColumns = new bool[fieldCount];
                _geometryColumns  = new bool[fieldCount];

                for (var i = 0; i < fieldCount; i++)
                {
                    _geographyColumns[i] = spatialDataReader.IsGeographyColumn(i);
                    _geometryColumns[i]  = spatialDataReader.IsGeometryColumn(i);
                    hasSpatialColumns    = hasSpatialColumns || _geographyColumns[i] || _geometryColumns[i];
                    Debug.Assert(!_geographyColumns[i] || !_geometryColumns[i]);
                }
            }

            _spatialDataReader = hasSpatialColumns ? spatialDataReader : null;
        }
 public ReaderMetadata(
     int fieldCount, string[] dataTypeNames, Type[] types, string[] columnNames, bool hasSpatialColumn,
     DbSpatialDataReader spatialDataReader, bool[] geographyColumns, bool[] geometryColumns)
 {
     FieldCount        = fieldCount;
     DataTypeNames     = dataTypeNames;
     ColumnTypes       = types;
     ColumnNames       = columnNames;
     HasSpatialColumns = hasSpatialColumn;
     SpatialDataReader = spatialDataReader;
     GeographyColumns  = geographyColumns;
     GeometryColumns   = geometryColumns;
 }
示例#5
0
        internal static BufferedDataRecord Initialize(
            string providerManifestToken, DbProviderServices providerServices, DbDataReader reader, Type[] columnTypes,
            bool[] nullableColumns)
        {
            var record = new ShapedBufferedDataRecord();

            record.ReadMetadata(providerManifestToken, providerServices, reader);

            DbSpatialDataReader spatialDataReader = null;

            if (columnTypes.Any(t => t == typeof(DbGeography) || t == typeof(DbGeometry)))
            {
                spatialDataReader = providerServices.GetSpatialDataReader(reader, providerManifestToken);
            }

            return(record.Initialize(reader, spatialDataReader, columnTypes, nullableColumns));
        }
示例#6
0
        internal static Task <BufferedDataRecord> InitializeAsync(
            string providerManifestToken, DbProviderServices providerServices, DbDataReader reader, Type[] columnTypes,
            bool[] nullableColumns, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var record = new ShapedBufferedDataRecord();

            record.ReadMetadata(providerManifestToken, providerServices, reader);

            DbSpatialDataReader spatialDataReader = null;

            if (columnTypes.Any(t => t == typeof(DbGeography) || t == typeof(DbGeometry)))
            {
                spatialDataReader = providerServices.GetSpatialDataReader(reader, providerManifestToken);
            }

            return(record.InitializeAsync(reader, spatialDataReader, columnTypes, nullableColumns, cancellationToken));
        }
        private static ReaderMetadata ReadMetadata(string providerManifestToken, DbProviderServices providerSerivces, DbDataReader reader)
        {
            var fieldCount        = reader.FieldCount;
            var hasSpatialColumns = false;
            DbSpatialDataReader spatialDataReader = null;

            bool[] geographyColumns = null;
            bool[] geometryColumns  = null;
            try
            {
                spatialDataReader = providerSerivces.GetSpatialDataReader(reader, providerManifestToken);
                geographyColumns  = new bool[fieldCount];
                geometryColumns   = new bool[fieldCount];
            }
            catch (ProviderIncompatibleException)
            {
            }

            var dataTypeNames = new string[fieldCount];
            var columnTypes   = new Type[fieldCount];
            var columnNames   = new string[fieldCount];

            for (var i = 0; i < fieldCount; i++)
            {
                dataTypeNames[i] = reader.GetDataTypeName(i);
                columnTypes[i]   = reader.GetFieldType(i);
                columnNames[i]   = reader.GetName(i);
                if (spatialDataReader != null)
                {
                    geographyColumns[i] = spatialDataReader.IsGeographyColumn(i);
                    geometryColumns[i]  = spatialDataReader.IsGeometryColumn(i);
                    hasSpatialColumns   = hasSpatialColumns || geographyColumns[i] || geometryColumns[i];
                    Debug.Assert(!geographyColumns[i] || !geometryColumns[i]);
                }
            }

            return(new ReaderMetadata(
                       fieldCount, dataTypeNames, columnTypes, columnNames, hasSpatialColumns, spatialDataReader, geographyColumns, geometryColumns));
        }
示例#8
0
        private BufferedDataRecord Initialize(
            DbDataReader reader, DbSpatialDataReader spatialDataReader, Type[] columnTypes, bool[] nullableColumns)
        {
            InitializeFields(columnTypes, nullableColumns);

            while (reader.Read())
            {
                _currentRowNumber++;

                if (_rowCapacity == _currentRowNumber)
                {
                    DoubleBufferCapacity();
                }

                var columnCount = Math.Max(columnTypes.Length, nullableColumns.Length);

                for (var i = 0; i < columnCount; i++)
                {
                    if (i < _columnTypeCases.Length)
                    {
                        switch (_columnTypeCases[i])
                        {
                        case TypeCase.Bool:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadBool(reader, i);
                                }
                            }
                            else
                            {
                                ReadBool(reader, i);
                            }
                            break;

                        case TypeCase.Byte:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadByte(reader, i);
                                }
                            }
                            else
                            {
                                ReadByte(reader, i);
                            }
                            break;

                        case TypeCase.Char:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadChar(reader, i);
                                }
                            }
                            else
                            {
                                ReadChar(reader, i);
                            }
                            break;

                        case TypeCase.DateTime:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadDateTime(reader, i);
                                }
                            }
                            else
                            {
                                ReadDateTime(reader, i);
                            }
                            break;

                        case TypeCase.Decimal:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadDecimal(reader, i);
                                }
                            }
                            else
                            {
                                ReadDecimal(reader, i);
                            }
                            break;

                        case TypeCase.Double:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadDouble(reader, i);
                                }
                            }
                            else
                            {
                                ReadDouble(reader, i);
                            }
                            break;

                        case TypeCase.Float:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadFloat(reader, i);
                                }
                            }
                            else
                            {
                                ReadFloat(reader, i);
                            }
                            break;

                        case TypeCase.Guid:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadGuid(reader, i);
                                }
                            }
                            else
                            {
                                ReadGuid(reader, i);
                            }
                            break;

                        case TypeCase.Short:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadShort(reader, i);
                                }
                            }
                            else
                            {
                                ReadShort(reader, i);
                            }
                            break;

                        case TypeCase.Int:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadInt(reader, i);
                                }
                            }
                            else
                            {
                                ReadInt(reader, i);
                            }
                            break;

                        case TypeCase.Long:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadLong(reader, i);
                                }
                            }
                            else
                            {
                                ReadLong(reader, i);
                            }
                            break;

                        case TypeCase.DbGeography:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadGeography(spatialDataReader, i);
                                }
                            }
                            else
                            {
                                ReadGeography(spatialDataReader, i);
                            }
                            break;

                        case TypeCase.DbGeometry:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadGeometry(spatialDataReader, i);
                                }
                            }
                            else
                            {
                                ReadGeometry(spatialDataReader, i);
                            }
                            break;

                        case TypeCase.Empty:
                            if (nullableColumns[i])
                            {
                                _tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i);
                            }
                            break;

                        default:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i)))
                                {
                                    ReadObject(reader, i);
                                }
                            }
                            else
                            {
                                ReadObject(reader, i);
                            }
                            break;
                        }
                    }
                    else
                    {
                        if (nullableColumns[i])
                        {
                            _tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = reader.IsDBNull(i);
                        }
                    }
                }
            }

            _bools            = new BitArray(_tempBools);
            _tempBools        = null;
            _nulls            = new BitArray(_tempNulls);
            _tempNulls        = null;
            _rowCount         = _currentRowNumber + 1;
            _currentRowNumber = -1;

            return(this);
        }
示例#9
0
 private async Task ReadGeometryAsync(
     DbSpatialDataReader spatialReader, int ordinal, CancellationToken cancellationToken)
 {
     _objects[_currentRowNumber * _objectCount + _ordinalToIndexMap[ordinal]] =
         await spatialReader.GetGeometryAsync(ordinal, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
 }
示例#10
0
 private void ReadGeometry(DbSpatialDataReader spatialReader, int ordinal)
 {
     _objects[_currentRowNumber * _objectCount + _ordinalToIndexMap[ordinal]] = spatialReader.GetGeometry(ordinal);
 }
示例#11
0
        private async Task <BufferedDataRecord> InitializeAsync(
            DbDataReader reader, DbSpatialDataReader spatialDataReader, Type[] columnTypes, bool[] nullableColumns,
            CancellationToken cancellationToken)
        {
            InitializeFields(columnTypes, nullableColumns);

            while (await reader.ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))
            {
                cancellationToken.ThrowIfCancellationRequested();

                _currentRowNumber++;

                if (_rowCapacity == _currentRowNumber)
                {
                    DoubleBufferCapacity();
                }

                var columnCount = columnTypes.Length > nullableColumns.Length
                                      ? columnTypes.Length
                                      : nullableColumns.Length;

                for (var i = 0; i < columnCount; i++)
                {
                    if (i < _columnTypeCases.Length)
                    {
                        switch (_columnTypeCases[i])
                        {
                        case TypeCase.Bool:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadBoolAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadBoolAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.Byte:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadByteAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadByteAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.Char:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadCharAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadCharAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.DateTime:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadDateTimeAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadDateTimeAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.Decimal:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadDecimalAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadDecimalAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.Double:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadDoubleAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadDoubleAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.Float:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadFloatAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadFloatAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.Guid:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadGuidAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadGuidAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.Short:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadShortAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadShortAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.Int:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadIntAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadIntAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.Long:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadLongAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadLongAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.DbGeography:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadGeographyAsync(spatialDataReader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadGeographyAsync(spatialDataReader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.DbGeometry:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadGeometryAsync(spatialDataReader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadGeometryAsync(spatialDataReader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        case TypeCase.Empty:
                            if (nullableColumns[i])
                            {
                                _tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;

                        default:
                            if (nullableColumns[i])
                            {
                                if (!(_tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false)))
                                {
                                    await ReadObjectAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                                }
                            }
                            else
                            {
                                await ReadObjectAsync(reader, i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                            }
                            break;
                        }
                    }
                    else
                    {
                        if (nullableColumns[i])
                        {
                            _tempNulls[_currentRowNumber * _nullCount + _nullOrdinalToIndexMap[i]] = await reader.IsDBNullAsync(i, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
                        }
                    }
                }
            }

            _bools            = new BitArray(_tempBools);
            _tempBools        = null;
            _nulls            = new BitArray(_tempNulls);
            _tempNulls        = null;
            _rowCount         = _currentRowNumber + 1;
            _currentRowNumber = -1;

            return(this);
        }
示例#12
0
 private async Task ReadGeometryAsync(
     DbSpatialDataReader spatialReader, int ordinal, CancellationToken cancellationToken)
 {
     _objects[_currentRowNumber * _objectCount + _ordinalToIndexMap[ordinal]] =
         await spatialReader.GetGeometryAsync(ordinal, cancellationToken).WithCurrentCulture();
 }