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