public async Task <bool> EnsurePreviousLoadedAsync(OrderedBalanceChange change) { if (!NeedLoading(change)) { return(true); } var parentIds = change.SpentOutpoints.Select(s => s.Hash).ToArray(); var parents = await GetTransactionsAsync(false, ColoredBalance, parentIds).ConfigureAwait(false); var cache = new NoSqlTransactionRepository(); foreach (var parent in parents.Where(p => p != null)) { cache.Put(parent.TransactionId, parent.Transaction); } if (change.SpentCoins == null) { var success = await change.EnsureSpentCoinsLoadedAsync(cache).ConfigureAwait(false); if (!success) { return(false); } } if (ColoredBalance && change.ColoredTransaction == null) { var indexerRepo = new IndexerColoredTransactionRepository(Configuration); indexerRepo.Transactions = new CompositeTransactionRepository(new[] { new ReadOnlyTransactionRepository(cache), indexerRepo.Transactions }); var success = await change.EnsureColoredTransactionLoadedAsync(indexerRepo).ConfigureAwait(false); if (!success) { return(false); } } var entity = change.ToEntity(ConsensusFactory); if (!change.IsEmpty) { await Configuration.GetBalanceTable().ExecuteAsync(TableOperation.Merge(entity)).ConfigureAwait(false); } else { try { await Configuration.GetTransactionTable().ExecuteAsync(TableOperation.Delete(entity)).ConfigureAwait(false); } catch (StorageException ex) { if (ex.RequestInformation == null || ex.RequestInformation.HttpStatusCode != 404) { throw; } } } return(true); }
public async Task<bool> EnsurePreviousLoadedAsync(OrderedBalanceChange change) { if(!NeedLoading(change)) return true; var parentIds = change.SpentOutpoints.Select(s => s.Hash).ToArray(); var parents = await GetTransactionsAsync(false, ColoredBalance, parentIds).ConfigureAwait(false); var cache = new NoSqlTransactionRepository(); foreach(var parent in parents.Where(p => p != null)) cache.Put(parent.TransactionId, parent.Transaction); if(change.SpentCoins == null) { var success = await change.EnsureSpentCoinsLoadedAsync(cache).ConfigureAwait(false); if(!success) return false; } if(ColoredBalance && change.ColoredTransaction == null) { var indexerRepo = new IndexerColoredTransactionRepository(Configuration); indexerRepo.Transactions = new CompositeTransactionRepository(new[] { new ReadOnlyTransactionRepository(cache), indexerRepo.Transactions }); var success = await change.EnsureColoredTransactionLoadedAsync(indexerRepo).ConfigureAwait(false); if(!success) return false; } var entity = change.ToEntity(); if(!change.IsEmpty) { await Configuration.GetBalanceTable().ExecuteAsync(TableOperation.Merge(entity)).ConfigureAwait(false); } else { try { await Configuration.GetTransactionTable().ExecuteAsync(TableOperation.Delete(entity)).ConfigureAwait(false); } catch(StorageException ex) { if(ex.RequestInformation == null || ex.RequestInformation.HttpStatusCode != 404) throw; } } return true; }