Ejemplo n.º 1
0
        public void AddAmount(IDbConnection con, IDbTransaction tx, string poolId, string coin, string address, decimal amount, string usage)
        {
            logger.LogInvoke();

            var now = DateTime.UtcNow;

            // record balance change
            var query = "INSERT INTO balance_changes(poolid, coin, address, amount, usage, created) " +
                        "VALUES(@poolid, @coin, @address, @amount, @usage, @created)";

            var balanceChange = new Entities.BalanceChange
            {
                PoolId  = poolId,
                Coin    = coin.ToString(),
                Created = now,
                Address = address,
                Amount  = amount,
                Usage   = usage,
            };

            con.Execute(query, balanceChange, tx);

            // update balance
            query = "SELECT * FROM balances WHERE poolid = @poolId AND coin = @coin AND address = @address";

            var balance = con.Query <Entities.Balance>(query, new { poolId, coin = coin.ToString(), address }, tx)
                          .FirstOrDefault();

            if (balance == null)
            {
                balance = new Entities.Balance
                {
                    PoolId  = poolId,
                    Coin    = coin.ToString(),
                    Created = now,
                    Address = address,
                    Amount  = amount,
                    Updated = now
                };

                query = "INSERT INTO balances(poolid, coin, address, amount, created, updated) " +
                        "VALUES(@poolid, @coin, @address, @amount, @created, @updated)";

                con.Execute(query, balance, tx);
            }

            else
            {
                query = "UPDATE balances SET amount = amount + @amount, updated = now() at time zone 'utc' " +
                        "WHERE poolid = @poolId AND coin = @coin AND address = @address";

                con.Execute(query, new
                {
                    poolId,
                    address,
                    coin = coin.ToString().ToUpper(),
                    amount
                }, tx);
            }
        }
Ejemplo n.º 2
0
        public async Task <int> AddAmountAsync(IDbConnection con, IDbTransaction tx, string poolId, string address, decimal amount, string usage, params string[] tags)
        {
            logger.LogInvoke();

            var now = DateTime.UtcNow;

            // record balance change
            var query = "INSERT INTO balance_changes(poolid, address, amount, usage, tags, created) " +
                        "VALUES(@poolid, @address, @amount, @usage, @tags, @created)";

            var balanceChange = new Entities.BalanceChange
            {
                PoolId  = poolId,
                Created = now,
                Address = address,
                Amount  = amount,
                Usage   = usage,
                Tags    = tags
            };

            await con.ExecuteAsync(query, balanceChange, tx);

            // update balance
            query = "SELECT * FROM balances WHERE poolid = @poolId AND address = @address";

            var balance = (await con.QueryAsync <Entities.Balance>(query, new { poolId, address }, tx))
                          .FirstOrDefault();

            if (balance == null)
            {
                balance = new Entities.Balance
                {
                    PoolId  = poolId,
                    Created = now,
                    Address = address,
                    Amount  = amount,
                    Updated = now
                };

                query = "INSERT INTO balances(poolid, address, amount, created, updated) " +
                        "VALUES(@poolid, @address, @amount, @created, @updated)";

                return(await con.ExecuteAsync(query, balance, tx));
            }

            else
            {
                query = "UPDATE balances SET amount = amount + @amount, updated = now() at time zone 'utc' " +
                        "WHERE poolid = @poolId AND address = @address";

                return(await con.ExecuteAsync(query, new
                {
                    poolId,
                    address,
                    amount
                }, tx));
            }
        }