Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Data.SqlClient;
- using System.IO;
- namespace SRP.Processor
- {
- public class TradeProcessor
- {
- private static float LotSize = 100000f;
- private List<TradeRecord> ValidateTrades(List<string> lines)
- {
- var trades = new List<TradeRecord>();
- var lineCount = 1;
- foreach (var line in lines)
- {
- var fields = line.Split(new char[] { ';' });
- if (fields.Length != 3)
- {
- Console.WriteLine($"WARN: Line {lineCount} malformed. Only {fields.Length} field(s) found.");
- continue;
- }
- if (fields[0].Length != 6)
- {
- Console.WriteLine($"WARN: Trade currencies on line {lineCount} malformed: '{fields[0]}'");
- continue;
- }
- int tradeAmount;
- if (!int.TryParse(fields[1], out tradeAmount))
- {
- Console.WriteLine($"WARN: Trade amount on line {lineCount} not a valid integer: '{fields[1]}'");
- }
- decimal tradePrice;
- if (!decimal.TryParse(fields[2], out tradePrice))
- {
- Console.WriteLine($"WARN: Trade price on line {lineCount} not a valid decimal: '{fields[2]}'");
- }
- trades.Add(CreateTrade(fields[0], tradeAmount, tradePrice));
- lineCount++;
- }
- return trades;
- }
- private TradeRecord CreateTrade(string name, int tradeAmount, decimal tradePrice)
- {
- var sourceCurrencyCode = name.Substring(0, 3);
- var destinationCurrencyCode = name.Substring(3, 3);
- // calculate values
- var trade = new TradeRecord
- {
- SourceCurrency = sourceCurrencyCode,
- DestinationCurrency = destinationCurrencyCode,
- Lots = tradeAmount / LotSize,
- Price = tradePrice
- };
- return trade;
- }
- private List<string> ReadTrades(Stream stream)
- {
- // read rows
- var lines = new List<string>();
- using (var reader = new StreamReader(stream))
- {
- string line;
- while ((line = reader.ReadLine()) != null)
- {
- lines.Add(line);
- }
- }
- return lines;
- }
- private void WriteTradesToDatabase(List<TradeRecord> trades)
- {
- using (var connection = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=TradeProcessor;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False"))
- {
- connection.Open();
- using (var transaction = connection.BeginTransaction())
- {
- foreach (var trade in trades)
- {
- var command = connection.CreateCommand();
- command.Transaction = transaction;
- command.CommandType = System.Data.CommandType.StoredProcedure;
- command.CommandText = "dbo.insert_trade";
- command.Parameters.AddWithValue("@sourceCurrency", trade.SourceCurrency);
- command.Parameters.AddWithValue("@destinationCurrency", trade.DestinationCurrency);
- command.Parameters.AddWithValue("@lots", trade.Lots);
- command.Parameters.AddWithValue("@price", trade.Price);
- command.ExecuteNonQuery();
- }
- transaction.Commit();
- }
- connection.Close();
- }
- }
- public void ProcessTrades(Stream stream)
- {
- var lines = ReadTrades(stream);
- var trades = ValidateTrades(lines);
- WriteTradesToDatabase(trades);
- Console.WriteLine($"INFO: {trades.Count} trades processed");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement