Exemplo n.º 1
0
        protected override async Task DoSomethingAsync(NpgsqlConnection connection, CancellationToken token)
        {
            NpgsqlTransaction transaction = null;

            try
            {
                var nameFormat = new Regex(@"^\d{4}-\d{2}-\d{2}-\d{2}.sql$");
                var contents   = _fileProvider
                                 .GetDirectoryContents("sql")
                                 .Where(f => nameFormat.IsMatch(f.Name))
                                 .OrderBy(f => f.Name)
                                 .ToArray();

                if (!contents.Any())
                {
                    return;
                }

                var versions = await connection.GetVersionNamesAsync(token);

                transaction = connection.BeginTransaction();

                foreach (var content in contents)
                {
                    if (versions.Contains(content.Name))
                    {
                        continue;
                    }

                    string sql;
                    using (var sr = new StreamReader(content.CreateReadStream()))
                    {
                        sql = sr.ReadToEnd();
                    }
                    await connection.UpdateDb(sql, token);

                    await connection.AddVersion(content.Name, token);
                }

                transaction.CommitAndDispose();
            }
            catch (OperationCanceledException)
            {
                transaction.RollbackAndDispose();
            }
            catch (Exception)
            {
                transaction.RollbackAndDispose();
                throw;
            }
        }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        protected override async Task DoSomethingAsync(NpgsqlConnection connection, CancellationToken token)
        {
            var settings = new TokenCostServiceSettings();

            Configuration.GetSection("TokenCostServiceSettings").Bind(settings);

            var eosToUsd = await GetEosUsdAsync(settings, token);

            var tokenCost = new List <TokenCost>
            {
                new TokenCost
                {
                    Contract  = 6138663591592764928, //eosio.token
                    TokenName = "EOS",
                    EosRate   = 1,
                    UsdRate   = eosToUsd
                }
            };

            await GetNewDexContractsCostAsync(settings, eosToUsd, tokenCost, token);
            await GetDexEosContractsCostAsync(settings, eosToUsd, tokenCost, token);

            connection.Open();
            NpgsqlTransaction transaction = null;

            try
            {
                transaction = connection.BeginTransaction();
                await connection.UpdateTokenCost(tokenCost, token);

                transaction.CommitAndDispose();
            }
            catch (Exception)
            {
                transaction.RollbackAndDispose();
                throw;
            }
        }
Exemplo n.º 4
0
        protected override async Task DoSomethingAsync(NpgsqlConnection connection, CancellationToken token)
        {
            var isAny = await connection.IsDappComExistAsync(token);

            if (isAny)
            {
                return;
            }

            connection.Close();

            var api = new AppSettings();

            Configuration.GetSection("DappComApi")
            .Bind(api);

            var client = new HttpClient();

            var dapps = await GetAppIdAsync(client, api.Url, token);

            var set = new List <RootObject>(dapps.Count);

            for (var i = 0; i < dapps.Count; i++)
            {
                await Task.Delay(TimeSpan.FromSeconds(5), token);

                Logger.LogInformation($"Progress: {i} | {dapps.Count}");

                var dapp = dapps[i];
                var info = await GetDappInfoOrDefaultAsync(client, $"{api.Url}app/details/{dapp}", token);

                if (info != null)
                {
                    set.Add(info);
                }
            }

            NpgsqlTransaction transaction = null;

            try
            {
                connection.Open();
                transaction = connection.BeginTransaction();

                foreach (var item in set)
                {
                    await InsertOrUpdateDappInfoAsync(connection, item, token);
                }

                transaction.CommitAndDispose();
                connection.Close();
            }
            catch (HttpRequestException e)
            {
                transaction.RollbackAndDispose();
                Logger.LogWarning(e, nameof(DappComService));
            }
            catch (Exception e)
            {
                transaction.RollbackAndDispose();
                Logger.LogError(e, nameof(DappComService));
            }
        }
Exemplo n.º 5
0
        public static async Task UpdateTransferInfo(this NpgsqlConnection connection, CancellationToken token)
        {
            var currentState = await GetTransfersInfoLastState(connection, token);

            var cmd = $@"SELECT relname
                         FROM pg_class 
                         WHERE relname SIMILAR TO 'transfer_[\d]{4}_[\d]{2}_[\d]{2}' 
{(string.IsNullOrEmpty(currentState) ? string.Empty : "AND relname > (SELECT json FROM public.service_state WHERE service_id = 2 )")}
                         ORDER BY relname;";


            var command = new NpgsqlCommand
            {
                Connection  = connection,
                CommandText = cmd
            };

            var tables = new List <string>();

            using (var reader = await command.ExecuteReaderAsync(token))
            {
                while (reader.Read())
                {
                    tables.Add(reader.GetStringOrDefault(0));
                }
            }

            if (tables.Count < 2)
            {
                return;
            }

            foreach (var table in tables.Take(tables.Count - 1))
            {
                NpgsqlTransaction transaction = null;
                try
                {
                    var dts = table.Substring(table.Length - 10);
                    var dt  = DateTime.ParseExact(dts, "yyyy_MM_dd", CultureInfo.InvariantCulture);

                    //TODO: KOA (SELECT DISTINCT contract FROM public.dapp_contract) - it`s a crutch dapp_contract.contract must be uniq
                    var upd =
                        $@"
                           DELETE FROM transfers_info WHERE ""timestamp"" = '{dt:yyyy-MM-dd}';
                           INSERT INTO public.transfers_info(""timestamp"", action_contract, token_name, contract, ""sum"", ""count"", ""from_count"", ""to_count"", ""type"")
                           SELECT t.timestamp, t.action_contract, t.token_name, t.from AS contract, SUM(t.quantity) AS ""sum"", COUNT(*) AS ""count"", COUNT(DISTINCT t.from) AS ""from_count"", COUNT(DISTINCT t.to) AS ""to_count"", 0 AS ""type""
                           FROM {table} t
                           JOIN (SELECT DISTINCT contract FROM public.dapp_contract) dc ON dc.contract = t.from
                           WHERE t.transaction_status = 0
                           GROUP BY t.timestamp, t.action_contract, t.token_name, t.from
                           UNION
                           SELECT t.timestamp, t.action_contract, t.token_name, t.to AS contract, SUM(t.quantity) AS ""sum"", COUNT(*) AS ""count"", COUNT(DISTINCT t.from) AS ""from_count"", COUNT(DISTINCT t.to) AS ""to_count"", 1 AS ""type""
                           FROM {table} t
                           JOIN (SELECT DISTINCT contract FROM public.dapp_contract) dc ON dc.contract = t.to
                           WHERE t.transaction_status = 0
                           GROUP BY t.timestamp, t.action_contract, t.token_name, t.to
                           ON CONFLICT (""timestamp"", action_contract, token_name, contract, ""type"") DO NOTHING;
                            
                           UPDATE service_state SET json='{table}' WHERE service_id = 2 AND json = '{currentState}';
                           SELECT json FROM service_state WHERE service_id = 2 ";

                    transaction = connection.BeginTransaction();

                    var cmdUpdate = new NpgsqlCommand
                    {
                        Connection  = connection,
                        CommandText = upd
                    };

                    var newTable = string.Empty;
                    using (var reader = await cmdUpdate.ExecuteReaderAsync(token))
                    {
                        while (reader.Read())
                        {
                            newTable = reader.GetStringOrDefault(0);
                        }
                    }

                    if (table.Equals(newTable))
                    {
                        transaction.CommitAndDispose();
                        currentState = newTable;
                    }
                    else
                    {
                        transaction.RollbackAndDispose();
                        return;
                    }
                }
                catch
                {
                    transaction.RollbackAndDispose();
                    throw;
                }
            }
        }
Exemplo n.º 6
0
        public static async Task UpdateDelayedTransferAsync(this NpgsqlConnection connection, CancellationToken token)
        {
            var limit     = 10000;
            var delSet    = new List <TransferAction>();
            var container = new ScraperCashContainer();

            var get = $@"SELECT t.block_num, t.transaction_id, t.action_num, t.action_contract, t.action_name, 
                                t.transaction_expiration, t.from, t.to, t.quantity, t.token_name, t.memo_utf8, 
                                dt.transaction_status, dt.block_num AS close_block_num, dt.timestamp
                         FROM public.transfer_1970_01_01 t
                         JOIN public.delayed_transaction dt ON dt.transaction_id = t.transaction_id
                         WHERE t.block_num <= dt.block_num
                         ORDER BY dt.timestamp
                         LIMIT {limit};";

            do
            {
                NpgsqlTransaction transaction = null;
                try
                {
                    delSet.Clear();
                    container.Clear();

                    var command = new NpgsqlCommand
                    {
                        Connection  = connection,
                        CommandText = get
                    };

                    using (var reader = await command.ExecuteReaderAsync(token))
                    {
                        while (reader.Read())
                        {
                            var itm = new TransferAction
                            {
                                BlockNum              = reader.GetLongOrDefault(0),
                                TransactionId         = reader.GetBytesOrDefault(1),
                                ActionNum             = reader.GetIntegerOrDefault(2),
                                ActionContractId      = reader.GetULongOrDefault(3),
                                ActionName            = reader.GetStringOrDefault(4),
                                TransactionExpiration = reader.GetDateTimeOrDefault(5),
                                FromId            = reader.GetULongOrDefault(6),
                                ToId              = reader.GetULongOrDefault(7),
                                Quantity          = reader.GetDecimalOrDefault(8),
                                TokenName         = reader.GetStringOrDefault(9),
                                MemoUtf8          = reader.GetBytesOrDefault(10),
                                TransactionStatus = reader.GetNullableStatusEnum(11),
                                CloseBlockNum     = reader.GetLongOrNull(12),
                                Timestamp         = reader.GetDateTimeOrDefault(13),
                            };

                            container.AddToBuffer(itm);
                            delSet.Add(itm);
                        }
                    }

                    if (!delSet.Any())
                    {
                        return;
                    }

                    transaction = connection.BeginTransaction();

                    var dComm = new NpgsqlCommand
                    {
                        Connection = connection
                    };

                    var sb = new StringBuilder();
                    for (var i = 0; i < delSet.Count; i++)
                    {
                        var itm = delSet[i];
                        sb.AppendLine($"DELETE FROM public.transfer_1970_01_01 WHERE block_num = @p1_{i} AND transaction_id = @p2_{i} AND action_num = @p3_{i};");
                        dComm.Parameters.AddValue($"p1_{i}", itm.BlockNum);
                        dComm.Parameters.AddValue($"p2_{i}", itm.TransactionId);
                        dComm.Parameters.AddValue($"p3_{i}", itm.ActionNum);
                    }

                    dComm.CommandText = sb.ToString();
                    await dComm.ExecuteNonQueryAsync(token);

                    container.FlushBuffer();

                    await container.CommitAndDispose(connection, long.MaxValue, token);

                    transaction.CommitAndDispose();
                }
                catch
                {
                    transaction.RollbackAndDispose();
                    throw;
                }
            } while (delSet.Count == limit);
        }