public WriteBatch CreateWriteBatch()
        {
            var writeBatch = new WriteBatch();

            try
            {
                foreach (var update in updates)
                {
                    var txIndex     = update.Key;
                    var blockTxNode = update.Value;

                    var key = DbEncoder.EncodeBlockHashTxIndex(blockHash, txIndex);
                    if (blockTxNode != null)
                    {
                        writeBatch.Put(key, DataEncoder.EncodeBlockTxNode(blockTxNode));
                    }
                    else
                    {
                        writeBatch.Delete(key);
                    }
                }

                return(writeBatch);
            }
            catch (Exception)
            {
                writeBatch.Dispose();
                throw;
            }
        }
Exemplo n.º 2
0
        public bool TryAddBlockTransactions(UInt256 blockHash, IEnumerable <EncodedTx> blockTxes)
        {
            if (ContainsBlock(blockHash))
            {
                return(false);
            }

            var writeBatch = new WriteBatch();

            try
            {
                int txCount;
                using (var snapshot = db.GetSnapshot())
                {
                    var readOptions = new ReadOptions {
                        Snapshot = snapshot
                    };

                    var txIndex = 0;
                    foreach (var tx in blockTxes)
                    {
                        var key = DbEncoder.EncodeBlockHashTxIndex(blockHash, txIndex);

                        Slice existingValue;
                        if (db.TryGet(readOptions, key, out existingValue))
                        {
                            return(false);
                        }

                        var blockTx = new BlockTx(txIndex, tx);
                        var value   = DataEncoder.EncodeBlockTxNode(blockTx);

                        writeBatch.Put(key, value);

                        txIndex++;
                    }

                    txCount = txIndex;
                }

                return(TryAddBlockInner(blockHash, txCount, writeBatch));
            }
            finally
            {
                writeBatch.Dispose();
            }
        }