static int apply_snapshot(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, "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)) goto done; if (dst && dst->secid != book->secid) goto done; 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; field = fast_get_field(msg, "RptSeq"); if (!field || field_state_empty(field)) goto fail; book->rptseq = field->uint_value; book_clear_flags(book, FAST_BOOK_EMPTY); book_add_mask(set, book); for (i = 1; i <= seq->length.uint_value; i++) { md = seq->elements + i; if (md_snapshot(book, md)) goto fail; } if (!fast_book_is_valid(book)) { if (!book_has_flags(book, FAST_BOOK_EMPTY)) goto fail; } else { book_add_flags(book, FAST_BOOK_ACTIVE); } done: return 0; fail: return -1; }
static int apply_snapshot(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, "SecurityID"); if (field) { if (field_state_empty(field)) goto fail; book = fast_book_by_id(set, field->uint_value); if (!book || book_has_flags(book, FAST_BOOK_ACTIVE)) goto done; if (!book_has_flags(book, FAST_BOOK_JOIN)) goto done; if (dst && dst->secid != book->secid) goto done; } else { field = fast_get_field(msg, "Symbol"); if (!field || field_state_empty(field)) goto fail; book = fast_book_by_symbol(set, field->string_value); if (!book || book_has_flags(book, FAST_BOOK_ACTIVE)) goto done; if (!book_has_flags(book, FAST_BOOK_JOIN)) goto done; if (dst && strncmp(book->symbol, dst->symbol, strlen(dst->symbol))) goto done; } 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; if (!seq->length.uint_value) goto done; md = seq->elements; 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))) goto done; } field = fast_get_field(msg, "RptSeq"); if (!field || field_state_empty(field)) goto fail; book->snpseq = field->uint_value; book_clear_flags(book, FAST_BOOK_EMPTY); book_add_mask(set, book); for (i = 1; i <= seq->length.uint_value; i++) { md = seq->elements + i; if (md_snapshot(book, md)) goto fail; } if (!book_has_flags(book, FAST_BOOK_EMPTY)) book_add_flags(book, FAST_BOOK_ACTIVE); done: return 0; fail: return -1; }