/// <summary> /// Сохранение данных фин. инструмента в базе /// </summary> /// <param name="ins">Фин. инструмент</param> public void SaveInstrum(CommonData.Instrum ins) { if (ins.InsID > 0) { _instrumDA.UpdateInstrum(ins.InsID, ins.Ticker, ins.ShortName, ins.Name, ins.LotSize, ins.Decimals, ins.PriceStep); } else { ins.InsID = _instrumDA.InsertInstrum(ins.Ticker, ins.ShortName, ins.Name, ins.LotSize, ins.Decimals, ins.PriceStep); } }
public PositionTest() { DbContextOptionsBuilder <DaContext> builder = new DbContextOptionsBuilder <DaContext>(); builder.UseNpgsql("Username=postgres;Password=123;Host=localhost;Port=5432;Database=pulxer_test"); _options = builder.Options; _insDA = new InstrumDA(_options); _accountDA = new AccountDA(_options); _positionDA = new PositionDA(_options); // создание var gazp = _insDA.GetInstrum(0, "GAZP"); if (gazp == null) { _gazpID = _insDA.InsertInstrum("GAZP", "Газпром", "Газпром", 10, 2, 1); } else { _gazpID = gazp.InsID; } var lkoh = _insDA.GetInstrum(0, "LKOH"); if (lkoh == null) { _lkohID = _insDA.InsertInstrum("LKOH", "Лукойл", "Лукойл", 1, 0, 0); } else { _lkohID = lkoh.InsID; } _accountID = _accountDA.CreateAccount("", "", 0, false, Common.Data.AccountTypes.Test).AccountID; }
/// <summary> /// Синхронизировать фин. инструмент (изменить или создать новый) /// </summary> /// <param name="ticker">Тикер</param> /// <param name="shortname">Краткое наименование</param> /// <param name="name">Полное наименование</param> /// <param name="lotsize">Размер лота</param> /// <param name="decimals">Кол-во десятичных знаков после запятой в цене</param> /// <param name="pricestep">Шаг цены</param> /// <returns>Фин. инструмент после синхронизации</returns> public Instrum SyncInstrum(string ticker, string shortname, string name, int lotsize, int decimals, decimal pricestep) { if (!_ticker_instrum.ContainsKey(ticker)) { Instrum db_ins = _da.GetInstrum(0, ticker); if (db_ins == null) { var ins = new Instrum { InsID = 0, Ticker = ticker, ShortName = shortname, Name = name, LotSize = lotsize, Decimals = decimals, PriceStep = pricestep }; _da.InsertInstrum(ins); _ticker_instrum.Add(ticker, ins); _insID_instrum.Add(ins.InsID, ins); return(ins); } else { UpdateInstrum(db_ins, shortname, name, lotsize, decimals, pricestep); _ticker_instrum.Add(ticker, db_ins); _insID_instrum.Add(db_ins.InsID, db_ins); return(db_ins); } } else { var ins = _ticker_instrum[ticker]; UpdateInstrum(ins, shortname, name, lotsize, decimals, pricestep); return(ins); } }
/// <summary> /// Синхронизация фин инструментов /// </summary> private async Task SyncInstrums(ISyncPipeServer sps) { var remInstrums = await sps.GetInstrumList(); if (remInstrums == null) { return; } var instrums = _instrumDA.GetInstrums(); foreach (var rIns in remInstrums) { if (_instrum_rid_lid.ContainsKey(rIns.InsID)) { int lid = _instrum_rid_lid[rIns.InsID]; var ins = instrums.FirstOrDefault(r => r.InsID == lid); if (ins != null) // локальный найден { if (ins.Ticker != rIns.Ticker || ins.ShortName != rIns.ShortName || ins.Name != rIns.Name || ins.LotSize != rIns.LotSize || ins.Decimals != rIns.Decimals || ins.PriceStep != rIns.PriceStep) { _instrumDA.UpdateInstrum(ins.InsID, rIns.Ticker, rIns.ShortName, rIns.Name, rIns.LotSize, rIns.Decimals, rIns.PriceStep); } } else // соответствие есть, но локальный не найден, значит соответствие уже не действительно { int insID = _instrumDA.InsertInstrum( rIns.Ticker, rIns.ShortName, rIns.Name, rIns.LotSize, rIns.Decimals, rIns.PriceStep); _instrum_rid_lid[rIns.InsID] = insID; // прописываем новый ключ } } else // соответствие не найдено { int insID = _instrumDA.InsertInstrum( rIns.Ticker, rIns.ShortName, rIns.Name, rIns.LotSize, rIns.Decimals, rIns.PriceStep); _instrum_rid_lid.Add(rIns.InsID, insID); } } // отследим ситуацию, когда удаленный объект удален, а локальный остался // если локальный объект есть, а репликации для него нет, то значит этот объект не реплицировался и мы его не трогаем // если локальный объект есть и репликация для него есть, то мы смотрим remote-объект // если remote-объект есть, то здесь ничего не делаем (эту ситуацию мы обработали выше) // если remote-объекта нет, то локальный объект НЕ удаляем и не меняем, а просто удаляем для него репликацию // удалить локальный объект нельзя, т.к. на него могут быть ссылки, т.е. он остается, но больше не будет реплицироваться // если в удаленной базе объект снова возникнет под прежним id (что вряд-ли возможно), // то локально будет создан новый объект, а старый также останется foreach (var ins in instrums) { if (!_instrum_rid_lid.ContainsValue(ins.InsID)) { continue; // запись не реплицировалась и мы ее пропускаем } var repl = _instrum_rid_lid.FirstOrDefault(r => r.Value == ins.InsID); // обязательно будет не null var found = remInstrums.FirstOrDefault(r => r.InsID == repl.Key); if (found == null) // соответствующей remote-записи нет, значит локальную запись удаляем и убираем для нее репликацию { _instrum_rid_lid.Remove(repl.Key); } } }