private byte[] ReceiveSliceResponse(ArrayDesc desc) { try { int operation = _database.ReadOperation(); if (operation == IscCodes.op_slice) { // Read slice length bool isVariying = false; int elements = 0; int length = _database.ReadInt32(); length = _database.ReadInt32(); switch (desc.DataType) { case IscCodes.blr_text: case IscCodes.blr_text2: case IscCodes.blr_cstring: case IscCodes.blr_cstring2: elements = length / desc.Length; length += elements * ((4 - desc.Length) & 3); break; case IscCodes.blr_varying: case IscCodes.blr_varying2: elements = length / desc.Length; isVariying = true; break; case IscCodes.blr_short: length = length * desc.Length; break; } if (isVariying) { XdrStream xdr = new XdrStream(); for (int i = 0; i < elements; i++) { byte[] buffer = _database.ReadOpaque(_database.ReadInt32()); xdr.WriteBuffer(buffer, buffer.Length); } return(xdr.ToArray()); } else { return(_database.ReadOpaque(length)); } } else { _database.SetOperation(operation); _database.ReadResponse(); return(null); } } catch (IOException) { throw new IscException(IscCodes.isc_net_read_err); } }