Exemple #1
0
        public void DebugUtil()
        {
            var set = new HashSet <string>();

            set.Add(null);
            Assert.IsFalse(set.Contains(string.Empty));
            Assert.IsTrue(set.Contains(null));
            set.Add(string.Empty);
            Assert.IsTrue(set.Contains(null));
            Assert.IsTrue(set.Contains(""));
            Assert.IsTrue(set.Contains(string.Empty));
            Assert.IsFalse(set.Add(""));

            var bs    = new HashSet <SizableArrayOfByte>(SizableArrayOfByte.DefaultComparer.Instance);
            var empty = new SizableArrayOfByte();

            bs.Add(null);
            Assert.IsFalse(bs.Contains(empty));
            Assert.IsTrue(bs.Contains(null));
            bs.Add(new SizableArrayOfByte());
            Assert.IsTrue(bs.Contains(null));
            Assert.IsTrue(bs.Contains(empty));
            Assert.IsTrue(bs.Contains(new SizableArrayOfByte()));
            Assert.IsFalse(bs.Add(new SizableArrayOfByte()));
            Assert.IsFalse(bs.Add(empty));
        }
        private void ReadFromClientRowData()
        {
            for (var i = 0; i < m_driverRowData.NotNulls.Length; i++)
            {
                m_driverRowData.NotNulls[i] = m_readerBuffer.NotNulls[i];
            }

            for (var ordinal = 0; ordinal < m_readerBuffer.FieldTypes.Length; ordinal++)
            {
                var indexInArray = m_readerBuffer.GetIndexInArray(ordinal);

                if (!BitVector.Get(m_driverRowData.NotNulls, ordinal))
                {
                    continue;
                }

                switch (m_readerBuffer.FieldRepresentationTypes[ordinal])
                {
                case RowData.DataTypeRepresentation.ByteArray:
                {
                    var dest = m_driverRowData.BinaryData[indexInArray];
                    if (dest == null)
                    {
                        dest = new SizableArrayOfByte();
                        m_driverRowData.BinaryData[indexInArray] = dest;
                    }

                    var src = m_readerBuffer.BinaryData[indexInArray];
                    dest.SetLength(src.Length);
                    if (src.Length > 0)
                    {
                        Buffer.BlockCopy(src.Data, 0, dest.Data, 0, src.Length);
                    }
                }
                break;

                case RowData.DataTypeRepresentation.CharArray:
                {
                    var src = m_readerBuffer.StringData[indexInArray];
                    m_driverRowData.StringData[indexInArray] = src == null || src.Length == 0 ? string.Empty : new string(src.Data, 0, src.Length);
                }
                break;

                case RowData.DataTypeRepresentation.Value8Bytes:
                    m_driverRowData.ValueData8Bytes[indexInArray].AsInt64 = m_readerBuffer.ValueData8Bytes[indexInArray].AsInt64;
                    break;

                case RowData.DataTypeRepresentation.Value16Bytes:
                    m_driverRowData.ValueData16Bytes[indexInArray].Lo = m_readerBuffer.ValueData16Bytes[indexInArray].Lo;
                    m_driverRowData.ValueData16Bytes[indexInArray].Hi = m_readerBuffer.ValueData16Bytes[indexInArray].Hi;
                    break;

                default:
                    throw new InvalidOperationException("Invalid representation type: " + m_readerBuffer.FieldRepresentationTypes[ordinal]);
                }
            }
        }
        public static SizableArrayOfByte ReadByteArray(BinaryReader reader)
        {
            var result = new SizableArrayOfByte();

            result.Length = Read7BitEncodedInt(reader);
            if (result.Length > 0)
            {
                result.Data = reader.ReadBytes(result.Length);
            }

            return(result);
        }
Exemple #4
0
        /// <summary>
        /// Ctr.
        /// </summary>
        /// <param name="fieldTypes">Field metadata, ordered</param>
        public DriverRowData(DbType[] fieldTypes)
        {
            if (fieldTypes == null)
            {
                throw new ArgumentNullException("fieldTypes");
            }

            InternalEntityId = new byte[byte.MaxValue + 1];

            NotNulls = new int[BitVector.GetArrayLength(fieldTypes.Length)];

            FieldArrayIndexes        = new int[fieldTypes.Length];
            FieldRepresentationTypes = new DataTypeRepresentation[fieldTypes.Length];

            m_fieldCountsByStorageType = new int[1 + Enum.GetValues(typeof(DataTypeRepresentation)).Cast <byte>().Max()];

            int count;

            for (var ordinal = 0; ordinal < fieldTypes.Length; ordinal++)
            {
                var dbType      = fieldTypes[ordinal];
                var storageType = FieldStorage[dbType];
                count = m_fieldCountsByStorageType[(byte)storageType];

                FieldArrayIndexes[ordinal]                    = count;
                FieldRepresentationTypes[ordinal]             = storageType;
                m_fieldCountsByStorageType[(byte)storageType] = count + 1;
            }

            count            = m_fieldCountsByStorageType[(int)DataTypeRepresentation.Value8Bytes];
            ValueData8Bytes  = count > 0 ? new ValueHolder8Bytes[count] : null;
            count            = m_fieldCountsByStorageType[(int)DataTypeRepresentation.Value16Bytes];
            ValueData16Bytes = count > 0 ? new ValueHolder16Bytes[count] : null;
            count            = m_fieldCountsByStorageType[(int)DataTypeRepresentation.String];
            StringData       = count > 0 ? new String[count] : null;
            count            = m_fieldCountsByStorageType[(int)DataTypeRepresentation.ByteArray];
            BinaryData       = count > 0 ? new SizableArrayOfByte[count] : null;

            if (BinaryData != null)
            {
                for (var i = 0; i < BinaryData.Length; i++)
                {
                    BinaryData[i] = new SizableArrayOfByte();
                }
            }

            FieldTypes = fieldTypes;
        }
        public void DebugUtil()
        {
            var set = new HashSet<string>();
            set.Add(null);
            Assert.IsFalse(set.Contains(string.Empty));
            Assert.IsTrue(set.Contains(null));
            set.Add(string.Empty);
            Assert.IsTrue(set.Contains(null));
            Assert.IsTrue(set.Contains(""));
            Assert.IsTrue(set.Contains(string.Empty));
            Assert.IsFalse(set.Add(""));

            var bs = new HashSet<SizableArrayOfByte>(SizableArrayOfByte.DefaultComparer.Instance);
            var empty = new SizableArrayOfByte();
            bs.Add(null);
            Assert.IsFalse(bs.Contains(empty));
            Assert.IsTrue(bs.Contains(null));
            bs.Add(new SizableArrayOfByte());
            Assert.IsTrue(bs.Contains(null));
            Assert.IsTrue(bs.Contains(empty));
            Assert.IsTrue(bs.Contains(new SizableArrayOfByte()));
            Assert.IsFalse(bs.Add(new SizableArrayOfByte()));
            Assert.IsFalse(bs.Add(empty));
        }
        public static SizableArrayOfByte ReadByteArray(BinaryReader reader)
        {
            var result = new SizableArrayOfByte();
            result.Length = Read7BitEncodedInt(reader);
            if (result.Length > 0)
            {
                result.Data = reader.ReadBytes(result.Length);
            }

            return result;
        }
        private object ReadCollection(DbType dbType, BinaryReader reader, StringBuilder stringBuilder)
        {
            var itemCount = RowData.Read7BitEncodedInt(reader);

            switch (dbType)
            {
                //case DbType.VarNumeric:
                //    break;
                case DbType.AnsiString:
                case DbType.String:
                case DbType.AnsiStringFixedLength:
                case DbType.StringFixedLength:
                case DbType.Xml:
                    {
                        var result = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

                        for (var x = 0; x < itemCount; x++)
                        {
                            var len = RowData.Read7BitEncodedInt(reader);
                            if (len > 0)
                            {
                                stringBuilder.Clear();
                                stringBuilder.EnsureCapacity(len);
                                for (var i = 0; i < len; i++)
                                {
                                    stringBuilder.Append((char) RowData.Read7BitEncodedInt(reader));
                                }
                                result.Add(stringBuilder.ToString());
                            }
                            else if (len >= -1)
                            {
                                // client supplies -1 to indicate that collection element is null
                                // ignore ReSharper's warning about notnull, no exception here

                                // ReSharper disable AssignNullToNotNullAttribute
                                result.Add(len == 0 ? string.Empty : null);
                                // ReSharper restore AssignNullToNotNullAttribute
                            }
                            else
                            {
                                throw new Exception("Invalid length value: " + len);
                            }
                        }
                        return result;
                    }

                case DbType.Binary:
                case DbType.Object:
                    {
                        var result = new HashSet<SizableArrayOfByte>(SizableArrayOfByte.DefaultComparer.Instance);

                        for (var x = 0; x < itemCount; x++)
                        {
                            var len = RowData.Read7BitEncodedInt(reader);
                            if (len >= 0)
                            {
                                var data = new SizableArrayOfByte();
                                data.SetLength(len);
                                var bytesRead = 0;
                                while (bytesRead < data.Length)
                                {
                                    var count = reader.Read(data.Data, bytesRead, data.Length - bytesRead);
                                    if (count == 0)
                                    {
                                        throw new DataException("Unexpected end of stream");
                                    }
                                    bytesRead += count;
                                }

                                result.Add(data);
                            }
                            else if (len == -1)
                            {
                                // client supplies -1 to indicate that collection element is null
                                // ignore ReSharper's warning about notnull, no exception here

                                // ReSharper disable AssignNullToNotNullAttribute
                                result.Add(null);
                                // ReSharper restore AssignNullToNotNullAttribute
                            }
                            else
                            {
                                throw new Exception("Invalid length value: " + len);
                            }
                        }
                        return result;
                    }

                case DbType.SByte:
                    {
                        var result = new HashSet<SByte>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add((sbyte)reader.ReadByte());
                        }
                        return result;
                    }

                case DbType.Byte:
                    {
                        var result = new HashSet<Byte>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadByte());
                        }
                        return result;
                    }

                case DbType.Boolean:
                    {
                        var result = new HashSet<bool>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadBoolean());
                        }
                        return result;
                    }

                case DbType.Decimal:
                case DbType.Currency:
                    {
                        var result = new HashSet<Decimal>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadDecimal());
                        }
                        return result;
                    }

                case DbType.Guid:
                    {
                        var result = new HashSet<Guid>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            var buf = new DriverRowData.ValueHolder16Bytes { Lo = reader.ReadInt64(), Hi = reader.ReadInt64() };
                            result.Add(buf.AsGuid);
                        }
                        return result;
                    }

                case DbType.DateTimeOffset:
                    {
                        var result = new HashSet<DateTimeOffset>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            var buf = new DriverRowData.ValueHolder16Bytes {Lo = reader.ReadInt64(), Hi = reader.ReadInt64()};
                            result.Add(buf.AsDateTimeOffset);
                        }
                        return result;
                    }

                case DbType.Int16:
                    {
                        var result = new HashSet<Int16>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadInt16());
                        }
                        return result;
                    }

                case DbType.UInt16:
                    {
                        var result = new HashSet<UInt16>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadUInt16());
                        }
                        return result;
                    }

                case DbType.Int32:
                    {
                        var result = new HashSet<Int32>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadInt32());
                        }
                        return result;
                    }

                case DbType.UInt32:
                    {
                        var result = new HashSet<UInt32>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadUInt32());
                        }
                        return result;
                    }

                case DbType.Single:
                    {
                        var result = new HashSet<Single>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadSingle());
                        }
                        return result;
                    }

                case DbType.Date:
                case DbType.DateTime:
                case DbType.DateTime2:
                    {
                        var result = new HashSet<DateTime>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(DateTime.FromBinary(reader.ReadInt64()));
                        }
                        return result;
                    }
                case DbType.Time:
                    {
                        var result = new HashSet<TimeSpan>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(new TimeSpan(reader.ReadInt64()));
                        }
                        return result;
                    }

                case DbType.Int64:
                    {
                        var result = new HashSet<Int64>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadInt64());
                        }
                        return result;
                    }

                case DbType.UInt64:
                    {
                        var result = new HashSet<UInt64>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadUInt64());
                        }
                        return result;
                    }

                case DbType.Double:
                    {
                        var result = new HashSet<Double>();
                        for (var x = 0; x < itemCount; x++)
                        {
                            result.Add(reader.ReadDouble());
                        }
                        return result;
                    }

                default:
                    throw new DataException("Invalid DbType: " + dbType);
            }
        }
        /// <summary>
        /// Ctr.
        /// </summary>
        /// <param name="fieldTypes">Field metadata, ordered</param>
        public DriverRowData(DbType[] fieldTypes)
        {
            if (fieldTypes == null)
            {
                throw new ArgumentNullException("fieldTypes");
            }

            InternalEntityId = new byte[byte.MaxValue + 1];

            NotNulls = new int[BitVector.GetArrayLength(fieldTypes.Length)];

            FieldArrayIndexes = new int[fieldTypes.Length];
            FieldRepresentationTypes = new DataTypeRepresentation[fieldTypes.Length];

            m_fieldCountsByStorageType = new int[1 + Enum.GetValues(typeof(DataTypeRepresentation)).Cast<byte>().Max()];

            int count;
            for (var ordinal = 0; ordinal < fieldTypes.Length; ordinal++)
            {
                var dbType = fieldTypes[ordinal];
                var storageType = FieldStorage[dbType];
                count = m_fieldCountsByStorageType[(byte)storageType];

                FieldArrayIndexes[ordinal] = count;
                FieldRepresentationTypes[ordinal] = storageType;
                m_fieldCountsByStorageType[(byte)storageType] = count + 1;
            }

            count = m_fieldCountsByStorageType[(int) DataTypeRepresentation.Value8Bytes];
            ValueData8Bytes = count > 0 ? new ValueHolder8Bytes[count] : null;
            count = m_fieldCountsByStorageType[(int) DataTypeRepresentation.Value16Bytes];
            ValueData16Bytes = count > 0 ? new ValueHolder16Bytes[count] : null;
            count = m_fieldCountsByStorageType[(int) DataTypeRepresentation.String];
            StringData = count > 0 ? new String[count] : null;
            count = m_fieldCountsByStorageType[(int) DataTypeRepresentation.ByteArray];
            BinaryData = count > 0 ? new SizableArrayOfByte[count] : null;

            if (BinaryData != null)
            {
                for (var i = 0; i < BinaryData.Length; i++)
                {
                    BinaryData[i] = new SizableArrayOfByte();
                }
            }

            FieldTypes = fieldTypes;
        }
        private void ReadFromClientRowData()
        {
            for (var i = 0; i < m_driverRowData.NotNulls.Length; i++)
            {
                m_driverRowData.NotNulls[i] = m_readerBuffer.NotNulls[i];
            }

            for (var ordinal = 0; ordinal < m_readerBuffer.FieldTypes.Length; ordinal++)
            {
                var indexInArray = m_readerBuffer.GetIndexInArray(ordinal);

                if (!BitVector.Get(m_driverRowData.NotNulls, ordinal))
                {
                    continue;
                }

                switch (m_readerBuffer.FieldRepresentationTypes[ordinal])
                {
                    case RowData.DataTypeRepresentation.ByteArray:
                        {
                            var dest = m_driverRowData.BinaryData[indexInArray];
                            if (dest == null)
                            {
                                dest = new SizableArrayOfByte();
                                m_driverRowData.BinaryData[indexInArray] = dest;
                            }

                            var src = m_readerBuffer.BinaryData[indexInArray];
                            dest.SetLength(src.Length);
                            if (src.Length > 0)
                            {
                                Buffer.BlockCopy(src.Data, 0, dest.Data, 0, src.Length);
                            }
                        }
                        break;
                    case RowData.DataTypeRepresentation.CharArray:
                        {
                            var src = m_readerBuffer.StringData[indexInArray];
                            m_driverRowData.StringData[indexInArray] = src == null || src.Length == 0 ? string.Empty : new string(src.Data, 0, src.Length);
                        }
                        break;
                    case RowData.DataTypeRepresentation.Value8Bytes:
                        m_driverRowData.ValueData8Bytes[indexInArray].AsInt64 = m_readerBuffer.ValueData8Bytes[indexInArray].AsInt64;
                        break;
                    case RowData.DataTypeRepresentation.Value16Bytes:
                        m_driverRowData.ValueData16Bytes[indexInArray].Lo = m_readerBuffer.ValueData16Bytes[indexInArray].Lo;
                        m_driverRowData.ValueData16Bytes[indexInArray].Hi = m_readerBuffer.ValueData16Bytes[indexInArray].Hi;
                        break;
                    default:
                        throw new InvalidOperationException("Invalid representation type: " + m_readerBuffer.FieldRepresentationTypes[ordinal]);
                }
            }
        }
Exemple #10
0
        private object ReadCollection(DbType dbType, BinaryReader reader, StringBuilder stringBuilder)
        {
            var itemCount = RowData.Read7BitEncodedInt(reader);

            switch (dbType)
            {
            //case DbType.VarNumeric:
            //    break;
            case DbType.AnsiString:
            case DbType.String:
            case DbType.AnsiStringFixedLength:
            case DbType.StringFixedLength:
            case DbType.Xml:
            {
                var result = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

                for (var x = 0; x < itemCount; x++)
                {
                    var len = RowData.Read7BitEncodedInt(reader);
                    if (len > 0)
                    {
                        stringBuilder.Clear();
                        stringBuilder.EnsureCapacity(len);
                        for (var i = 0; i < len; i++)
                        {
                            stringBuilder.Append((char)RowData.Read7BitEncodedInt(reader));
                        }
                        result.Add(stringBuilder.ToString());
                    }
                    else if (len >= -1)
                    {
                        // client supplies -1 to indicate that collection element is null
                        // ignore ReSharper's warning about notnull, no exception here

                        // ReSharper disable AssignNullToNotNullAttribute
                        result.Add(len == 0 ? string.Empty : null);
                        // ReSharper restore AssignNullToNotNullAttribute
                    }
                    else
                    {
                        throw new Exception("Invalid length value: " + len);
                    }
                }
                return(result);
            }

            case DbType.Binary:
            case DbType.Object:
            {
                var result = new HashSet <SizableArrayOfByte>(SizableArrayOfByte.DefaultComparer.Instance);

                for (var x = 0; x < itemCount; x++)
                {
                    var len = RowData.Read7BitEncodedInt(reader);
                    if (len >= 0)
                    {
                        var data = new SizableArrayOfByte();
                        data.SetLength(len);
                        var bytesRead = 0;
                        while (bytesRead < data.Length)
                        {
                            var count = reader.Read(data.Data, bytesRead, data.Length - bytesRead);
                            if (count == 0)
                            {
                                throw new DataException("Unexpected end of stream");
                            }
                            bytesRead += count;
                        }

                        result.Add(data);
                    }
                    else if (len == -1)
                    {
                        // client supplies -1 to indicate that collection element is null
                        // ignore ReSharper's warning about notnull, no exception here

                        // ReSharper disable AssignNullToNotNullAttribute
                        result.Add(null);
                        // ReSharper restore AssignNullToNotNullAttribute
                    }
                    else
                    {
                        throw new Exception("Invalid length value: " + len);
                    }
                }
                return(result);
            }

            case DbType.SByte:
            {
                var result = new HashSet <SByte>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add((sbyte)reader.ReadByte());
                }
                return(result);
            }

            case DbType.Byte:
            {
                var result = new HashSet <Byte>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadByte());
                }
                return(result);
            }

            case DbType.Boolean:
            {
                var result = new HashSet <bool>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadBoolean());
                }
                return(result);
            }

            case DbType.Decimal:
            case DbType.Currency:
            {
                var result = new HashSet <Decimal>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadDecimal());
                }
                return(result);
            }

            case DbType.Guid:
            {
                var result = new HashSet <Guid>();
                for (var x = 0; x < itemCount; x++)
                {
                    var buf = new DriverRowData.ValueHolder16Bytes {
                        Lo = reader.ReadInt64(), Hi = reader.ReadInt64()
                    };
                    result.Add(buf.AsGuid);
                }
                return(result);
            }

            case DbType.DateTimeOffset:
            {
                var result = new HashSet <DateTimeOffset>();
                for (var x = 0; x < itemCount; x++)
                {
                    var buf = new DriverRowData.ValueHolder16Bytes {
                        Lo = reader.ReadInt64(), Hi = reader.ReadInt64()
                    };
                    result.Add(buf.AsDateTimeOffset);
                }
                return(result);
            }

            case DbType.Int16:
            {
                var result = new HashSet <Int16>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadInt16());
                }
                return(result);
            }

            case DbType.UInt16:
            {
                var result = new HashSet <UInt16>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadUInt16());
                }
                return(result);
            }

            case DbType.Int32:
            {
                var result = new HashSet <Int32>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadInt32());
                }
                return(result);
            }

            case DbType.UInt32:
            {
                var result = new HashSet <UInt32>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadUInt32());
                }
                return(result);
            }

            case DbType.Single:
            {
                var result = new HashSet <Single>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadSingle());
                }
                return(result);
            }

            case DbType.Date:
            case DbType.DateTime:
            case DbType.DateTime2:
            {
                var result = new HashSet <DateTime>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(DateTime.FromBinary(reader.ReadInt64()));
                }
                return(result);
            }

            case DbType.Time:
            {
                var result = new HashSet <TimeSpan>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(new TimeSpan(reader.ReadInt64()));
                }
                return(result);
            }

            case DbType.Int64:
            {
                var result = new HashSet <Int64>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadInt64());
                }
                return(result);
            }

            case DbType.UInt64:
            {
                var result = new HashSet <UInt64>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadUInt64());
                }
                return(result);
            }

            case DbType.Double:
            {
                var result = new HashSet <Double>();
                for (var x = 0; x < itemCount; x++)
                {
                    result.Add(reader.ReadDouble());
                }
                return(result);
            }

            default:
                throw new DataException("Invalid DbType: " + dbType);
            }
        }