public override long GetBytes(int i, long dataIndex, byte[] buffer, int bufferIndex, int length)
{
int cbytes = 0;
int ndataIndex;
byte[] data = (byte[])_values[i];
cbytes = data.Length;
// since arrays can't handle 64 bit values and this interface doesn't
// allow chunked access to data, a dataIndex outside the rang of Int32
// is invalid
if (dataIndex > int.MaxValue)
{
throw ADP.InvalidSourceBufferIndex(cbytes, dataIndex, nameof(dataIndex));
}
ndataIndex = (int)dataIndex;
// if no buffer is passed in, return the number of characters we have
if (null == buffer)
return cbytes;
try
{
if (ndataIndex < cbytes)
{
// help the user out in the case where there's less data than requested
if ((ndataIndex + length) > cbytes)
cbytes = cbytes - ndataIndex;
else
cbytes = length;
}
// until arrays are 64 bit, we have to do these casts
Array.Copy(data, ndataIndex, buffer, bufferIndex, cbytes);
}
catch (Exception e) when (ADP.IsCatchableExceptionType(e))
{
cbytes = data.Length;
if (length < 0)
{
throw ADP.InvalidDataLength(length);
}
// if bad buffer index, throw
if (bufferIndex < 0 || bufferIndex >= buffer.Length)
{
throw ADP.InvalidDestinationBufferIndex(length, bufferIndex, nameof(bufferIndex));
}
// if bad data index, throw
if (dataIndex < 0 || dataIndex >= cbytes)
{
throw ADP.InvalidSourceBufferIndex(length, dataIndex, nameof(dataIndex));
}
// if there is not enough room in the buffer for data
if (cbytes + bufferIndex > buffer.Length)
{
throw ADP.InvalidBufferSizeOrIndex(cbytes, bufferIndex);
}
}
return cbytes;
}