private void GetItemsFromContractAtBlock(BlockHeader blockHeader, bool isConsecutiveBlock, TxReceipt[] receipts = null) { bool fromReceipts = receipts != null; if (fromReceipts || !isConsecutiveBlock) { bool incrementalChanges = _dataContract.IncrementalChanges; bool canGetFullStateFromReceipts = fromReceipts && (isConsecutiveBlock || !incrementalChanges) && !blockHeader.IsGenesis; try { IEnumerable <T> items = canGetFullStateFromReceipts ? _dataContract.GetItemsChangedFromBlock(blockHeader, receipts) : _dataContract.GetAllItemsFromBlock(blockHeader); if (!fromReceipts || !isConsecutiveBlock || !incrementalChanges) { RemoveOldContractItemsFromCollection(); } Collection.Insert(items); _lastHash = blockHeader.Hash; } catch (AbiException e) { if (_logger.IsError) { _logger.Error("Failed to update data from contract.", e); } } } }
private void GetItemsFromContractAtBlock(BlockHeader blockHeader, bool isConsecutiveBlock, TxReceipt[] receipts = null) { Items ??= CreateItems(); bool fromReceipts = receipts != null; if (fromReceipts || !isConsecutiveBlock) { if (!fromReceipts || !isConsecutiveBlock || !_dataContract.IncrementalChanges) { ClearItems(Items); } bool canGetFullStateFromReceipts = fromReceipts && (isConsecutiveBlock || !_dataContract.IncrementalChanges) && !blockHeader.IsGenesis; IEnumerable <T> items = canGetFullStateFromReceipts ? _dataContract.GetItemsChangedFromBlock(blockHeader, receipts) : _dataContract.GetAllItemsFromBlock(blockHeader); InsertItems(Items, items); _lastHash = blockHeader.Hash; } }
private void GetItemsFromContractAtBlock(BlockHeader blockHeader, bool isConsecutiveBlock, TxReceipt[] receipts = null) { bool fromReceipts = receipts != null; if (fromReceipts || !isConsecutiveBlock) { bool incrementalChanges = _dataContract.IncrementalChanges; bool canGetFullStateFromReceipts = fromReceipts && (isConsecutiveBlock || !incrementalChanges); try { bool dataChanged = true; IEnumerable <T> items; lock (_lock) { if (canGetFullStateFromReceipts) { dataChanged = _dataContract.TryGetItemsChangedFromBlock(blockHeader, receipts, out items); if (!dataChanged && !isConsecutiveBlock) { items = _dataContract.GetAllItemsFromBlock(blockHeader); dataChanged = true; } } else { items = _dataContract.GetAllItemsFromBlock(blockHeader); } } if (dataChanged) { if (!fromReceipts || !isConsecutiveBlock || !incrementalChanges) { RemoveOldContractItemsFromCollection(); } Collection.Insert(items); TraceDataChanged("contract"); } _lastHash = blockHeader.Hash; if (_logger.IsTrace) { _logger.Trace($"{GetType()} trying to {nameof(GetItemsFromContractAtBlock)} with params " + $"{nameof(canGetFullStateFromReceipts)}:{canGetFullStateFromReceipts}, " + $"{nameof(fromReceipts)}:{fromReceipts}, " + $"{nameof(isConsecutiveBlock)}:{isConsecutiveBlock}, " + $"{nameof(incrementalChanges)}:{incrementalChanges}, " + $"{nameof(dataChanged)}:{dataChanged}. " + $"Results in {string.Join(", ", Collection.GetSnapshot())}. " + $"On {blockHeader.ToString(BlockHeader.Format.FullHashAndNumber)}. " + $"From {new StackTrace()}"); } } catch (AbiException e) { if (_logger.IsError) { _logger.Error($"Failed to update data from contract on block {blockHeader.ToString(BlockHeader.Format.FullHashAndNumber)} {new StackTrace()}.", e); } } } }