예제 #1
0
        /// <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);
            }
        }
예제 #2
0
 public void InitTableUpdate(Meta.Message source, string filter)
 {
     // Парсер начинает обрабатывать буфер ответа.
     // Здесь при необходимости нужно провести
     // обработку в зависимости от комбинации значений
     // source.ClearOnUpdate, source.IsOrderbook
     if (source.ClearOnUpdate)
     {
         _records.Clear();
     }
 }
예제 #3
0
        public override void DoneTableUpdate(Meta.Message source, string filter)
        {
            // Просто окончание работы парсера, а-ля commit.
            // Очистка более ненужных переменных.
            if (_orderbook != null)
            {
                _stockBox.Update(_orderbook);
            }

            _orderbook = null;
        }
예제 #4
0
        public void DoneRecordUpdate(Meta.Message source, string filter)
        {
            // Закончили обрабатывать запись.
            // Хорошее место для сохранения накопленных данных куда-то.
            // В демо-примере - просто печать в консоль.

            ProcessRecord();
            // Здесь также следует сбросить собранные значения первичных ключей,
            // чтобы подготовиться к получению значений для следующей записи.
            _keys.Clear();
            _currentRecord = null;
        }
예제 #5
0
        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);
            }
        }
예제 #6
0
 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);
        }
예제 #8
0
 //for compatiable with ITarget
 public virtual void SwitchOrderbook(Meta.Message source, string filter, string board, string paper)
 {
 }
예제 #9
0
 public virtual void DoneTableUpdate(Meta.Message source, string filter)
 {
 }