| 3289 | } |
| 3290 | |
| 3291 | Validation::RTN Validation::walk_tip(TraNumber transaction) |
| 3292 | { |
| 3293 | /************************************** |
| 3294 | * |
| 3295 | * w a l k _ t i p |
| 3296 | * |
| 3297 | ************************************** |
| 3298 | * |
| 3299 | * Functional description |
| 3300 | * Walk transaction inventory pages. |
| 3301 | * |
| 3302 | **************************************/ |
| 3303 | Database* dbb = vdr_tdbb->getDatabase(); |
| 3304 | |
| 3305 | if (!dbb->getKnownPagesCount(pag_transactions)) |
| 3306 | return corrupt(VAL_TIP_LOST, 0); |
| 3307 | |
| 3308 | tx_inv_page* page = 0; |
| 3309 | const ULONG pages = transaction / dbb->dbb_page_manager.transPerTIP; |
| 3310 | |
| 3311 | for (ULONG sequence = 0; sequence <= pages; sequence++) |
| 3312 | { |
| 3313 | auto pageNumber = dbb->getKnownPage(pag_transactions, sequence); |
| 3314 | if (!pageNumber) |
| 3315 | { |
| 3316 | corrupt(VAL_TIP_LOST_SEQUENCE, 0, sequence); |
| 3317 | if (!(vdr_flags & VDR_repair)) |
| 3318 | continue; |
| 3319 | |
| 3320 | TRA_extend_tip(vdr_tdbb, sequence); |
| 3321 | vdr_fixed++; |
| 3322 | |
| 3323 | pageNumber = dbb->getKnownPage(pag_transactions, sequence); |
| 3324 | } |
| 3325 | |
| 3326 | WIN window(DB_PAGE_SPACE, -1); |
| 3327 | fetch_page(true, pageNumber, pag_transactions, &window, &page); |
| 3328 | |
| 3329 | #ifdef DEBUG_VAL_VERBOSE |
| 3330 | if (VAL_debug_level) |
| 3331 | fprintf(stdout, "walk_tip: page %d next %d\n", pageNumber, page->tip_next); |
| 3332 | #endif |
| 3333 | const auto next = dbb->getKnownPage(pag_transactions, sequence + 1); |
| 3334 | if (page->tip_next && page->tip_next != next) |
| 3335 | { |
| 3336 | corrupt(VAL_TIP_CONFUSED, 0, sequence); |
| 3337 | } |
| 3338 | release_page(&window); |
| 3339 | } |
| 3340 | |
| 3341 | return rtn_ok; |
| 3342 | } |
| 3343 | |
| 3344 | Validation::RTN Validation::walk_scns() |
| 3345 | { |
nothing calls this directly
no test coverage detected