public override async ValueTask Read(TComposite composite, NpgsqlReadBuffer buffer, bool async, CancellationToken cancellationToken = default) { if (_set == null) { ThrowHelper.ThrowInvalidOperationException_NoPropertySetter(typeof(TComposite), MemberInfo); } await buffer.Ensure(sizeof(uint) + sizeof(int), async, cancellationToken); var oid = buffer.ReadUInt32(); Debug.Assert(oid == PostgresType.OID); var length = buffer.ReadInt32(); if (length == -1) { return; } var value = NullableHandler <TMember> .Exists ? await NullableHandler <TMember> .ReadAsync(_handler, buffer, length, async, cancellationToken : cancellationToken) : await _handler.Read <TMember>(buffer, length, async, cancellationToken : cancellationToken); _set(composite, value); }
T DoRead <T>(NpgsqlTypeHandler handler) { try { ReadColumnLenIfNeeded(); if (_columnLen == -1) { throw new InvalidCastException("Column is null"); } // If we know the entire column is already in memory, use the code path without async var result = _columnLen <= _buf.ReadBytesLeft ? handler.Read <T>(_buf, _columnLen) : handler.Read <T>(_buf, _columnLen, false).GetAwaiter().GetResult(); _leftToReadInDataMsg -= _columnLen; _columnLen = int.MinValue; // Mark that the (next) column length hasn't been read yet _column++; return(result); } catch { _connector.Break(); Cleanup(); throw; } }