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 * Copyright (c) 1995, 1996 1N/A * Margo Seltzer. All rights reserved. 1N/A * Copyright (c) 1995, 1996 1N/A * The President and Fellows of Harvard University. All rights reserved. 1N/A * This code is derived from software contributed to Berkeley by 1N/A * Redistribution and use in source and binary forms, with or without 1N/A * modification, are permitted provided that the following conditions 1N/A * 1. Redistributions of source code must retain the above copyright 1N/A * notice, this list of conditions and the following disclaimer. 1N/A * 2. Redistributions in binary form must reproduce the above copyright 1N/A * notice, this list of conditions and the following disclaimer in the 1N/A * documentation and/or other materials provided with the distribution. 1N/A * 3. All advertising materials mentioning features or use of this software 1N/A * must display the following acknowledgement: 1N/A * This product includes software developed by the University of 1N/A * California, Berkeley and its contributors. 1N/A * 4. Neither the name of the University nor the names of its contributors 1N/A * may be used to endorse or promote products derived from this software 1N/A * without specific prior written permission. 1N/A * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 1N/A * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1N/A * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1N/A * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 1N/A * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1N/A * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 1N/A * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 1N/A * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 1N/A * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 1N/A * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 1N/A#
endif /* not lint */ 1N/A * __ham_insdel_recover -- 1N/A * PUBLIC: int __ham_insdel_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A * We are undoing and the page doesn't exist. That 1N/A * is equivalent to having a pagelsn of 0, so we 1N/A * would not have to undo anything. In this case, 1N/A * don't bother creating a page. 1N/A * Two possible things going on: 1N/A * redo a put/undo a delete: add the item to the page. 1N/A * If we are undoing a delete, then the information logged is the 1N/A * entire entry off the page, not just the data of a dbt. In 1N/A * this case, we want to copy it back onto the page verbatim. 1N/A * We do this by calling __putitem with the type H_OFFPAGE instead 1N/A * Need to redo a PUT or undo a delete. If we are undoing a 1N/A * delete, we've got to restore the item back to its original 1N/A * position. That's a royal pain in the butt (because we do 1N/A * not store item lengths on the page), but there's no choice. 1N/A /* Need to undo a put or redo a delete. */ 1N/A /* Return the previous LSN. */ 1N/A * __ham_newpage_recover -- 1N/A * This log message is used when we add/remove overflow pages. This 1N/A * message takes care of the pointer chains, not the data on the pages. 1N/A * PUBLIC: int __ham_newpage_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A * We are undoing and the page doesn't exist. That 1N/A * is equivalent to having a pagelsn of 0, so we 1N/A * would not have to undo anything. In this case, 1N/A * don't bother creating a page. 1N/A * There are potentially three pages we need to check: the one 1N/A /* Redo a create new page or undo a delete new page. */ 1N/A * Redo a delete or undo a create new page. All we 1N/A * really need to do is change the LSN. 1N/A /* Now do the prev page. */ 1N/A * We are undoing and the page doesn't exist. 1N/A * That is equivalent to having a pagelsn of 0, 1N/A * so we would not have to undo anything. In 1N/A * this case, don't bother creating a page. 1N/A /* Redo a create new page or undo a delete new page. */ 1N/A /* Redo a delete or undo a create new page. */ 1N/A /* Now time to do the next page */ 1N/A * We are undoing and the page doesn't exist. 1N/A * That is equivalent to having a pagelsn of 0, 1N/A * so we would not have to undo anything. In 1N/A * this case, don't bother creating a page. 1N/A /* Redo a create new page or undo a delete new page. */ 1N/A /* Redo a delete or undo a create new page. */ 1N/A * __ham_replace_recover -- 1N/A * This log message refers to partial puts that are local to a single 1N/A * page. You can think of them as special cases of the more general 1N/A * insdel log message. 1N/A * PUBLIC: int __ham_replace_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A * We are undoing and the page doesn't exist. That 1N/A * is equivalent to having a pagelsn of 0, so we 1N/A * would not have to undo anything. In this case, 1N/A * don't bother creating a page. 1N/A /* Reapply the change as specified. */ 1N/A /* Undo the already applied change. */ 1N/A * __ham_newpgno_recover -- 1N/A * This log message is used when allocating or deleting an overflow 1N/A * page. It takes care of modifying the meta data. 1N/A * PUBLIC: int __ham_newpgno_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A * There are two phases to the recovery here. First we need 1N/A * to update the meta data; then we need to update the page. 1N/A * We'll do the meta-data first. 1N/A /* Need to redo an allocation or undo a deletion. */ 1N/A /* Need to redo a deletion */ 1N/A /* undo an allocation. */ 1N/A * We are undoing and the page doesn't exist. That 1N/A * is equivalent to having a pagelsn of 0, so we 1N/A * would not have to undo anything. In this case, 1N/A * don't bother creating a page. 1N/A /* Need to redo an allocation. */ 1N/A /* Undoing a delete. */ 1N/A /* Need to redo a deletion or undo an allocation. */ 1N/A * __ham_splitmeta_recover -- 1N/A * This is the meta-data part of the split. Records the new and old 1N/A * bucket numbers and the new/old mask information. 1N/A * PUBLIC: int __ham_splitmeta_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A * There are two phases to the recovery here. First we need 1N/A * to update the meta data; then we need to update the page. 1N/A * We'll do the meta-data first. 1N/A /* Need to redo the split information. */ 1N/A /* Need to undo the split information. */ 1N/A * __ham_splitdata_recover -- 1N/A * PUBLIC: int __ham_splitdata_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A * We are undoing and the page doesn't exist. That 1N/A * is equivalent to having a pagelsn of 0, so we 1N/A * would not have to undo anything. In this case, 1N/A * don't bother creating a page. 1N/A * There are two types of log messages here, one for the old page 1N/A * and one for the new pages created. The original image in the 1N/A * SPLITOLD record is used for undo. The image in the SPLITNEW 1N/A * is used for redo. We should never have a case where there is 1N/A * a redo operation and the SPLITOLD record is on disk, but not 1N/A * the SPLITNEW record. Therefore, we only have work to do when 1N/A * redo NEW messages and undo OLD messages, but we have to update 1N/A * LSNs in both cases. 1N/A /* Need to redo the split described. */ 1N/A /* Put back the old image. */ 1N/A * __ham_ovfl_recover -- 1N/A * This message is generated when we initialize a set of overflow pages. 1N/A * PUBLIC: int __ham_ovfl_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A /* Redo the allocation. */ 1N/A * __ham_copypage_recover -- 1N/A * Recovery function for copypage. 1N/A * PUBLIC: int __ham_copypage_recover 1N/A * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *)); 1N/A /* This is the bucket page. */ 1N/A * We are undoing and the page doesn't exist. That 1N/A * is equivalent to having a pagelsn of 0, so we 1N/A * would not have to undo anything. In this case, 1N/A * don't bother creating a page. 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */ 1N/A /* Now fix up the "next" page. */ 1N/A * We are undoing and the page doesn't exist. That 1N/A * is equivalent to having a pagelsn of 0, so we 1N/A * would not have to undo anything. In this case, 1N/A * don't bother creating a page. 1N/A /* There is nothing to do in the REDO case; only UNDO. */ 1N/A /* Need to undo update described. */ 1N/A /* Now fix up the next's next page. */ 1N/A * We are undoing and the page doesn't exist. That 1N/A * is equivalent to having a pagelsn of 0, so we 1N/A * would not have to undo anything. In this case, 1N/A * don't bother creating a page. 1N/A /* Need to redo update described. */ 1N/A /* Need to undo update described. */