internal static void copyNodeContent(MemPage pFrom, MemPage pTo, ref RC pRC) { if (pRC != RC.OK) { return; } var pBt = pFrom.Shared; var aFrom = pFrom.Data; var aTo = pTo.Data; var iFromHdr = pFrom.HeaderOffset; var iToHdr = (pTo.ID == 1 ? 100 : 0); Debug.Assert(pFrom.HasInit); Debug.Assert(pFrom.FreeBytes >= iToHdr); Debug.Assert(ConvertEx.Get2(aFrom, iFromHdr + 5) <= (int)pBt.UsableSize); // Copy the b-tree node content from page pFrom to page pTo. var iData = (int)ConvertEx.Get2(aFrom, iFromHdr + 5); Buffer.BlockCopy(aFrom, iData, aTo, iData, (int)pBt.UsableSize - iData); Buffer.BlockCopy(aFrom, iFromHdr, aTo, iToHdr, pFrom.CellOffset + 2 * pFrom.Cells); // Reinitialize page pTo so that the contents of the MemPage structure match the new data. The initialization of pTo can actually fail under // fairly obscure circumstances, even though it is a copy of initialized page pFrom. pTo.HasInit = false; var rc = pTo.btreeInitPage(); if (rc != RC.OK) { pRC = rc; return; } // If this is an auto-vacuum database, update the pointer-map entries for any b-tree or overflow pages that pTo now contains the pointers to. #if !SQLITE_OMIT_AUTOVACUUM if (pBt.AutoVacuum) #else if (false) #endif { pRC = pTo.setChildPtrmaps(); } }
internal RC getAndInitPage(Pgno pgno, ref MemPage ppPage) { Debug.Assert(MutexEx.Held(this.Mutex)); RC rc; if (pgno > btreePagecount()) { rc = SysEx.SQLITE_CORRUPT_BKPT(); } else { rc = btreeGetPage(pgno, ref ppPage, 0); if (rc == RC.OK) { rc = ppPage.btreeInitPage(); if (rc != RC.OK) { ppPage.releasePage(); } } } Debug.Assert(pgno != 0 || rc == RC.CORRUPT); return(rc); }
internal RC getAndInitPage(Pgno pgno, ref MemPage ppPage) { Debug.Assert(MutexEx.Held(this.Mutex)); RC rc; if (pgno > btreePagecount()) rc = SysEx.SQLITE_CORRUPT_BKPT(); else { rc = btreeGetPage(pgno, ref ppPage, 0); if (rc == RC.OK) { rc = ppPage.btreeInitPage(); if (rc != RC.OK) ppPage.releasePage(); } } Debug.Assert(pgno != 0 || rc == RC.CORRUPT); return rc; }
internal static void copyNodeContent(MemPage pFrom, MemPage pTo, ref RC pRC) { if (pRC != RC.OK) return; var pBt = pFrom.Shared; var aFrom = pFrom.Data; var aTo = pTo.Data; var iFromHdr = pFrom.HeaderOffset; var iToHdr = (pTo.ID == 1 ? 100 : 0); Debug.Assert(pFrom.HasInit); Debug.Assert(pFrom.FreeBytes >= iToHdr); Debug.Assert(ConvertEx.Get2(aFrom, iFromHdr + 5) <= (int)pBt.UsableSize); // Copy the b-tree node content from page pFrom to page pTo. var iData = (int)ConvertEx.Get2(aFrom, iFromHdr + 5); Buffer.BlockCopy(aFrom, iData, aTo, iData, (int)pBt.UsableSize - iData); Buffer.BlockCopy(aFrom, iFromHdr, aTo, iToHdr, pFrom.CellOffset + 2 * pFrom.Cells); // Reinitialize page pTo so that the contents of the MemPage structure match the new data. The initialization of pTo can actually fail under // fairly obscure circumstances, even though it is a copy of initialized page pFrom. pTo.HasInit = false; var rc = pTo.btreeInitPage(); if (rc != RC.OK) { pRC = rc; return; } // If this is an auto-vacuum database, update the pointer-map entries for any b-tree or overflow pages that pTo now contains the pointers to. #if !SQLITE_OMIT_AUTOVACUUM if (pBt.AutoVacuum) #else if (false) #endif { pRC = pTo.setChildPtrmaps(); } }