private async Task BulkSaveAsync(NpgsqlConnection connection, ScraperCashContainer container, ScraperState scraperState, CancellationToken token) { NpgsqlTransaction transaction = null; try { var st = DateTime.Now; transaction = connection.BeginTransaction(); scraperState.BlockId = MoveToMaxConsistentBlockNum(scraperState.BlockId); var count = container.Count; await container.CommitAndDispose(connection, scraperState.BlockId, token); await connection.UpdateServiceStateAsync(ServiceId, JsonConvert.SerializeObject(scraperState), token); await _blockMiningService.UpdateNodeInfoAsync(connection, token); transaction.Commit(); _temporaryLogManager.Add(new BulkSaveTemporaryLog(st, count)); } catch (Exception e) { transaction.RollbackAndDispose(); _temporaryLogManager.Add(new BulkSaveTemporaryLog(e)); Logger.LogCritical(e, "BulkSaveAsync"); throw; } }
private void Parse(ScraperCashContainer container, GetBlockResults result) { if (result.Transactions.Any()) { foreach (var t in result.Transactions) { if (t.Trx is JObject jObj) { var id = jObj.Value <string>("id"); var trx = jObj.Value <JObject>("transaction"); var expiration = trx.Value <DateTime>("expiration"); var actions = trx.Value <JArray>("actions"); for (var i = 0; i < actions.Count; i++) { var action = actions[i]; var a = action.ToActionOrNull(result, id, t.Status, i, expiration); if (a != null) { container.AddToBuffer(a); } } } else { var trx = t.Trx as string; var ts = new DelayedTransaction { BlockNum = result.BlockNum, TransactionId = Hex.HexToBytes(trx), TransactionStatus = t.Status, Timestamp = result.Timestamp.Value }; container.AddToBuffer(ts); } } container.FlushBuffer(); } }