private IEnumerator<BlockTxNode> ReadBlockTransactions(UInt256 blockHash, bool requireTx)
{
using (var handle = this.cursorCache.TakeItem())
{
var cursor = handle.Item;
using (var jetTx = cursor.jetSession.BeginTransaction())
{
int blockIndex;
if (!TryGetBlockIndex(cursor, blockHash, out blockIndex))
throw new MissingDataException(blockHash);
Api.JetSetCurrentIndex(cursor.jetSession, cursor.blocksTableId, "IX_BlockIndexTxIndex");
Api.MakeKey(cursor.jetSession, cursor.blocksTableId, blockIndex, MakeKeyGrbit.NewKey);
Api.MakeKey(cursor.jetSession, cursor.blocksTableId, 0, MakeKeyGrbit.None);
if (!Api.TrySeek(cursor.jetSession, cursor.blocksTableId, SeekGrbit.SeekGE))
throw new MissingDataException(blockHash);
Api.MakeKey(cursor.jetSession, cursor.blocksTableId, blockIndex, MakeKeyGrbit.NewKey);
Api.MakeKey(cursor.jetSession, cursor.blocksTableId, int.MaxValue, MakeKeyGrbit.None);
if (!Api.TrySetIndexRange(cursor.jetSession, cursor.blocksTableId, SetIndexRangeGrbit.RangeUpperLimit))
throw new MissingDataException(blockHash);
do
{
var txIndexColumn = new Int32ColumnValue { Columnid = cursor.txIndexColumnId };
var blockDepthColumn = new Int32ColumnValue { Columnid = cursor.blockDepthColumnId };
var blockTxHashColumn = new BytesColumnValue { Columnid = cursor.blockTxHashColumnId };
var blockTxBytesColumn = new BytesColumnValue { Columnid = cursor.blockTxBytesColumnId };
Api.RetrieveColumns(cursor.jetSession, cursor.blocksTableId, txIndexColumn, blockDepthColumn, blockTxHashColumn, blockTxBytesColumn);
var txIndex = txIndexColumn.Value.Value;
var depth = blockDepthColumn.Value.Value;
var txHash = DbEncoder.DecodeUInt256(blockTxHashColumn.Value);
var txBytes = blockTxBytesColumn.Value;
// determine if transaction is pruned by its depth
var pruned = depth >= 0;
depth = Math.Max(0, depth);
if (pruned && requireTx)
throw new MissingDataException(blockHash);
var blockTxNode = new BlockTxNode(txIndex, depth, txHash, pruned, txBytes?.ToImmutableArray());
yield return blockTxNode;
}
while (Api.TryMoveNext(cursor.jetSession, cursor.blocksTableId));
}
}
}