/// <summary> /// Специфическая операция для таблиц типа "котировки" (table.isOrderbook()) /// Для таких таблиц значения ключевых полей setKeyField() не задаются для /// каждой записи, вместо этого идет "переключение стакана" - блока записей. /// Данный вызов информирует вас о том, что начинается новый блок /// для указанного инструмента ticker. /// </summary> public override void SwitchOrderbook(Meta.Message source, string filter, string board, string paper) { //New orderbook block (for another instrument) recieved. //So, update previous orderbook block (instrument) before //orderbook object will clear or replaced if (_orderbook != null) { _stockBox.Update(_orderbook); } if (_dictOrderbooks.TryGetValue(board + '.' + paper, out _orderbook)) { // "Стакан" уже есть - его нужно очистить, // т.к. новые значения полностью заменяют старые. _orderbook.Clear(); } else { // Инструмент встретился впервые, // подготовим для него "стакан" _orderbook = new List <CTableRecrd>(); _dictOrderbooks.Add(board + '.' + paper, _orderbook); } }
public void InitTableUpdate(Meta.Message source, string filter) { // Парсер начинает обрабатывать буфер ответа. // Здесь при необходимости нужно провести // обработку в зависимости от комбинации значений // source.ClearOnUpdate, source.IsOrderbook if (source.ClearOnUpdate) { _records.Clear(); } }
public override void DoneTableUpdate(Meta.Message source, string filter) { // Просто окончание работы парсера, а-ля commit. // Очистка более ненужных переменных. if (_orderbook != null) { _stockBox.Update(_orderbook); } _orderbook = null; }
public void DoneRecordUpdate(Meta.Message source, string filter) { // Закончили обрабатывать запись. // Хорошее место для сохранения накопленных данных куда-то. // В демо-примере - просто печать в консоль. ProcessRecord(); // Здесь также следует сбросить собранные значения первичных ключей, // чтобы подготовиться к получению значений для следующей записи. _keys.Clear(); _currentRecord = null; }
public virtual bool InitRecordUpdate(Meta.Message source, string filter) { //Log("InitRecordUpdate Name=" + source.Name); // Начало обработки записи. // Здесь нужно произвести поиск по ключам // и вернуть true, если запись не найдена (т.е. новая) if (_keys.Count == 0) { // SetKeyValue() ни разу не был вызван - // данная таблица не имеет первичных ключей. // Все записи будут считаться новыми, хранить // их будем по порядковому номеру. _currentRecord = new CTableRecrd(); _records.Add(_records.Count.ToString(), _currentRecord); return(true); } else { // У таблицы есть первичные ключи - // ищем и храним записи по их значению. var b = new StringBuilder(); foreach (DictionaryEntry e in _keys) { b.Append(e.Key.ToString()) .Append('='); if (e.Value != null) { b.Append(e.Value.ToString()); } // else b.Append(';'); } var s = b.ToString(); if (_records.TryGetValue(s, out _currentRecord)) { // Запись найдена return(false); } // Запись по ключу не найдена - создадим новую _currentRecord = new CTableRecrd(); _records.Add(s, _currentRecord); return(true); } }
public override bool InitRecordUpdate(Meta.Message source, string filter) { if (source.IsOrderbook) { // Для таблиц типа "orderbook" - специальная обработка. // Запись всегда будет новой, добавим ее в "стакан" if (_orderbook != null) { _currentRecord = new CTableRecrd(); _orderbook.Add(_currentRecord); } return(true); } return(false); }
// IBinder implementation /// <summary> /// Gets table. Call each time on parsing. Parsing /// need to get table to make it's job. /// </summary> public ITarget Detect(Meta.Message source) { //if table is alresy created - return it CBaseTable target; if (_database.TryGetValue(source.Name, out target)) { return(target); } //if table is not create it call factory method target = CBaseTable.CreateTable(source.Name, _dealingServer); _database.Add(source.Name, target); return(target); }
//for compatiable with ITarget public virtual void SwitchOrderbook(Meta.Message source, string filter, string board, string paper) { }
public virtual void DoneTableUpdate(Meta.Message source, string filter) { }