| 1528 | } |
| 1529 | |
| 1530 | Validation::RTN Validation::walk_chain(jrd_rel* relation, const rhd* header, |
| 1531 | RecordNumber head_number) |
| 1532 | { |
| 1533 | /************************************** |
| 1534 | * |
| 1535 | * w a l k _ c h a i n |
| 1536 | * |
| 1537 | ************************************** |
| 1538 | * |
| 1539 | * Functional description |
| 1540 | * Make sure chain of record versions is completely intact. |
| 1541 | * |
| 1542 | **************************************/ |
| 1543 | #ifdef DEBUG_VAL_VERBOSE |
| 1544 | USHORT counter = 0; |
| 1545 | #endif |
| 1546 | |
| 1547 | ULONG page_number = header->rhd_b_page; |
| 1548 | USHORT line_number = header->rhd_b_line; |
| 1549 | WIN window(DB_PAGE_SPACE, -1); |
| 1550 | window.win_flags = WIN_garbage_collector; |
| 1551 | |
| 1552 | while (page_number) |
| 1553 | { |
| 1554 | const bool delta_flag = (header->rhd_flags & rhd_delta) ? true : false; |
| 1555 | #ifdef DEBUG_VAL_VERBOSE |
| 1556 | if (VAL_debug_level) |
| 1557 | fprintf(stdout, " BV %02d: ", ++counter); |
| 1558 | #endif |
| 1559 | vdr_rel_chain_counter++; |
| 1560 | data_page* page = 0; |
| 1561 | fetch_page(true, page_number, pag_data, &window, &page); |
| 1562 | |
| 1563 | if (page->dpg_relation != relation->rel_id) |
| 1564 | { |
| 1565 | release_page(&window); |
| 1566 | return corrupt(VAL_DATA_PAGE_CONFUSED, relation, page_number, page->dpg_sequence); |
| 1567 | } |
| 1568 | |
| 1569 | vdr_rel_chain_counter++; |
| 1570 | PBM_SET(vdr_tdbb->getDefaultPool(), &vdr_chain_pages, page_number); |
| 1571 | |
| 1572 | const data_page::dpg_repeat* line = &page->dpg_rpt[line_number]; |
| 1573 | header = (const rhd*) ((UCHAR*) page + line->dpg_offset); |
| 1574 | if (page->dpg_count <= line_number || !line->dpg_length || |
| 1575 | (header->rhd_flags & (rhd_blob | rhd_fragment)) || |
| 1576 | !(header->rhd_flags & rhd_chain) || |
| 1577 | walk_record(relation, header, line->dpg_length, |
| 1578 | head_number, delta_flag) != rtn_ok) |
| 1579 | { |
| 1580 | release_page(&window); |
| 1581 | return corrupt(VAL_REC_CHAIN_BROKEN, relation, head_number.getValue()); |
| 1582 | } |
| 1583 | page_number = header->rhd_b_page; |
| 1584 | line_number = header->rhd_b_line; |
| 1585 | release_page(&window); |
| 1586 | } |
| 1587 |
nothing calls this directly
no test coverage detected