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; }
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; }