MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / walk_chain

Method walk_chain

src/jrd/validation.cpp:1530–1589  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1528}
1529
1530Validation::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

Callers

nothing calls this directly

Calls 3

corruptFunction · 0.85
getDefaultPoolMethod · 0.45
getValueMethod · 0.45

Tested by

no test coverage detected