1N/A * See the file LICENSE for redistribution information. 1N/A * Copyright (c) 1996, 1997, 1998 1N/A * Sleepycat Software. All rights reserved. 1N/A#
endif /* not lint */ 1N/A * __bam_pg_alloc_recover -- 1N/A * Recovery function for pg_alloc. 1N/A * PUBLIC: int __bam_pg_alloc_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A * Fix up the allocated page. If we're redoing the operation, we have 1N/A * to get the page (creating it if it doesn't exist), and update its 1N/A * LSN. If we're undoing the operation, we have to reset the page's 1N/A * LSN and put it on the free list. 1N/A * Fix up the metadata page. If we're redoing the operation, we have 1N/A * to get the metadata page and update its LSN and its free pointer. 1N/A * If we're undoing the operation and the page was ever created, we put 1N/A * it on the freelist. 1N/A /* The metadata page must always exist. */ 1N/A * We specify creation and check for it later, because this 1N/A * operation was supposed to create the page, and even in 1N/A * the undo case it's going to get linked onto the freelist 1N/A * which we're also fixing up. 1N/A /* Fix up the allocated page. */ 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */ 1N/A /* Fix up the metadata page. */ 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */ 1N/A * __bam_pg_free_recover -- 1N/A * Recovery function for pg_free. 1N/A * PUBLIC: int __bam_pg_free_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A * Fix up the freed page. If we're redoing the operation we get the 1N/A * page and explicitly discard its contents, then update its LSN. If 1N/A * we're undoing the operation, we get the page and restore its header. 1N/A * We don't automatically create the page. The only way the 1N/A * page might not exist is if the alloc never happened, and 1N/A * the only way the alloc might never have happened is if we 1N/A * are undoing, in which case there's no reason to create the 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */ 1N/A * Fix up the metadata page. If we're redoing or undoing the operation 1N/A * we get the page and update its LSN and free pointer. 1N/A /* The metadata page must always exist. */ 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */ 1N/A * __bam_split_recover -- 1N/A * Recovery function for split. 1N/A * PUBLIC: int __bam_split_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A * There are two kinds of splits that we have to recover from. The 1N/A * first is a root-page split, where the root page is split from a 1N/A * leaf page into an internal page and two new leaf pages are created. 1N/A * The second is where a page is split into two pages, and a new key 1N/A * is inserted into the parent page. 1N/A * Decide if we need to resplit the page. 1N/A * If this is a root split, then the root has to exist, it's 1N/A * the page we're splitting and it gets modified. If this is 1N/A * not a root split, then the left page has to exist, for the 1N/A /* Split the page. */ 1N/A /* If the left child is wrong, update it. */ 1N/A /* If the right child is wrong, update it. */ 1N/A * If the parent page is wrong, update it. This is of interest 1N/A * only if it was a root split, since root splits create parent 1N/A * pages. All other splits modify a parent page, but those are 1N/A * separately logged and recovered. 1N/A * Finally, redo the next-page link if necessary. This is of 1N/A * interest only if it wasn't a root split -- inserting a new 1N/A * page in the tree requires that any following page have its 1N/A * previous-page pointer updated to our new page. The next 1N/A * page must exist because we're redoing the operation. 1N/A * If the split page is wrong, replace its contents with the 1N/A * logged page contents. If the page doesn't exist, it means 1N/A * that the create of the page never happened, nor did any of 1N/A * the adds onto the page that caused the split, and there's 1N/A * really no undo-ing to be done. 1N/A * If it's a root split and the left child ever existed, update 1N/A * its LSN. (If it's not a root split, we've updated the left 1N/A * page already -- it's the same as the split page.) If the 1N/A * right child ever existed, root split or not, update its LSN. 1N/A * The undo of the page allocation(s) will restore them to the 1N/A * Finally, undo the next-page link if necessary. This is of 1N/A * interest only if it wasn't a root split -- inserting a new 1N/A * page in the tree requires that any following page have its 1N/A * previous-page pointer updated to our new page. Since it's 1N/A * possible that the next-page never existed, we ignore it as 1N/A * if there's nothing to undo. 1N/Aout:
/* Free any pages that weren't dirtied. */ 1N/A /* Free any allocated space. */ 1N/A * __bam_rsplit_recover -- 1N/A * Recovery function for a reverse split. 1N/A * PUBLIC: int __bam_rsplit_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A /* Fix the root page. */ 1N/A /* The root page must always exist. */ 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */ 1N/A * Fix the page copied over the root page. It's possible that the 1N/A * page never made it to disk, so if we're undo-ing and the page 1N/A * doesn't exist, it's okay and there's nothing further to do. 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */ 1N/A * __bam_adj_recover -- 1N/A * Recovery function for adj. 1N/A * PUBLIC: int __bam_adj_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A /* Get the page; if it never existed and we're undoing, we're done. */ 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */ 1N/A * __bam_cadjust_recover -- 1N/A * Recovery function for the adjust of a count change in an internal 1N/A * PUBLIC: int __bam_cadjust_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A /* Get the page; if it never existed and we're undoing, we're done. */ 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */ 1N/A * __bam_cdel_recover -- 1N/A * Recovery function for the intent-to-delete of a cursor record. 1N/A * PUBLIC: int __bam_cdel_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A /* Get the page; if it never existed and we're undoing, we're done. */ 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */ 1N/A * __bam_repl_recover -- 1N/A * Recovery function for page item replacement. 1N/A * PUBLIC: int __bam_repl_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A /* Get the page; if it never existed and we're undoing, we're done. */ 1N/A * Need to redo update described. 1N/A * Re-build the replacement item. 1N/A * Need to undo update described. 1N/A * Re-build the original item. 1N/A /* Reset the deleted flag, if necessary. */