Esempio n. 1
0
static int apply_increment(struct fast_book_set *set, struct fast_book *dst, struct fast_message *msg)
{
	struct fast_sequence *seq;
	struct fast_field *field;
	struct fast_message *md;
	struct fast_book *book;
	int i;

	field = fast_get_field(msg, "MDEntries");
	if (!field || field_state_empty(field))
		goto fail;

	seq = field->ptr_value;
	if (field_state_empty(&seq->length))
		goto fail;

	for (i = 1; i <= seq->length.uint_value; i++) {
		md = seq->elements + i;

		field = fast_get_field(md, "SecurityID");
		if (!field || field_state_empty(field))
			goto fail;

		book = fast_book_find(set, field->uint_value);
		if (!book || !book_has_flags(book, FAST_BOOK_ACTIVE))
			continue;

		if (dst && dst->secid != book->secid)
			continue;

		field = fast_get_field(md, "RptSeq");
		if (!field || field_state_empty(field))
			goto fail;

		book->rptseq++;
		if (book->rptseq != field->uint_value)
			goto fail;

		book_clear_flags(book, FAST_BOOK_EMPTY);
		book_add_mask(set, book);

		if (md_increment(book, md))
			goto fail;
	}

	return 0;

fail:
	return -1;
}
Esempio n. 2
0
static int apply_increment(struct fast_book_set *set, struct fast_book *dst, struct fast_message *msg)
{
	struct fast_sequence *seq;
	struct fast_field *field;
	struct fast_message *md;
	struct fast_book *book;
	int i;

	field = fast_get_field(msg, "MDEntries");
	if (!field) {
		field = fast_get_field(msg, "GroupMDEntries");
	}

	if (!field || field_state_empty(field))
		goto fail;

	seq = field->ptr_value;
	if (field_state_empty(&seq->length))
		goto fail;

	for (i = 1; i <= seq->length.uint_value; i++) {
		md = seq->elements + i;

		field = fast_get_field(md, "SecurityID");
		if (field) {
			if (field_state_empty(field))
				goto fail;

			book = fast_book_by_id(set, field->uint_value);
			if (!book)
				continue;

			if (!book_has_flags(book, FAST_BOOK_ACTIVE) &&
					!book_has_flags(book, FAST_BOOK_JOIN))
				continue;

			if (dst && dst->secid != book->secid)
				continue;
		} else {
			field = fast_get_field(md, "Symbol");
			if (!field || field_state_empty(field))
				goto fail;

			book = fast_book_by_symbol(set, field->string_value);
			if (!book)
				continue;

			if (!book_has_flags(book, FAST_BOOK_ACTIVE) &&
					!book_has_flags(book, FAST_BOOK_JOIN))
				continue;

			if (dst && strncmp(book->symbol, dst->symbol,
							strlen(dst->symbol)))
				continue;
		}

		field = fast_get_field(md, "TradingSessionID");
		if (field) {
			if (field_state_empty(field))
				goto fail;

			if (strncmp(book->session, field->string_value,
						strlen(book->session)))
				continue;
		}

		field = fast_get_field(md, "RptSeq");
		if (!field || field_state_empty(field))
			goto fail;

		if (!book->rptseq)
			book->rptseq = field->uint_value - 1;

		book->rptseq++;
		if (book->rptseq != field->uint_value)
			goto fail;

		book_clear_flags(book, FAST_BOOK_EMPTY);
		book_add_mask(set, book);

		if (md_increment(book, md))
			goto fail;
	}

	return 0;

fail:
	return -1;
}