private async ValueTask <int> DoReadBytesAsync(ArraySegment <byte> buffer)
        {
            var startTime = RemainingTimeout == Constants.InfiniteTimeout ? 0 : Environment.TickCount;
            var timerId   = RemainingTimeout == Constants.InfiniteTimeout ? 0 :
                            RemainingTimeout <= 0 ? throw MySqlException.CreateForTimeout() :
                                  TimerQueue.Instance.Add(RemainingTimeout, m_closeSocket);

#if VALUETASKSOURCE
            m_socketEventArgs.SetBuffer(buffer.Array, buffer.Offset, buffer.Count);
#else
            m_socketAwaitable.EventArgs.SetBuffer(buffer.Array, buffer.Offset, buffer.Count);
#endif
            int bytesRead;
            try
            {
#if VALUETASKSOURCE
                m_valueTaskSource.Reset();
                if (!m_socket.ReceiveAsync(m_socketEventArgs))
                {
                    if (m_socketEventArgs.SocketError != SocketError.Success)
                    {
                        throw new SocketException((int)m_socketEventArgs.SocketError);
                    }
                    else
                    {
                        bytesRead = m_socketEventArgs.BytesTransferred;
                    }
                }
                else
                {
                    bytesRead = await new ValueTask <int>(this, m_valueTaskSource.Version).ConfigureAwait(false);
                }
#else
                await m_socket.ReceiveAsync(m_socketAwaitable);

                bytesRead = m_socketAwaitable.EventArgs.BytesTransferred;
#endif
            }
            catch (SocketException ex)
            {
                if (RemainingTimeout != Constants.InfiniteTimeout)
                {
                    RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                    if (!TimerQueue.Instance.Remove(timerId))
                    {
                        throw MySqlException.CreateForTimeout(ex);
                    }
                }
                throw;
            }
            if (RemainingTimeout != Constants.InfiniteTimeout)
            {
                RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                if (!TimerQueue.Instance.Remove(timerId))
                {
                    throw MySqlException.CreateForTimeout();
                }
            }
            return(bytesRead);
        }
        private ValueTask <int> DoReadBytesSync(ArraySegment <byte> buffer)
        {
            try
            {
                if (RemainingTimeout == Constants.InfiniteTimeout)
                {
                    return(new ValueTask <int>(m_socket.Receive(buffer.Array, buffer.Offset, buffer.Count, SocketFlags.None)));
                }

                while (RemainingTimeout > 0)
                {
                    var startTime = Environment.TickCount;
                    if (m_socket.Poll(Math.Min(int.MaxValue / 1000, RemainingTimeout) * 1000, SelectMode.SelectRead))
                    {
                        var bytesRead = m_socket.Receive(buffer.Array, buffer.Offset, buffer.Count, SocketFlags.None);
                        RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                        return(new ValueTask <int>(bytesRead));
                    }
                    RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                }
                return(ValueTaskExtensions.FromException <int>(MySqlException.CreateForTimeout()));
            }
            catch (Exception ex)
            {
                return(ValueTaskExtensions.FromException <int>(ex));
            }
        }
Пример #3
0
        private async ValueTask <int> DoReadBytesAsync(Memory <byte> buffer)
        {
            var startTime = RemainingTimeout == Constants.InfiniteTimeout ? 0 : Environment.TickCount;
            var timerId   = RemainingTimeout switch
            {
                Constants.InfiniteTimeout => 0u,
                <= 0 => throw MySqlException.CreateForTimeout(),
                      _ => TimerQueue.Instance.Add(RemainingTimeout, m_closeSocket),
            };

#if NET45 || NET461 || NET471 || NETSTANDARD1_3 || NETSTANDARD2_0
            m_socketAwaitable.EventArgs.SetBuffer(buffer);
#endif
            int bytesRead;
            try
            {
#if NET45 || NET461 || NET471 || NETSTANDARD1_3 || NETSTANDARD2_0
                await m_socket.ReceiveAsync(m_socketAwaitable);

                bytesRead = m_socketAwaitable.EventArgs.BytesTransferred;
#else
                bytesRead = await m_socket.ReceiveAsync(buffer, SocketFlags.None).ConfigureAwait(false);
#endif
            }
            catch (SocketException ex)
            {
                if (RemainingTimeout != Constants.InfiniteTimeout)
                {
                    RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                    if (!TimerQueue.Instance.Remove(timerId))
                    {
                        throw MySqlException.CreateForTimeout(ex);
                    }
                }
                throw;
            }
            if (RemainingTimeout != Constants.InfiniteTimeout)
            {
                RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                if (!TimerQueue.Instance.Remove(timerId))
                {
                    throw MySqlException.CreateForTimeout();
                }
            }
            return(bytesRead);
        }
Пример #4
0
        private async Task <int> DoReadBytesAsync(ArraySegment <byte> buffer)
        {
            var startTime = RemainingTimeout == Constants.InfiniteTimeout ? 0 : Environment.TickCount;
            var timerId   = RemainingTimeout == Constants.InfiniteTimeout ? 0 :
                            RemainingTimeout <= 0 ? throw MySqlException.CreateForTimeout() :
                                  TimerQueue.Instance.Add(RemainingTimeout, m_closeSocket);

            m_socketAwaitable.EventArgs.SetBuffer(buffer.Array, buffer.Offset, buffer.Count);
            int bytesRead;

            try
            {
                await m_socket.ReceiveAsync(m_socketAwaitable);

                bytesRead = m_socketAwaitable.EventArgs.BytesTransferred;
            }
            catch (SocketException ex)
            {
                if (RemainingTimeout != Constants.InfiniteTimeout)
                {
                    RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                    if (!TimerQueue.Instance.Remove(timerId))
                    {
                        throw MySqlException.CreateForTimeout(ex);
                    }
                }
                throw;
            }
            if (RemainingTimeout != Constants.InfiniteTimeout)
            {
                RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                if (!TimerQueue.Instance.Remove(timerId))
                {
                    throw MySqlException.CreateForTimeout();
                }
            }
            return(bytesRead);
        }
Пример #5
0
            static async Task <Row?> ScanRowAsyncAwaited(ResultSet resultSet, Task <PayloadData> payloadTask, Row?row, CancellationToken token)
            {
                PayloadData payloadData;

                try
                {
                    payloadData = await payloadTask.ConfigureAwait(false);
                }
                catch (MySqlException ex)
                {
                    resultSet.BufferState = resultSet.State = ResultSetState.NoMoreData;
                    if (ex.ErrorCode == MySqlErrorCode.QueryInterrupted && token.IsCancellationRequested)
                    {
                        throw new OperationCanceledException(ex.Message, ex, token);
                    }
                    if (ex.ErrorCode == MySqlErrorCode.QueryInterrupted && resultSet.Command.CancellableCommand.IsTimedOut)
                    {
                        throw MySqlException.CreateForTimeout(ex);
                    }
                    throw;
                }
                return(ScanRowAsyncRemainder(resultSet, payloadData, row));
            }
Пример #6
0
        private ValueTask <int> DoReadBytesSync(Memory <byte> buffer)
        {
#if !NETSTANDARD2_1 && !NETCOREAPP2_1 && !NETCOREAPP3_0
            MemoryMarshal.TryGetArray <byte>(buffer, out var arraySegment);
#endif

            try
            {
                if (RemainingTimeout == Constants.InfiniteTimeout)
#if !NETSTANDARD2_1 && !NETCOREAPP2_1 && !NETCOREAPP3_0
                { return(new ValueTask <int>(m_socket.Receive(arraySegment.Array, arraySegment.Offset, arraySegment.Count, SocketFlags.None))); }
#else
                { return(new ValueTask <int>(m_socket.Receive(buffer.Span, SocketFlags.None))); }
#endif

                while (RemainingTimeout > 0)
                {
                    var startTime = Environment.TickCount;
                    if (m_socket.Poll(Math.Min(int.MaxValue / 1000, RemainingTimeout) * 1000, SelectMode.SelectRead))
                    {
#if !NETSTANDARD2_1 && !NETCOREAPP2_1 && !NETCOREAPP3_0
                        var bytesRead = m_socket.Receive(arraySegment.Array, arraySegment.Offset, arraySegment.Count, SocketFlags.None);
#else
                        var bytesRead = m_socket.Receive(buffer.Span, SocketFlags.None);
#endif
                        RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                        return(new ValueTask <int>(bytesRead));
                    }
                    RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                }
                return(ValueTaskExtensions.FromException <int>(MySqlException.CreateForTimeout()));
            }
            catch (Exception ex)
            {
                return(ValueTaskExtensions.FromException <int>(ex));
            }
        }
Пример #7
0
        public ValueTask <int> ReadBytesAsync(Memory <byte> buffer, IOBehavior ioBehavior)
        {
            return(ioBehavior == IOBehavior.Asynchronous ? new ValueTask <int>(DoReadBytesAsync(buffer)) :
                   RemainingTimeout <= 0 ? ValueTaskExtensions.FromException <int>(MySqlException.CreateForTimeout()) :
                   m_stream.CanTimeout ? DoReadBytesSync(buffer) :
                   DoReadBytesSyncOverAsync(buffer));

            ValueTask <int> DoReadBytesSync(Memory <byte> buffer_)
            {
                m_stream.ReadTimeout = RemainingTimeout == Constants.InfiniteTimeout ? Timeout.Infinite : RemainingTimeout;
                var startTime = RemainingTimeout == Constants.InfiniteTimeout ? 0 : Environment.TickCount;
                int bytesRead;

                try
                {
                    bytesRead = m_stream.Read(buffer_);
                }
                catch (Exception ex)
                {
                    if (RemainingTimeout != Constants.InfiniteTimeout && ex is IOException ioException && ioException.InnerException is SocketException socketException && socketException.SocketErrorCode == SocketError.TimedOut)
                    {
                        return(ValueTaskExtensions.FromException <int>(MySqlException.CreateForTimeout(ex)));
                    }
                    return(ValueTaskExtensions.FromException <int>(ex));
                }
                if (RemainingTimeout != Constants.InfiniteTimeout)
                {
                    RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                }
                return(new ValueTask <int>(bytesRead));
            }

            ValueTask <int> DoReadBytesSyncOverAsync(Memory <byte> buffer_)
            {
                try
                {
                    // handle timeout by setting a timer to close the stream in the background
                    return(new ValueTask <int>(DoReadBytesAsync(buffer_).GetAwaiter().GetResult()));
                }
                catch (Exception ex)
                {
                    return(ValueTaskExtensions.FromException <int>(ex));
                }
            }

            async Task <int> DoReadBytesAsync(Memory <byte> buffer_)
            {
                var startTime = RemainingTimeout == Constants.InfiniteTimeout ? 0 : Environment.TickCount;
                var timerId   = RemainingTimeout == Constants.InfiniteTimeout ? 0 : TimerQueue.Instance.Add(RemainingTimeout, m_closeStream);
                int bytesRead;

                try
                {
                    bytesRead = await m_stream.ReadAsync(buffer_).ConfigureAwait(false);
                }
                catch (Exception ex) when(ex is ObjectDisposedException || ex is IOException)
                {
                    if (RemainingTimeout != Constants.InfiniteTimeout)
                    {
                        RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                        if (!TimerQueue.Instance.Remove(timerId))
                        {
                            throw MySqlException.CreateForTimeout(ex);
                        }
                    }
                    throw;
                }
                if (RemainingTimeout != Constants.InfiniteTimeout)
                {
                    RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                    if (!TimerQueue.Instance.Remove(timerId))
                    {
                        throw MySqlException.CreateForTimeout();
                    }
                }
                return(bytesRead);
            }
        }
Пример #8
0
        public ValueTask <int> ReadBytesAsync(ArraySegment <byte> buffer, IOBehavior ioBehavior)
        {
            return((ioBehavior == IOBehavior.Asynchronous) ?
                   new ValueTask <int>(DoReadBytesAsync(buffer)) : DoReadBytesSync(buffer));

            ValueTask <int> DoReadBytesSync(ArraySegment <byte> buffer_)
            {
                if (RemainingTimeout <= 0)
                {
                    return(ValueTaskExtensions.FromException <int>(MySqlException.CreateForTimeout()));
                }

                m_stream.ReadTimeout = RemainingTimeout == Constants.InfiniteTimeout ? Timeout.Infinite : RemainingTimeout;
                var startTime = RemainingTimeout == Constants.InfiniteTimeout ? 0 : Environment.TickCount;
                int bytesRead;

                try
                {
                    bytesRead = m_stream.Read(buffer_.Array, buffer_.Offset, buffer_.Count);
                }
                catch (Exception ex)
                {
                    if (ex is IOException && RemainingTimeout != Constants.InfiniteTimeout)
                    {
                        return(ValueTaskExtensions.FromException <int>(MySqlException.CreateForTimeout(ex)));
                    }
                    return(ValueTaskExtensions.FromException <int>(ex));
                }
                if (RemainingTimeout != Constants.InfiniteTimeout)
                {
                    RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                }
                return(new ValueTask <int>(bytesRead));
            }

            async Task <int> DoReadBytesAsync(ArraySegment <byte> buffer_)
            {
                var startTime = RemainingTimeout == Constants.InfiniteTimeout ? 0 : Environment.TickCount;
                var timerId   = RemainingTimeout == Constants.InfiniteTimeout ? 0 : TimerQueue.Instance.Add(RemainingTimeout, m_closeStream);
                int bytesRead;

                try
                {
                    bytesRead = await m_stream.ReadAsync(buffer_.Array, buffer_.Offset, buffer_.Count).ConfigureAwait(false);
                }
                catch (Exception ex) when(ex is ObjectDisposedException || ex is IOException)
                {
                    if (RemainingTimeout != Constants.InfiniteTimeout)
                    {
                        RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                        if (!TimerQueue.Instance.Remove(timerId))
                        {
                            throw MySqlException.CreateForTimeout(ex);
                        }
                    }
                    throw;
                }
                if (RemainingTimeout != Constants.InfiniteTimeout)
                {
                    RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                    if (!TimerQueue.Instance.Remove(timerId))
                    {
                        throw MySqlException.CreateForTimeout();
                    }
                }
                return(bytesRead);
            }
        }
        public ValueTask <int> ReadBytesAsync(ArraySegment <byte> buffer, IOBehavior ioBehavior)
        {
            return(ioBehavior == IOBehavior.Asynchronous ?
                   new ValueTask <int>(DoReadBytesAsync(buffer)) : DoReadBytesSync(buffer));

            ValueTask <int> DoReadBytesSync(ArraySegment <byte> buffer_)
            {
                try
                {
                    if (RemainingTimeout == Constants.InfiniteTimeout)
                    {
                        return(new ValueTask <int>(m_socket.Receive(buffer_.Array, buffer_.Offset, buffer_.Count, SocketFlags.None)));
                    }

                    while (RemainingTimeout > 0)
                    {
                        var startTime = Environment.TickCount;
                        if (m_socket.Poll(Math.Min(int.MaxValue / 1000, RemainingTimeout) * 1000, SelectMode.SelectRead))
                        {
                            var bytesRead = m_socket.Receive(buffer_.Array, buffer_.Offset, buffer_.Count, SocketFlags.None);
                            RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                            return(new ValueTask <int>(bytesRead));
                        }
                        RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                    }
                    return(ValueTaskExtensions.FromException <int>(MySqlException.CreateForTimeout()));
                }
                catch (Exception ex)
                {
                    return(ValueTaskExtensions.FromException <int>(ex));
                }
            }

            async Task <int> DoReadBytesAsync(ArraySegment <byte> buffer_)
            {
                var startTime = RemainingTimeout == Constants.InfiniteTimeout ? 0 : Environment.TickCount;
                var timerId   = RemainingTimeout == Constants.InfiniteTimeout ? 0 :
                                RemainingTimeout <= 0 ? throw MySqlException.CreateForTimeout() :
                                      TimerQueue.Instance.Add(RemainingTimeout, m_closeSocket);

                m_socketAwaitable.EventArgs.SetBuffer(buffer_.Array, buffer_.Offset, buffer_.Count);
                int bytesRead;

                try
                {
                    await m_socket.ReceiveAsync(m_socketAwaitable);

                    bytesRead = m_socketAwaitable.EventArgs.BytesTransferred;
                }
                catch (SocketException ex)
                {
                    if (RemainingTimeout != Constants.InfiniteTimeout)
                    {
                        RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                        if (!TimerQueue.Instance.Remove(timerId))
                        {
                            throw MySqlException.CreateForTimeout(ex);
                        }
                    }
                    throw;
                }
                if (RemainingTimeout != Constants.InfiniteTimeout)
                {
                    RemainingTimeout -= unchecked (Environment.TickCount - startTime);
                    if (!TimerQueue.Instance.Remove(timerId))
                    {
                        throw MySqlException.CreateForTimeout();
                    }
                }
                return(bytesRead);
            }
        }