Lines Matching refs:pPager
762 #define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8) argument
768 #define JOURNAL_HDR_SZ(pPager) (pPager->sectorSize) argument
779 # define MEMDB pPager->memDb
815 int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ in sqlite3PagerDirectReadOk() argument
816 if( pPager->fd->pMethods==0 ) return 0; in sqlite3PagerDirectReadOk()
817 if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; in sqlite3PagerDirectReadOk()
819 if( pPager->pWal ){ in sqlite3PagerDirectReadOk()
822 rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); in sqlite3PagerDirectReadOk()
850 Pager *pPager = p; in assert_pager_state() local
867 assert( p->tempFile==0 || pPager->changeCountDone ); in assert_pager_state()
896 assert( pPager->changeCountDone==0 || pPager->eLock>=RESERVED_LOCK ); in assert_pager_state()
902 assert( pPager->errCode==SQLITE_OK ); in assert_pager_state()
903 assert( sqlite3PcacheRefCount(pPager->pPCache)==0 || pPager->tempFile ); in assert_pager_state()
907 assert( pPager->errCode==SQLITE_OK ); in assert_pager_state()
914 assert( pPager->errCode==SQLITE_OK ); in assert_pager_state()
915 if( !pagerUseWal(pPager) ){ in assert_pager_state()
918 assert( pPager->dbSize==pPager->dbOrigSize ); in assert_pager_state()
919 assert( pPager->dbOrigSize==pPager->dbFileSize ); in assert_pager_state()
920 assert( pPager->dbOrigSize==pPager->dbHintSize ); in assert_pager_state()
921 assert( pPager->setSuper==0 ); in assert_pager_state()
926 assert( pPager->errCode==SQLITE_OK ); in assert_pager_state()
927 if( !pagerUseWal(pPager) ){ in assert_pager_state()
939 assert( pPager->dbOrigSize==pPager->dbFileSize ); in assert_pager_state()
940 assert( pPager->dbOrigSize==pPager->dbHintSize ); in assert_pager_state()
945 assert( pPager->errCode==SQLITE_OK ); in assert_pager_state()
946 assert( !pagerUseWal(pPager) ); in assert_pager_state()
953 assert( pPager->dbOrigSize<=pPager->dbHintSize ); in assert_pager_state()
958 assert( pPager->errCode==SQLITE_OK ); in assert_pager_state()
959 assert( !pagerUseWal(pPager) ); in assert_pager_state()
972 assert( pPager->errCode!=SQLITE_OK ); in assert_pager_state()
973 assert( sqlite3PcacheRefCount(pPager->pPCache)>0 || pPager->tempFile ); in assert_pager_state()
1047 static void setGetterMethod(Pager *pPager){ in setGetterMethod() argument
1048 if( pPager->errCode ){ in setGetterMethod()
1049 pPager->xGet = getPageError; in setGetterMethod()
1051 }else if( USEFETCH(pPager) ){ in setGetterMethod()
1052 pPager->xGet = getPageMMap; in setGetterMethod()
1055 pPager->xGet = getPageNormal; in setGetterMethod()
1069 Pager *pPager = pPg->pPager; in subjRequiresPage() local
1073 for(i=0; i<pPager->nSavepoint; i++){ in subjRequiresPage()
1074 p = &pPager->aSavepoint[i]; in subjRequiresPage()
1076 for(i=i+1; i<pPager->nSavepoint; i++){ in subjRequiresPage()
1077 pPager->aSavepoint[i].bTruncateOnRelease = 0; in subjRequiresPage()
1089 static int pageInJournal(Pager *pPager, PgHdr *pPg){ in pageInJournal() argument
1090 return sqlite3BitvecTest(pPager->pInJournal, pPg->pgno); in pageInJournal()
1135 static int pagerUnlockDb(Pager *pPager, int eLock){ in pagerUnlockDb() argument
1138 assert( !pPager->exclusiveMode || pPager->eLock==eLock ); in pagerUnlockDb()
1140 assert( eLock!=NO_LOCK || pagerUseWal(pPager)==0 ); in pagerUnlockDb()
1141 if( isOpen(pPager->fd) ){ in pagerUnlockDb()
1142 assert( pPager->eLock>=eLock ); in pagerUnlockDb()
1143 rc = pPager->noLock ? SQLITE_OK : sqlite3OsUnlock(pPager->fd, eLock); in pagerUnlockDb()
1144 if( pPager->eLock!=UNKNOWN_LOCK ){ in pagerUnlockDb()
1145 pPager->eLock = (u8)eLock; in pagerUnlockDb()
1147 IOTRACE(("UNLOCK %p %d\n", pPager, eLock)) in pagerUnlockDb()
1149 pPager->changeCountDone = pPager->tempFile; /* ticket fb3b3024ea238d5c */ in pagerUnlockDb()
1163 static int pagerLockDb(Pager *pPager, int eLock){ in pagerLockDb() argument
1167 if( pPager->eLock<eLock || pPager->eLock==UNKNOWN_LOCK ){ in pagerLockDb()
1168 rc = pPager->noLock ? SQLITE_OK : sqlite3OsLock(pPager->fd, eLock); in pagerLockDb()
1169 if( rc==SQLITE_OK && (pPager->eLock!=UNKNOWN_LOCK||eLock==EXCLUSIVE_LOCK) ){ in pagerLockDb()
1170 pPager->eLock = (u8)eLock; in pagerLockDb()
1171 IOTRACE(("LOCK %p %d\n", pPager, eLock)) in pagerLockDb()
1196 static int jrnlBufferSize(Pager *pPager){ in jrnlBufferSize() argument
1203 assert( isOpen(pPager->fd) ); in jrnlBufferSize()
1204 dc = sqlite3OsDeviceCharacteristics(pPager->fd); in jrnlBufferSize()
1206 UNUSED_PARAMETER(pPager); in jrnlBufferSize()
1210 if( pPager->dbSize>0 && (dc&SQLITE_IOCAP_BATCH_ATOMIC) ){ in jrnlBufferSize()
1217 int nSector = pPager->sectorSize; in jrnlBufferSize()
1218 int szPage = pPager->pageSize; in jrnlBufferSize()
1227 return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager); in jrnlBufferSize()
1251 return pager_datahash(pPage->pPager->pageSize, (unsigned char *)pPage->pData); in pager_pagehash()
1264 Pager *pPager = pPg->pPager; in checkPage() local
1265 assert( pPager->eState!=PAGER_ERROR ); in checkPage()
1357 static i64 journalHdrOffset(Pager *pPager){ in journalHdrOffset() argument
1359 i64 c = pPager->journalOff; in journalHdrOffset()
1361 offset = ((c-1)/JOURNAL_HDR_SZ(pPager) + 1) * JOURNAL_HDR_SZ(pPager); in journalHdrOffset()
1363 assert( offset%JOURNAL_HDR_SZ(pPager)==0 ); in journalHdrOffset()
1365 assert( (offset-c)<JOURNAL_HDR_SZ(pPager) ); in journalHdrOffset()
1390 static int zeroJournalHdr(Pager *pPager, int doTruncate){ in zeroJournalHdr() argument
1392 assert( isOpen(pPager->jfd) ); in zeroJournalHdr()
1393 assert( !sqlite3JournalIsInMemory(pPager->jfd) ); in zeroJournalHdr()
1394 if( pPager->journalOff ){ in zeroJournalHdr()
1395 const i64 iLimit = pPager->journalSizeLimit; /* Local cache of jsl */ in zeroJournalHdr()
1397 IOTRACE(("JZEROHDR %p\n", pPager)) in zeroJournalHdr()
1399 rc = sqlite3OsTruncate(pPager->jfd, 0); in zeroJournalHdr()
1402 rc = sqlite3OsWrite(pPager->jfd, zeroHdr, sizeof(zeroHdr), 0); in zeroJournalHdr()
1404 if( rc==SQLITE_OK && !pPager->noSync ){ in zeroJournalHdr()
1405 rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_DATAONLY|pPager->syncFlags); in zeroJournalHdr()
1416 rc = sqlite3OsFileSize(pPager->jfd, &sz); in zeroJournalHdr()
1418 rc = sqlite3OsTruncate(pPager->jfd, iLimit); in zeroJournalHdr()
1440 static int writeJournalHdr(Pager *pPager){ in writeJournalHdr() argument
1442 char *zHeader = pPager->pTmpSpace; /* Temporary space used to build header */ in writeJournalHdr()
1443 u32 nHeader = (u32)pPager->pageSize;/* Size of buffer pointed to by zHeader */ in writeJournalHdr()
1447 assert( isOpen(pPager->jfd) ); /* Journal file must be open. */ in writeJournalHdr()
1449 if( nHeader>JOURNAL_HDR_SZ(pPager) ){ in writeJournalHdr()
1450 nHeader = JOURNAL_HDR_SZ(pPager); in writeJournalHdr()
1457 for(ii=0; ii<pPager->nSavepoint; ii++){ in writeJournalHdr()
1458 if( pPager->aSavepoint[ii].iHdrOffset==0 ){ in writeJournalHdr()
1459 pPager->aSavepoint[ii].iHdrOffset = pPager->journalOff; in writeJournalHdr()
1463 pPager->journalHdr = pPager->journalOff = journalHdrOffset(pPager); in writeJournalHdr()
1485 assert( isOpen(pPager->fd) || pPager->noSync ); in writeJournalHdr()
1486 if( pPager->noSync || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY) in writeJournalHdr()
1487 || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) in writeJournalHdr()
1496 sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); in writeJournalHdr()
1497 put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit); in writeJournalHdr()
1499 put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize); in writeJournalHdr()
1501 put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize); in writeJournalHdr()
1504 put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize); in writeJournalHdr()
1531 for(nWrite=0; rc==SQLITE_OK&&nWrite<JOURNAL_HDR_SZ(pPager); nWrite+=nHeader){ in writeJournalHdr()
1532 IOTRACE(("JHDR %p %lld %d\n", pPager, pPager->journalHdr, nHeader)) in writeJournalHdr()
1533 rc = sqlite3OsWrite(pPager->jfd, zHeader, nHeader, pPager->journalOff); in writeJournalHdr()
1534 assert( pPager->journalHdr <= pPager->journalOff ); in writeJournalHdr()
1535 pPager->journalOff += nHeader; in writeJournalHdr()
1559 Pager *pPager, /* Pager object */ in readJournalHdr() argument
1569 assert( isOpen(pPager->jfd) ); /* Journal file must be open. */ in readJournalHdr()
1575 pPager->journalOff = journalHdrOffset(pPager); in readJournalHdr()
1576 if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){ in readJournalHdr()
1579 iHdrOff = pPager->journalOff; in readJournalHdr()
1586 if( isHot || iHdrOff!=pPager->journalHdr ){ in readJournalHdr()
1587 rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), iHdrOff); in readJournalHdr()
1600 if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+8, pNRec)) in readJournalHdr()
1601 || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+12, &pPager->cksumInit)) in readJournalHdr()
1602 || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+16, pDbSize)) in readJournalHdr()
1607 if( pPager->journalOff==0 ){ in readJournalHdr()
1612 if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+20, &iSectorSize)) in readJournalHdr()
1613 || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+24, &iPageSize)) in readJournalHdr()
1623 iPageSize = pPager->pageSize; in readJournalHdr()
1647 rc = sqlite3PagerSetPagesize(pPager, &iPageSize, -1); in readJournalHdr()
1656 pPager->sectorSize = iSectorSize; in readJournalHdr()
1659 pPager->journalOff += JOURNAL_HDR_SZ(pPager); in readJournalHdr()
1683 static int writeSuperJournal(Pager *pPager, const char *zSuper){ in writeSuperJournal() argument
1690 assert( pPager->setSuper==0 ); in writeSuperJournal()
1691 assert( !pagerUseWal(pPager) ); in writeSuperJournal()
1694 || pPager->journalMode==PAGER_JOURNALMODE_MEMORY in writeSuperJournal()
1695 || !isOpen(pPager->jfd) in writeSuperJournal()
1699 pPager->setSuper = 1; in writeSuperJournal()
1700 assert( pPager->journalHdr <= pPager->journalOff ); in writeSuperJournal()
1711 if( pPager->fullSync ){ in writeSuperJournal()
1712 pPager->journalOff = journalHdrOffset(pPager); in writeSuperJournal()
1714 iHdrOff = pPager->journalOff; in writeSuperJournal()
1719 if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_SJ_PGNO(pPager)))) in writeSuperJournal()
1720 || (0 != (rc = sqlite3OsWrite(pPager->jfd, zSuper, nSuper, iHdrOff+4))) in writeSuperJournal()
1721 || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nSuper, nSuper))) in writeSuperJournal()
1722 || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nSuper+4, cksum))) in writeSuperJournal()
1723 || (0 != (rc = sqlite3OsWrite(pPager->jfd, aJournalMagic, 8, in writeSuperJournal()
1728 pPager->journalOff += (nSuper+20); in writeSuperJournal()
1740 if( SQLITE_OK==(rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize)) in writeSuperJournal()
1741 && jrnlSize>pPager->journalOff in writeSuperJournal()
1743 rc = sqlite3OsTruncate(pPager->jfd, pPager->journalOff); in writeSuperJournal()
1751 static void pager_reset(Pager *pPager){ in pager_reset() argument
1752 pPager->iDataVersion++; in pager_reset()
1753 sqlite3BackupRestart(pPager->pBackup); in pager_reset()
1754 sqlite3PcacheClear(pPager->pPCache); in pager_reset()
1760 u32 sqlite3PagerDataVersion(Pager *pPager){ in sqlite3PagerDataVersion() argument
1761 return pPager->iDataVersion; in sqlite3PagerDataVersion()
1769 static void releaseAllSavepoints(Pager *pPager){ in releaseAllSavepoints() argument
1771 for(ii=0; ii<pPager->nSavepoint; ii++){ in releaseAllSavepoints()
1772 sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint); in releaseAllSavepoints()
1774 if( !pPager->exclusiveMode || sqlite3JournalIsInMemory(pPager->sjfd) ){ in releaseAllSavepoints()
1775 sqlite3OsClose(pPager->sjfd); in releaseAllSavepoints()
1777 sqlite3_free(pPager->aSavepoint); in releaseAllSavepoints()
1778 pPager->aSavepoint = 0; in releaseAllSavepoints()
1779 pPager->nSavepoint = 0; in releaseAllSavepoints()
1780 pPager->nSubRec = 0; in releaseAllSavepoints()
1788 static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){ in addToSavepointBitvecs() argument
1792 for(ii=0; ii<pPager->nSavepoint; ii++){ in addToSavepointBitvecs()
1793 PagerSavepoint *p = &pPager->aSavepoint[ii]; in addToSavepointBitvecs()
1820 static void pager_unlock(Pager *pPager){ in pager_unlock() argument
1822 assert( pPager->eState==PAGER_READER in pager_unlock()
1823 || pPager->eState==PAGER_OPEN in pager_unlock()
1824 || pPager->eState==PAGER_ERROR in pager_unlock()
1827 sqlite3BitvecDestroy(pPager->pInJournal); in pager_unlock()
1828 pPager->pInJournal = 0; in pager_unlock()
1829 releaseAllSavepoints(pPager); in pager_unlock()
1831 if( pagerUseWal(pPager) ){ in pager_unlock()
1832 assert( !isOpen(pPager->jfd) ); in pager_unlock()
1833 sqlite3WalEndReadTransaction(pPager->pWal); in pager_unlock()
1834 pPager->eState = PAGER_OPEN; in pager_unlock()
1835 }else if( !pPager->exclusiveMode ){ in pager_unlock()
1837 int iDc = isOpen(pPager->fd)?sqlite3OsDeviceCharacteristics(pPager->fd):0; in pager_unlock()
1851 || 1!=(pPager->journalMode & 5) in pager_unlock()
1853 sqlite3OsClose(pPager->jfd); in pager_unlock()
1861 rc = pagerUnlockDb(pPager, NO_LOCK); in pager_unlock()
1862 if( rc!=SQLITE_OK && pPager->eState==PAGER_ERROR ){ in pager_unlock()
1863 pPager->eLock = UNKNOWN_LOCK; in pager_unlock()
1870 assert( pPager->errCode || pPager->eState!=PAGER_ERROR ); in pager_unlock()
1871 pPager->eState = PAGER_OPEN; in pager_unlock()
1879 assert( pPager->errCode==SQLITE_OK || !MEMDB ); in pager_unlock()
1880 if( pPager->errCode ){ in pager_unlock()
1881 if( pPager->tempFile==0 ){ in pager_unlock()
1882 pager_reset(pPager); in pager_unlock()
1883 pPager->changeCountDone = 0; in pager_unlock()
1884 pPager->eState = PAGER_OPEN; in pager_unlock()
1886 pPager->eState = (isOpen(pPager->jfd) ? PAGER_OPEN : PAGER_READER); in pager_unlock()
1888 if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); in pager_unlock()
1889 pPager->errCode = SQLITE_OK; in pager_unlock()
1890 setGetterMethod(pPager); in pager_unlock()
1893 pPager->journalOff = 0; in pager_unlock()
1894 pPager->journalHdr = 0; in pager_unlock()
1895 pPager->setSuper = 0; in pager_unlock()
1917 static int pager_error(Pager *pPager, int rc){ in pager_error() argument
1921 pPager->errCode==SQLITE_FULL || in pager_error()
1922 pPager->errCode==SQLITE_OK || in pager_error()
1923 (pPager->errCode & 0xff)==SQLITE_IOERR in pager_error()
1926 pPager->errCode = rc; in pager_error()
1927 pPager->eState = PAGER_ERROR; in pager_error()
1928 setGetterMethod(pPager); in pager_error()
1933 static int pager_truncate(Pager *pPager, Pgno nPage);
1951 static int pagerFlushOnCommit(Pager *pPager, int bCommit){ in pagerFlushOnCommit() argument
1952 if( pPager->tempFile==0 ) return 1; in pagerFlushOnCommit()
1954 if( !isOpen(pPager->fd) ) return 0; in pagerFlushOnCommit()
1955 return (sqlite3PCachePercentDirty(pPager->pPCache)>=25); in pagerFlushOnCommit()
2011 static int pager_end_transaction(Pager *pPager, int hasSuper, int bCommit){ in pager_end_transaction() argument
2028 assert( assert_pager_state(pPager) ); in pager_end_transaction()
2029 assert( pPager->eState!=PAGER_ERROR ); in pager_end_transaction()
2030 if( pPager->eState<PAGER_WRITER_LOCKED && pPager->eLock<RESERVED_LOCK ){ in pager_end_transaction()
2034 releaseAllSavepoints(pPager); in pager_end_transaction()
2035 assert( isOpen(pPager->jfd) || pPager->pInJournal==0 in pager_end_transaction()
2036 || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_BATCH_ATOMIC) in pager_end_transaction()
2038 if( isOpen(pPager->jfd) ){ in pager_end_transaction()
2039 assert( !pagerUseWal(pPager) ); in pager_end_transaction()
2042 if( sqlite3JournalIsInMemory(pPager->jfd) ){ in pager_end_transaction()
2044 sqlite3OsClose(pPager->jfd); in pager_end_transaction()
2045 }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){ in pager_end_transaction()
2046 if( pPager->journalOff==0 ){ in pager_end_transaction()
2049 rc = sqlite3OsTruncate(pPager->jfd, 0); in pager_end_transaction()
2050 if( rc==SQLITE_OK && pPager->fullSync ){ in pager_end_transaction()
2056 rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); in pager_end_transaction()
2059 pPager->journalOff = 0; in pager_end_transaction()
2060 }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST in pager_end_transaction()
2061 || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL) in pager_end_transaction()
2063 rc = zeroJournalHdr(pPager, hasSuper||pPager->tempFile); in pager_end_transaction()
2064 pPager->journalOff = 0; in pager_end_transaction()
2071 int bDelete = !pPager->tempFile; in pager_end_transaction()
2072 assert( sqlite3JournalIsInMemory(pPager->jfd)==0 ); in pager_end_transaction()
2073 assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE in pager_end_transaction()
2074 || pPager->journalMode==PAGER_JOURNALMODE_MEMORY in pager_end_transaction()
2075 || pPager->journalMode==PAGER_JOURNALMODE_WAL in pager_end_transaction()
2077 sqlite3OsClose(pPager->jfd); in pager_end_transaction()
2079 rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, pPager->extraSync); in pager_end_transaction()
2085 sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash); in pager_end_transaction()
2086 if( pPager->dbSize==0 && sqlite3PcacheRefCount(pPager->pPCache)>0 ){ in pager_end_transaction()
2087 PgHdr *p = sqlite3PagerLookup(pPager, 1); in pager_end_transaction()
2095 sqlite3BitvecDestroy(pPager->pInJournal); in pager_end_transaction()
2096 pPager->pInJournal = 0; in pager_end_transaction()
2097 pPager->nRec = 0; in pager_end_transaction()
2099 if( MEMDB || pagerFlushOnCommit(pPager, bCommit) ){ in pager_end_transaction()
2100 sqlite3PcacheCleanAll(pPager->pPCache); in pager_end_transaction()
2102 sqlite3PcacheClearWritable(pPager->pPCache); in pager_end_transaction()
2104 sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); in pager_end_transaction()
2107 if( pagerUseWal(pPager) ){ in pager_end_transaction()
2112 rc2 = sqlite3WalEndWriteTransaction(pPager->pWal); in pager_end_transaction()
2114 }else if( rc==SQLITE_OK && bCommit && pPager->dbFileSize>pPager->dbSize ){ in pager_end_transaction()
2121 assert( pPager->eLock==EXCLUSIVE_LOCK ); in pager_end_transaction()
2122 rc = pager_truncate(pPager, pPager->dbSize); in pager_end_transaction()
2126 rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0); in pager_end_transaction()
2130 if( !pPager->exclusiveMode in pager_end_transaction()
2131 && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) in pager_end_transaction()
2133 rc2 = pagerUnlockDb(pPager, SHARED_LOCK); in pager_end_transaction()
2135 pPager->eState = PAGER_READER; in pager_end_transaction()
2136 pPager->setSuper = 0; in pager_end_transaction()
2158 static void pagerUnlockAndRollback(Pager *pPager){ in pagerUnlockAndRollback() argument
2159 if( pPager->eState!=PAGER_ERROR && pPager->eState!=PAGER_OPEN ){ in pagerUnlockAndRollback()
2160 assert( assert_pager_state(pPager) ); in pagerUnlockAndRollback()
2161 if( pPager->eState>=PAGER_WRITER_LOCKED ){ in pagerUnlockAndRollback()
2163 sqlite3PagerRollback(pPager); in pagerUnlockAndRollback()
2165 }else if( !pPager->exclusiveMode ){ in pagerUnlockAndRollback()
2166 assert( pPager->eState==PAGER_READER ); in pagerUnlockAndRollback()
2167 pager_end_transaction(pPager, 0, 0); in pagerUnlockAndRollback()
2170 pager_unlock(pPager); in pagerUnlockAndRollback()
2192 static u32 pager_cksum(Pager *pPager, const u8 *aData){ in pager_cksum() argument
2193 u32 cksum = pPager->cksumInit; /* Checksum value to return */ in pager_cksum()
2194 int i = pPager->pageSize-200; /* Loop counter */ in pager_cksum()
2240 Pager *pPager, /* The pager being played back */ in pager_playback_one_page() argument
2259 aData = pPager->pTmpSpace; in pager_playback_one_page()
2261 assert( pagerUseWal(pPager)==0 || (!isMainJrnl && isSavepnt) ); in pager_playback_one_page()
2269 assert( pPager->eState>=PAGER_WRITER_CACHEMOD in pager_playback_one_page()
2270 || (pPager->eState==PAGER_OPEN && pPager->eLock==EXCLUSIVE_LOCK) in pager_playback_one_page()
2272 assert( pPager->eState>=PAGER_WRITER_CACHEMOD || isMainJrnl ); in pager_playback_one_page()
2277 jfd = isMainJrnl ? pPager->jfd : pPager->sjfd; in pager_playback_one_page()
2280 rc = sqlite3OsRead(jfd, (u8*)aData, pPager->pageSize, (*pOffset)+4); in pager_playback_one_page()
2282 *pOffset += pPager->pageSize + 4 + isMainJrnl*4; in pager_playback_one_page()
2289 if( pgno==0 || pgno==PAGER_SJ_PGNO(pPager) ){ in pager_playback_one_page()
2293 if( pgno>(Pgno)pPager->dbSize || sqlite3BitvecTest(pDone, pgno) ){ in pager_playback_one_page()
2299 if( !isSavepnt && pager_cksum(pPager, (u8*)aData)!=cksum ){ in pager_playback_one_page()
2313 if( pgno==1 && pPager->nReserve!=((u8*)aData)[20] ){ in pager_playback_one_page()
2314 pPager->nReserve = ((u8*)aData)[20]; in pager_playback_one_page()
2352 if( pagerUseWal(pPager) ){ in pager_playback_one_page()
2355 pPg = sqlite3PagerLookup(pPager, pgno); in pager_playback_one_page()
2358 assert( pPager->eState!=PAGER_OPEN || pPg==0 || pPager->tempFile ); in pager_playback_one_page()
2360 PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData), in pager_playback_one_page()
2364 isSynced = pPager->noSync || (*pOffset <= pPager->journalHdr); in pager_playback_one_page()
2368 if( isOpen(pPager->fd) in pager_playback_one_page()
2369 && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) in pager_playback_one_page()
2372 i64 ofst = (pgno-1)*(i64)pPager->pageSize; in pager_playback_one_page()
2374 assert( !pagerUseWal(pPager) ); in pager_playback_one_page()
2382 rc = sqlite3OsWrite(pPager->fd, (u8 *)aData, pPager->pageSize, ofst); in pager_playback_one_page()
2384 if( pgno>pPager->dbFileSize ){ in pager_playback_one_page()
2385 pPager->dbFileSize = pgno; in pager_playback_one_page()
2387 if( pPager->pBackup ){ in pager_playback_one_page()
2388 sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); in pager_playback_one_page()
2408 assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)==0 ); in pager_playback_one_page()
2409 pPager->doNotSpill |= SPILLFLAG_ROLLBACK; in pager_playback_one_page()
2410 rc = sqlite3PagerGet(pPager, pgno, &pPg, 1); in pager_playback_one_page()
2411 assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)!=0 ); in pager_playback_one_page()
2412 pPager->doNotSpill &= ~SPILLFLAG_ROLLBACK; in pager_playback_one_page()
2425 memcpy(pData, (u8*)aData, pPager->pageSize); in pager_playback_one_page()
2426 pPager->xReiniter(pPg); in pager_playback_one_page()
2436 memcpy(&pPager->dbFileVers, &((u8*)pData)[24],sizeof(pPager->dbFileVers)); in pager_playback_one_page()
2486 static int pager_delsuper(Pager *pPager, const char *zSuper){ in pager_delsuper() argument
2487 sqlite3_vfs *pVfs = pPager->pVfs; in pager_delsuper()
2604 static int pager_truncate(Pager *pPager, Pgno nPage){ in pager_truncate() argument
2606 assert( pPager->eState!=PAGER_ERROR ); in pager_truncate()
2607 assert( pPager->eState!=PAGER_READER ); in pager_truncate()
2609 if( isOpen(pPager->fd) in pager_truncate()
2610 && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) in pager_truncate()
2613 int szPage = pPager->pageSize; in pager_truncate()
2614 assert( pPager->eLock==EXCLUSIVE_LOCK ); in pager_truncate()
2616 rc = sqlite3OsFileSize(pPager->fd, ¤tSize); in pager_truncate()
2620 rc = sqlite3OsTruncate(pPager->fd, newSize); in pager_truncate()
2622 char *pTmp = pPager->pTmpSpace; in pager_truncate()
2626 sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &newSize); in pager_truncate()
2627 rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage); in pager_truncate()
2630 pPager->dbFileSize = nPage; in pager_truncate()
2675 static void setSectorSize(Pager *pPager){ in setSectorSize() argument
2676 assert( isOpen(pPager->fd) || pPager->tempFile ); in setSectorSize()
2678 if( pPager->tempFile in setSectorSize()
2679 || (sqlite3OsDeviceCharacteristics(pPager->fd) & in setSectorSize()
2685 pPager->sectorSize = 512; in setSectorSize()
2687 pPager->sectorSize = sqlite3SectorSize(pPager->fd); in setSectorSize()
2748 static int pager_playback(Pager *pPager, int isHot){ in pager_playback() argument
2749 sqlite3_vfs *pVfs = pPager->pVfs; in pager_playback()
2759 u32 savedPageSize = pPager->pageSize; in pager_playback()
2764 assert( isOpen(pPager->jfd) ); in pager_playback()
2765 rc = sqlite3OsFileSize(pPager->jfd, &szJ); in pager_playback()
2781 zSuper = pPager->pTmpSpace; in pager_playback()
2782 rc = readSuperJournal(pPager->jfd, zSuper, pPager->pVfs->mxPathname+1); in pager_playback()
2790 pPager->journalOff = 0; in pager_playback()
2803 rc = readJournalHdr(pPager, isHot, szJ, &nRec, &mxPg); in pager_playback()
2817 assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ); in pager_playback()
2818 nRec = (int)((szJ - JOURNAL_HDR_SZ(pPager))/JOURNAL_PG_SZ(pPager)); in pager_playback()
2836 pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff ){ in pager_playback()
2837 nRec = (int)((szJ - pPager->journalOff) / JOURNAL_PG_SZ(pPager)); in pager_playback()
2843 if( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ){ in pager_playback()
2844 rc = pager_truncate(pPager, mxPg); in pager_playback()
2848 pPager->dbSize = mxPg; in pager_playback()
2849 if( pPager->mxPgno<mxPg ){ in pager_playback()
2850 pPager->mxPgno = mxPg; in pager_playback()
2859 pager_reset(pPager); in pager_playback()
2862 rc = pager_playback_one_page(pPager,&pPager->journalOff,0,1,0); in pager_playback()
2867 pPager->journalOff = szJ; in pager_playback()
2893 rc = sqlite3PagerSetPagesize(pPager, &savedPageSize, -1); in pager_playback()
2901 sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0); in pager_playback()
2913 pPager->changeCountDone = pPager->tempFile; in pager_playback()
2920 zSuper = &pPager->pTmpSpace[4]; in pager_playback()
2921 rc = readSuperJournal(pPager->jfd, zSuper, pPager->pVfs->mxPathname+1); in pager_playback()
2925 && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) in pager_playback()
2927 rc = sqlite3PagerSync(pPager, 0); in pager_playback()
2930 rc = pager_end_transaction(pPager, zSuper[0]!='\0', 0); in pager_playback()
2937 assert( zSuper==&pPager->pTmpSpace[4] ); in pager_playback()
2939 rc = pager_delsuper(pPager, zSuper); in pager_playback()
2944 nPlayback, pPager->zJournal); in pager_playback()
2951 setSectorSize(pPager); in pager_playback()
2969 Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */ in readDbPage() local
2975 assert( pPager->eState>=PAGER_READER && !MEMDB ); in readDbPage()
2976 assert( isOpen(pPager->fd) ); in readDbPage()
2978 if( pagerUseWal(pPager) ){ in readDbPage()
2979 rc = sqlite3WalFindFrame(pPager->pWal, pPg->pgno, &iFrame); in readDbPage()
2983 rc = sqlite3WalReadFrame(pPager->pWal, iFrame,pPager->pageSize,pPg->pData); in readDbPage()
2987 i64 iOffset = (pPg->pgno-1)*(i64)pPager->pageSize; in readDbPage()
2988 rc = sqlite3OsRead(pPager->fd, pPg->pData, pPager->pageSize, iOffset); in readDbPage()
3008 memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers)); in readDbPage()
3011 memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers)); in readDbPage()
3015 PAGER_INCR(pPager->nRead); in readDbPage()
3016 IOTRACE(("PGIN %p %d\n", pPager, pPg->pgno)); in readDbPage()
3018 PAGERID(pPager), pPg->pgno, pager_pagehash(pPg))); in readDbPage()
3036 change_counter = sqlite3Get4byte((u8*)pPg->pPager->dbFileVers)+1; in pager_write_changecounter()
3061 Pager *pPager = (Pager *)pCtx; in pagerUndoCallback() local
3064 assert( pagerUseWal(pPager) ); in pagerUndoCallback()
3065 pPg = sqlite3PagerLookup(pPager, iPg); in pagerUndoCallback()
3072 pPager->xReiniter(pPg); in pagerUndoCallback()
3086 sqlite3BackupRestart(pPager->pBackup); in pagerUndoCallback()
3094 static int pagerRollbackWal(Pager *pPager){ in pagerRollbackWal() argument
3105 pPager->dbSize = pPager->dbOrigSize; in pagerRollbackWal()
3106 rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager); in pagerRollbackWal()
3107 pList = sqlite3PcacheDirtyList(pPager->pPCache); in pagerRollbackWal()
3110 rc = pagerUndoCallback((void *)pPager, pList->pgno); in pagerRollbackWal()
3127 Pager *pPager, /* Pager object */ in pagerWalFrames() argument
3136 assert( pPager->pWal ); in pagerWalFrames()
3163 pPager->aStat[PAGER_STAT_WRITE] += nList; in pagerWalFrames()
3166 rc = sqlite3WalFrames(pPager->pWal, in pagerWalFrames()
3167 pPager->pageSize, pList, nTruncate, isCommit, pPager->walSyncFlags in pagerWalFrames()
3169 if( rc==SQLITE_OK && pPager->pBackup ){ in pagerWalFrames()
3171 sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData); in pagerWalFrames()
3176 pList = sqlite3PcacheDirtyList(pPager->pPCache); in pagerWalFrames()
3193 static int pagerBeginReadTransaction(Pager *pPager){ in pagerBeginReadTransaction() argument
3197 assert( pagerUseWal(pPager) ); in pagerBeginReadTransaction()
3198 assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); in pagerBeginReadTransaction()
3205 sqlite3WalEndReadTransaction(pPager->pWal); in pagerBeginReadTransaction()
3207 rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed); in pagerBeginReadTransaction()
3209 pager_reset(pPager); in pagerBeginReadTransaction()
3210 if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); in pagerBeginReadTransaction()
3226 static int pagerPagecount(Pager *pPager, Pgno *pnPage){ in pagerPagecount() argument
3235 assert( pPager->eState==PAGER_OPEN ); in pagerPagecount()
3236 assert( pPager->eLock>=SHARED_LOCK ); in pagerPagecount()
3237 assert( isOpen(pPager->fd) ); in pagerPagecount()
3238 assert( pPager->tempFile==0 ); in pagerPagecount()
3239 nPage = sqlite3WalDbsize(pPager->pWal); in pagerPagecount()
3246 if( nPage==0 && ALWAYS(isOpen(pPager->fd)) ){ in pagerPagecount()
3248 int rc = sqlite3OsFileSize(pPager->fd, &n); in pagerPagecount()
3252 nPage = (Pgno)((n+pPager->pageSize-1) / pPager->pageSize); in pagerPagecount()
3259 if( nPage>pPager->mxPgno ){ in pagerPagecount()
3260 pPager->mxPgno = (Pgno)nPage; in pagerPagecount()
3286 static int pagerOpenWalIfPresent(Pager *pPager){ in pagerOpenWalIfPresent() argument
3288 assert( pPager->eState==PAGER_OPEN ); in pagerOpenWalIfPresent()
3289 assert( pPager->eLock>=SHARED_LOCK ); in pagerOpenWalIfPresent()
3291 if( !pPager->tempFile ){ in pagerOpenWalIfPresent()
3294 pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &isWal in pagerOpenWalIfPresent()
3300 rc = pagerPagecount(pPager, &nPage); in pagerOpenWalIfPresent()
3303 rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0); in pagerOpenWalIfPresent()
3305 testcase( sqlite3PcachePagecount(pPager->pPCache)==0 ); in pagerOpenWalIfPresent()
3306 rc = sqlite3PagerOpenWal(pPager, 0); in pagerOpenWalIfPresent()
3308 }else if( pPager->journalMode==PAGER_JOURNALMODE_WAL ){ in pagerOpenWalIfPresent()
3309 pPager->journalMode = PAGER_JOURNALMODE_DELETE; in pagerOpenWalIfPresent()
3353 static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ in pagerPlaybackSavepoint() argument
3359 assert( pPager->eState!=PAGER_ERROR ); in pagerPlaybackSavepoint()
3360 assert( pPager->eState>=PAGER_WRITER_LOCKED ); in pagerPlaybackSavepoint()
3373 pPager->dbSize = pSavepoint ? pSavepoint->nOrig : pPager->dbOrigSize; in pagerPlaybackSavepoint()
3374 pPager->changeCountDone = pPager->tempFile; in pagerPlaybackSavepoint()
3376 if( !pSavepoint && pagerUseWal(pPager) ){ in pagerPlaybackSavepoint()
3377 return pagerRollbackWal(pPager); in pagerPlaybackSavepoint()
3385 szJ = pPager->journalOff; in pagerPlaybackSavepoint()
3386 assert( pagerUseWal(pPager)==0 || szJ==0 ); in pagerPlaybackSavepoint()
3395 if( pSavepoint && !pagerUseWal(pPager) ){ in pagerPlaybackSavepoint()
3397 pPager->journalOff = pSavepoint->iOffset; in pagerPlaybackSavepoint()
3398 while( rc==SQLITE_OK && pPager->journalOff<iHdrOff ){ in pagerPlaybackSavepoint()
3399 rc = pager_playback_one_page(pPager, &pPager->journalOff, pDone, 1, 1); in pagerPlaybackSavepoint()
3403 pPager->journalOff = 0; in pagerPlaybackSavepoint()
3411 while( rc==SQLITE_OK && pPager->journalOff<szJ ){ in pagerPlaybackSavepoint()
3415 rc = readJournalHdr(pPager, 0, szJ, &nJRec, &dummy); in pagerPlaybackSavepoint()
3424 && pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff in pagerPlaybackSavepoint()
3426 nJRec = (u32)((szJ - pPager->journalOff)/JOURNAL_PG_SZ(pPager)); in pagerPlaybackSavepoint()
3428 for(ii=0; rc==SQLITE_OK && ii<nJRec && pPager->journalOff<szJ; ii++){ in pagerPlaybackSavepoint()
3429 rc = pager_playback_one_page(pPager, &pPager->journalOff, pDone, 1, 1); in pagerPlaybackSavepoint()
3433 assert( rc!=SQLITE_OK || pPager->journalOff>=szJ ); in pagerPlaybackSavepoint()
3441 i64 offset = (i64)pSavepoint->iSubRec*(4+pPager->pageSize); in pagerPlaybackSavepoint()
3443 if( pagerUseWal(pPager) ){ in pagerPlaybackSavepoint()
3444 rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData); in pagerPlaybackSavepoint()
3446 for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && ii<pPager->nSubRec; ii++){ in pagerPlaybackSavepoint()
3447 assert( offset==(i64)ii*(4+pPager->pageSize) ); in pagerPlaybackSavepoint()
3448 rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1); in pagerPlaybackSavepoint()
3455 pPager->journalOff = szJ; in pagerPlaybackSavepoint()
3465 void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){ in sqlite3PagerSetCachesize() argument
3466 sqlite3PcacheSetCachesize(pPager->pPCache, mxPage); in sqlite3PagerSetCachesize()
3473 int sqlite3PagerSetSpillsize(Pager *pPager, int mxPage){ in sqlite3PagerSetSpillsize() argument
3474 return sqlite3PcacheSetSpillsize(pPager->pPCache, mxPage); in sqlite3PagerSetSpillsize()
3480 static void pagerFixMaplimit(Pager *pPager){ in pagerFixMaplimit() argument
3482 sqlite3_file *fd = pPager->fd; in pagerFixMaplimit()
3485 sz = pPager->szMmap; in pagerFixMaplimit()
3486 pPager->bUseFetch = (sz>0); in pagerFixMaplimit()
3487 setGetterMethod(pPager); in pagerFixMaplimit()
3488 sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_MMAP_SIZE, &sz); in pagerFixMaplimit()
3496 void sqlite3PagerSetMmapLimit(Pager *pPager, sqlite3_int64 szMmap){ in sqlite3PagerSetMmapLimit() argument
3497 pPager->szMmap = szMmap; in sqlite3PagerSetMmapLimit()
3498 pagerFixMaplimit(pPager); in sqlite3PagerSetMmapLimit()
3504 void sqlite3PagerShrink(Pager *pPager){ in sqlite3PagerShrink() argument
3505 sqlite3PcacheShrink(pPager->pPCache); in sqlite3PagerShrink()
3561 Pager *pPager, /* The pager to set safety level for */ in sqlite3PagerSetFlags() argument
3565 if( pPager->tempFile ){ in sqlite3PagerSetFlags()
3566 pPager->noSync = 1; in sqlite3PagerSetFlags()
3567 pPager->fullSync = 0; in sqlite3PagerSetFlags()
3568 pPager->extraSync = 0; in sqlite3PagerSetFlags()
3570 pPager->noSync = level==PAGER_SYNCHRONOUS_OFF ?1:0; in sqlite3PagerSetFlags()
3571 pPager->fullSync = level>=PAGER_SYNCHRONOUS_FULL ?1:0; in sqlite3PagerSetFlags()
3572 pPager->extraSync = level==PAGER_SYNCHRONOUS_EXTRA ?1:0; in sqlite3PagerSetFlags()
3574 if( pPager->noSync ){ in sqlite3PagerSetFlags()
3575 pPager->syncFlags = 0; in sqlite3PagerSetFlags()
3577 pPager->syncFlags = SQLITE_SYNC_FULL; in sqlite3PagerSetFlags()
3579 pPager->syncFlags = SQLITE_SYNC_NORMAL; in sqlite3PagerSetFlags()
3581 pPager->walSyncFlags = (pPager->syncFlags<<2); in sqlite3PagerSetFlags()
3582 if( pPager->fullSync ){ in sqlite3PagerSetFlags()
3583 pPager->walSyncFlags |= pPager->syncFlags; in sqlite3PagerSetFlags()
3585 if( (pgFlags & PAGER_CKPT_FULLFSYNC) && !pPager->noSync ){ in sqlite3PagerSetFlags()
3586 pPager->walSyncFlags |= (SQLITE_SYNC_FULL<<2); in sqlite3PagerSetFlags()
3589 pPager->doNotSpill &= ~SPILLFLAG_OFF; in sqlite3PagerSetFlags()
3591 pPager->doNotSpill |= SPILLFLAG_OFF; in sqlite3PagerSetFlags()
3621 Pager *pPager, /* The pager object */ in pagerOpentemp() argument
3633 rc = sqlite3OsOpen(pPager->pVfs, 0, pFile, vfsFlags, 0); in pagerOpentemp()
3660 Pager *pPager, /* Pager object */ in sqlite3PagerSetBusyHandler() argument
3665 pPager->xBusyHandler = xBusyHandler; in sqlite3PagerSetBusyHandler()
3666 pPager->pBusyHandlerArg = pBusyHandlerArg; in sqlite3PagerSetBusyHandler()
3667 ap = (void **)&pPager->xBusyHandler; in sqlite3PagerSetBusyHandler()
3670 sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap); in sqlite3PagerSetBusyHandler()
3703 int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){ in sqlite3PagerSetPagesize() argument
3718 if( (pPager->memDb==0 || pPager->dbSize==0) in sqlite3PagerSetPagesize()
3719 && sqlite3PcacheRefCount(pPager->pPCache)==0 in sqlite3PagerSetPagesize()
3720 && pageSize && pageSize!=(u32)pPager->pageSize in sqlite3PagerSetPagesize()
3725 if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){ in sqlite3PagerSetPagesize()
3726 rc = sqlite3OsFileSize(pPager->fd, &nByte); in sqlite3PagerSetPagesize()
3740 pager_reset(pPager); in sqlite3PagerSetPagesize()
3741 rc = sqlite3PcacheSetPageSize(pPager->pPCache, pageSize); in sqlite3PagerSetPagesize()
3744 sqlite3PageFree(pPager->pTmpSpace); in sqlite3PagerSetPagesize()
3745 pPager->pTmpSpace = pNew; in sqlite3PagerSetPagesize()
3746 pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize); in sqlite3PagerSetPagesize()
3747 pPager->pageSize = pageSize; in sqlite3PagerSetPagesize()
3748 pPager->lckPgno = (Pgno)(PENDING_BYTE/pageSize) + 1; in sqlite3PagerSetPagesize()
3754 *pPageSize = pPager->pageSize; in sqlite3PagerSetPagesize()
3756 if( nReserve<0 ) nReserve = pPager->nReserve; in sqlite3PagerSetPagesize()
3758 pPager->nReserve = (i16)nReserve; in sqlite3PagerSetPagesize()
3759 pagerFixMaplimit(pPager); in sqlite3PagerSetPagesize()
3772 void *sqlite3PagerTempSpace(Pager *pPager){ in sqlite3PagerTempSpace() argument
3773 return pPager->pTmpSpace; in sqlite3PagerTempSpace()
3783 Pgno sqlite3PagerMaxPageCount(Pager *pPager, Pgno mxPage){ in sqlite3PagerMaxPageCount() argument
3785 pPager->mxPgno = mxPage; in sqlite3PagerMaxPageCount()
3787 assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */ in sqlite3PagerMaxPageCount()
3792 return pPager->mxPgno; in sqlite3PagerMaxPageCount()
3833 int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned char *pDest){ in sqlite3PagerReadFileheader() argument
3836 assert( isOpen(pPager->fd) || pPager->tempFile ); in sqlite3PagerReadFileheader()
3842 assert( !pagerUseWal(pPager) ); in sqlite3PagerReadFileheader()
3844 if( isOpen(pPager->fd) ){ in sqlite3PagerReadFileheader()
3845 IOTRACE(("DBHDR %p 0 %d\n", pPager, N)) in sqlite3PagerReadFileheader()
3846 rc = sqlite3OsRead(pPager->fd, pDest, N, 0); in sqlite3PagerReadFileheader()
3861 void sqlite3PagerPagecount(Pager *pPager, int *pnPage){ in sqlite3PagerPagecount() argument
3862 assert( pPager->eState>=PAGER_READER ); in sqlite3PagerPagecount()
3863 assert( pPager->eState!=PAGER_WRITER_FINISHED ); in sqlite3PagerPagecount()
3864 *pnPage = (int)pPager->dbSize; in sqlite3PagerPagecount()
3882 static int pager_wait_on_lock(Pager *pPager, int locktype){ in pager_wait_on_lock() argument
3890 assert( (pPager->eLock>=locktype) in pager_wait_on_lock()
3891 || (pPager->eLock==NO_LOCK && locktype==SHARED_LOCK) in pager_wait_on_lock()
3892 || (pPager->eLock==RESERVED_LOCK && locktype==EXCLUSIVE_LOCK) in pager_wait_on_lock()
3896 rc = pagerLockDb(pPager, locktype); in pager_wait_on_lock()
3897 }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) ); in pager_wait_on_lock()
3924 Pager *pPager = pPg->pPager; in assertTruncateConstraintCb() local
3926 if( pPg->pgno>pPager->dbSize ){ /* if (a) is false */ in assertTruncateConstraintCb()
3929 for(i=0; i<pPg->pPager->nSavepoint; i++){ in assertTruncateConstraintCb()
3930 PagerSavepoint *p = &pPager->aSavepoint[i]; in assertTruncateConstraintCb()
3935 static void assertTruncateConstraint(Pager *pPager){ in assertTruncateConstraint() argument
3936 sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb); in assertTruncateConstraint()
3939 # define assertTruncateConstraint(pPager) argument
3953 void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ in sqlite3PagerTruncateImage() argument
3954 assert( pPager->dbSize>=nPage || CORRUPT_DB ); in sqlite3PagerTruncateImage()
3955 assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); in sqlite3PagerTruncateImage()
3956 pPager->dbSize = nPage; in sqlite3PagerTruncateImage()
3984 static int pagerSyncHotJournal(Pager *pPager){ in pagerSyncHotJournal() argument
3986 if( !pPager->noSync ){ in pagerSyncHotJournal()
3987 rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_NORMAL); in pagerSyncHotJournal()
3990 rc = sqlite3OsFileSize(pPager->jfd, &pPager->journalHdr); in pagerSyncHotJournal()
4007 Pager *pPager, /* Pager object */ in pagerAcquireMapPage() argument
4014 if( pPager->pMmapFreelist ){ in pagerAcquireMapPage()
4015 *ppPage = p = pPager->pMmapFreelist; in pagerAcquireMapPage()
4016 pPager->pMmapFreelist = p->pDirty; in pagerAcquireMapPage()
4018 assert( pPager->nExtra>=8 ); in pagerAcquireMapPage()
4021 *ppPage = p = (PgHdr *)sqlite3MallocZero(sizeof(PgHdr) + pPager->nExtra); in pagerAcquireMapPage()
4023 sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1) * pPager->pageSize, pData); in pagerAcquireMapPage()
4029 p->pPager = pPager; in pagerAcquireMapPage()
4035 assert( p->pPager==pPager ); in pagerAcquireMapPage()
4040 pPager->nMmapOut++; in pagerAcquireMapPage()
4051 Pager *pPager = pPg->pPager; in pagerReleaseMapPage() local
4052 pPager->nMmapOut--; in pagerReleaseMapPage()
4053 pPg->pDirty = pPager->pMmapFreelist; in pagerReleaseMapPage()
4054 pPager->pMmapFreelist = pPg; in pagerReleaseMapPage()
4056 assert( pPager->fd->pMethods->iVersion>=3 ); in pagerReleaseMapPage()
4057 sqlite3OsUnfetch(pPager->fd, (i64)(pPg->pgno-1)*pPager->pageSize, pPg->pData); in pagerReleaseMapPage()
4063 static void pagerFreeMapHdrs(Pager *pPager){ in pagerFreeMapHdrs() argument
4066 for(p=pPager->pMmapFreelist; p; p=pNext){ in pagerFreeMapHdrs()
4077 static int databaseIsUnmoved(Pager *pPager){ in databaseIsUnmoved() argument
4081 if( pPager->tempFile ) return SQLITE_OK; in databaseIsUnmoved()
4082 if( pPager->dbSize==0 ) return SQLITE_OK; in databaseIsUnmoved()
4083 assert( pPager->zFilename && pPager->zFilename[0] ); in databaseIsUnmoved()
4084 rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved); in databaseIsUnmoved()
4111 int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ in sqlite3PagerClose() argument
4112 u8 *pTmp = (u8*)pPager->pTmpSpace; in sqlite3PagerClose()
4113 assert( db || pagerUseWal(pPager)==0 ); in sqlite3PagerClose()
4114 assert( assert_pager_state(pPager) ); in sqlite3PagerClose()
4117 pagerFreeMapHdrs(pPager); in sqlite3PagerClose()
4119 pPager->exclusiveMode = 0; in sqlite3PagerClose()
4123 assert( db || pPager->pWal==0 ); in sqlite3PagerClose()
4125 && SQLITE_OK==databaseIsUnmoved(pPager) in sqlite3PagerClose()
4129 sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, pPager->pageSize,a); in sqlite3PagerClose()
4130 pPager->pWal = 0; in sqlite3PagerClose()
4133 pager_reset(pPager); in sqlite3PagerClose()
4135 pager_unlock(pPager); in sqlite3PagerClose()
4148 if( isOpen(pPager->jfd) ){ in sqlite3PagerClose()
4149 pager_error(pPager, pagerSyncHotJournal(pPager)); in sqlite3PagerClose()
4151 pagerUnlockAndRollback(pPager); in sqlite3PagerClose()
4155 PAGERTRACE(("CLOSE %d\n", PAGERID(pPager))); in sqlite3PagerClose()
4156 IOTRACE(("CLOSE %p\n", pPager)) in sqlite3PagerClose()
4157 sqlite3OsClose(pPager->jfd); in sqlite3PagerClose()
4158 sqlite3OsClose(pPager->fd); in sqlite3PagerClose()
4160 sqlite3PcacheClose(pPager->pPCache); in sqlite3PagerClose()
4161 assert( !pPager->aSavepoint && !pPager->pInJournal ); in sqlite3PagerClose()
4162 assert( !isOpen(pPager->jfd) && !isOpen(pPager->sjfd) ); in sqlite3PagerClose()
4164 sqlite3_free(pPager); in sqlite3PagerClose()
4219 static int syncJournal(Pager *pPager, int newHdr){ in syncJournal() argument
4222 assert( pPager->eState==PAGER_WRITER_CACHEMOD in syncJournal()
4223 || pPager->eState==PAGER_WRITER_DBMOD in syncJournal()
4225 assert( assert_pager_state(pPager) ); in syncJournal()
4226 assert( !pagerUseWal(pPager) ); in syncJournal()
4228 rc = sqlite3PagerExclusiveLock(pPager); in syncJournal()
4231 if( !pPager->noSync ){ in syncJournal()
4232 assert( !pPager->tempFile ); in syncJournal()
4233 if( isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){ in syncJournal()
4234 const int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); in syncJournal()
4235 assert( isOpen(pPager->jfd) ); in syncJournal()
4265 put32bits(&zHeader[sizeof(aJournalMagic)], pPager->nRec); in syncJournal()
4267 iNextHdrOffset = journalHdrOffset(pPager); in syncJournal()
4268 rc = sqlite3OsRead(pPager->jfd, aMagic, 8, iNextHdrOffset); in syncJournal()
4271 rc = sqlite3OsWrite(pPager->jfd, &zerobyte, 1, iNextHdrOffset); in syncJournal()
4288 if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){ in syncJournal()
4289 PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager))); in syncJournal()
4290 IOTRACE(("JSYNC %p\n", pPager)) in syncJournal()
4291 rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); in syncJournal()
4294 IOTRACE(("JHDR %p %lld\n", pPager, pPager->journalHdr)); in syncJournal()
4296 pPager->jfd, zHeader, sizeof(zHeader), pPager->journalHdr in syncJournal()
4301 PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager))); in syncJournal()
4302 IOTRACE(("JSYNC %p\n", pPager)) in syncJournal()
4303 rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags| in syncJournal()
4304 (pPager->syncFlags==SQLITE_SYNC_FULL?SQLITE_SYNC_DATAONLY:0) in syncJournal()
4309 pPager->journalHdr = pPager->journalOff; in syncJournal()
4311 pPager->nRec = 0; in syncJournal()
4312 rc = writeJournalHdr(pPager); in syncJournal()
4316 pPager->journalHdr = pPager->journalOff; in syncJournal()
4324 sqlite3PcacheClearSyncFlags(pPager->pPCache); in syncJournal()
4325 pPager->eState = PAGER_WRITER_DBMOD; in syncJournal()
4326 assert( assert_pager_state(pPager) ); in syncJournal()
4362 static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ in pager_write_pagelist() argument
4366 assert( !pagerUseWal(pPager) ); in pager_write_pagelist()
4367 assert( pPager->tempFile || pPager->eState==PAGER_WRITER_DBMOD ); in pager_write_pagelist()
4368 assert( pPager->eLock==EXCLUSIVE_LOCK ); in pager_write_pagelist()
4369 assert( isOpen(pPager->fd) || pList->pDirty==0 ); in pager_write_pagelist()
4375 if( !isOpen(pPager->fd) ){ in pager_write_pagelist()
4376 assert( pPager->tempFile && rc==SQLITE_OK ); in pager_write_pagelist()
4377 rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags); in pager_write_pagelist()
4383 assert( rc!=SQLITE_OK || isOpen(pPager->fd) ); in pager_write_pagelist()
4385 && pPager->dbHintSize<pPager->dbSize in pager_write_pagelist()
4386 && (pList->pDirty || pList->pgno>pPager->dbHintSize) in pager_write_pagelist()
4388 sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize; in pager_write_pagelist()
4389 sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile); in pager_write_pagelist()
4390 pPager->dbHintSize = pPager->dbSize; in pager_write_pagelist()
4404 if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){ in pager_write_pagelist()
4405 i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */ in pager_write_pagelist()
4414 rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset); in pager_write_pagelist()
4421 memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers)); in pager_write_pagelist()
4423 if( pgno>pPager->dbFileSize ){ in pager_write_pagelist()
4424 pPager->dbFileSize = pgno; in pager_write_pagelist()
4426 pPager->aStat[PAGER_STAT_WRITE]++; in pager_write_pagelist()
4429 sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)pList->pData); in pager_write_pagelist()
4432 PAGERID(pPager), pgno, pager_pagehash(pList))); in pager_write_pagelist()
4433 IOTRACE(("PGOUT %p %d\n", pPager, pgno)); in pager_write_pagelist()
4436 PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno)); in pager_write_pagelist()
4453 static int openSubJournal(Pager *pPager){ in openSubJournal() argument
4455 if( !isOpen(pPager->sjfd) ){ in openSubJournal()
4460 if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){ in openSubJournal()
4463 rc = sqlite3JournalOpen(pPager->pVfs, 0, pPager->sjfd, flags, nStmtSpill); in openSubJournal()
4481 Pager *pPager = pPg->pPager; in subjournalPage() local
4482 if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ in subjournalPage()
4485 assert( pPager->useJournal ); in subjournalPage()
4486 assert( isOpen(pPager->jfd) || pagerUseWal(pPager) ); in subjournalPage()
4487 assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 ); in subjournalPage()
4488 assert( pagerUseWal(pPager) in subjournalPage()
4489 || pageInJournal(pPager, pPg) in subjournalPage()
4490 || pPg->pgno>pPager->dbOrigSize in subjournalPage()
4492 rc = openSubJournal(pPager); in subjournalPage()
4498 i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); in subjournalPage()
4501 PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); in subjournalPage()
4502 rc = write32bits(pPager->sjfd, offset, pPg->pgno); in subjournalPage()
4504 rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); in subjournalPage()
4509 pPager->nSubRec++; in subjournalPage()
4510 assert( pPager->nSavepoint>0 ); in subjournalPage()
4511 rc = addToSavepointBitvecs(pPager, pPg->pgno); in subjournalPage()
4543 Pager *pPager = (Pager *)p; in pagerStress() local
4546 assert( pPg->pPager==pPager ); in pagerStress()
4565 if( NEVER(pPager->errCode) ) return SQLITE_OK; in pagerStress()
4566 testcase( pPager->doNotSpill & SPILLFLAG_ROLLBACK ); in pagerStress()
4567 testcase( pPager->doNotSpill & SPILLFLAG_OFF ); in pagerStress()
4568 testcase( pPager->doNotSpill & SPILLFLAG_NOSYNC ); in pagerStress()
4569 if( pPager->doNotSpill in pagerStress()
4570 && ((pPager->doNotSpill & (SPILLFLAG_ROLLBACK|SPILLFLAG_OFF))!=0 in pagerStress()
4576 pPager->aStat[PAGER_STAT_SPILL]++; in pagerStress()
4578 if( pagerUseWal(pPager) ){ in pagerStress()
4582 rc = pagerWalFrames(pPager, pPg, 0, 0); in pagerStress()
4587 if( pPager->tempFile==0 ){ in pagerStress()
4588 rc = sqlite3JournalCreate(pPager->jfd); in pagerStress()
4589 if( rc!=SQLITE_OK ) return pager_error(pPager, rc); in pagerStress()
4595 || pPager->eState==PAGER_WRITER_CACHEMOD in pagerStress()
4597 rc = syncJournal(pPager, 1); in pagerStress()
4603 rc = pager_write_pagelist(pPager, pPg); in pagerStress()
4609 PAGERTRACE(("STRESS %d page %d\n", PAGERID(pPager), pPg->pgno)); in pagerStress()
4613 return pager_error(pPager, rc); in pagerStress()
4619 int sqlite3PagerFlush(Pager *pPager){ in sqlite3PagerFlush() argument
4620 int rc = pPager->errCode; in sqlite3PagerFlush()
4622 PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); in sqlite3PagerFlush()
4623 assert( assert_pager_state(pPager) ); in sqlite3PagerFlush()
4627 rc = pagerStress((void*)pPager, pList); in sqlite3PagerFlush()
4678 Pager *pPager = 0; /* Pager object to allocate and return */ in sqlite3PagerOpen() local
4808 ROUND8(sizeof(*pPager)) + /* Pager structure */ in sqlite3PagerOpen()
4812 sizeof(pPager) + /* Space to hold a pointer */ in sqlite3PagerOpen()
4827 pPager = (Pager*)pPtr; pPtr += ROUND8(sizeof(*pPager)); in sqlite3PagerOpen()
4828 pPager->pPCache = (PCache*)pPtr; pPtr += ROUND8(pcacheSize); in sqlite3PagerOpen()
4829 pPager->fd = (sqlite3_file*)pPtr; pPtr += ROUND8(pVfs->szOsFile); in sqlite3PagerOpen()
4830 pPager->sjfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; in sqlite3PagerOpen()
4831 pPager->jfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; in sqlite3PagerOpen()
4832 assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); in sqlite3PagerOpen()
4833 memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); in sqlite3PagerOpen()
4837 pPager->zFilename = (char*)pPtr; in sqlite3PagerOpen()
4850 pPager->zJournal = (char*)pPtr; in sqlite3PagerOpen()
4854 sqlite3FileSuffix3(zFilename,pPager->zJournal); in sqlite3PagerOpen()
4855 pPtr = (u8*)(pPager->zJournal + sqlite3Strlen30(pPager->zJournal)+1); in sqlite3PagerOpen()
4858 pPager->zJournal = 0; in sqlite3PagerOpen()
4864 pPager->zWal = (char*)pPtr; in sqlite3PagerOpen()
4868 sqlite3FileSuffix3(zFilename, pPager->zWal); in sqlite3PagerOpen()
4869 pPtr = (u8*)(pPager->zWal + sqlite3Strlen30(pPager->zWal)+1); in sqlite3PagerOpen()
4872 pPager->zWal = 0; in sqlite3PagerOpen()
4878 pPager->pVfs = pVfs; in sqlite3PagerOpen()
4879 pPager->vfsFlags = vfsFlags; in sqlite3PagerOpen()
4885 rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); in sqlite3PagerOpen()
4888 pPager->memVfs = memJM = (fout&SQLITE_OPEN_MEMORY)!=0; in sqlite3PagerOpen()
4901 int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); in sqlite3PagerOpen()
4903 setSectorSize(pPager); in sqlite3PagerOpen()
4905 if( szPageDflt<pPager->sectorSize ){ in sqlite3PagerOpen()
4906 if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){ in sqlite3PagerOpen()
4909 szPageDflt = (u32)pPager->sectorSize; in sqlite3PagerOpen()
4926 pPager->noLock = sqlite3_uri_boolean(pPager->zFilename, "nolock", 0); in sqlite3PagerOpen()
4928 || sqlite3_uri_boolean(pPager->zFilename, "immutable", 0) ){ in sqlite3PagerOpen()
4946 pPager->eState = PAGER_READER; /* Pretend we already have a lock */ in sqlite3PagerOpen()
4947 pPager->eLock = EXCLUSIVE_LOCK; /* Pretend we are in EXCLUSIVE mode */ in sqlite3PagerOpen()
4948 pPager->noLock = 1; /* Do no locking */ in sqlite3PagerOpen()
4956 assert( pPager->memDb==0 ); in sqlite3PagerOpen()
4957 rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1); in sqlite3PagerOpen()
4966 !memDb?pagerStress:0, (void *)pPager, pPager->pPCache); in sqlite3PagerOpen()
4972 sqlite3OsClose(pPager->fd); in sqlite3PagerOpen()
4973 sqlite3PageFree(pPager->pTmpSpace); in sqlite3PagerOpen()
4974 sqlite3_free(pPager); in sqlite3PagerOpen()
4978 PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename)); in sqlite3PagerOpen()
4979 IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename)) in sqlite3PagerOpen()
4981 pPager->useJournal = (u8)useJournal; in sqlite3PagerOpen()
4988 pPager->mxPgno = SQLITE_MAX_PAGE_COUNT; in sqlite3PagerOpen()
4991 pPager->tempFile = (u8)tempFile; in sqlite3PagerOpen()
4995 pPager->exclusiveMode = (u8)tempFile; in sqlite3PagerOpen()
4996 pPager->changeCountDone = pPager->tempFile; in sqlite3PagerOpen()
4997 pPager->memDb = (u8)memDb; in sqlite3PagerOpen()
4998 pPager->readOnly = (u8)readOnly; in sqlite3PagerOpen()
4999 assert( useJournal || pPager->tempFile ); in sqlite3PagerOpen()
5000 pPager->noSync = pPager->tempFile; in sqlite3PagerOpen()
5001 if( pPager->noSync ){ in sqlite3PagerOpen()
5002 assert( pPager->fullSync==0 ); in sqlite3PagerOpen()
5003 assert( pPager->extraSync==0 ); in sqlite3PagerOpen()
5004 assert( pPager->syncFlags==0 ); in sqlite3PagerOpen()
5005 assert( pPager->walSyncFlags==0 ); in sqlite3PagerOpen()
5007 pPager->fullSync = 1; in sqlite3PagerOpen()
5008 pPager->extraSync = 0; in sqlite3PagerOpen()
5009 pPager->syncFlags = SQLITE_SYNC_NORMAL; in sqlite3PagerOpen()
5010 pPager->walSyncFlags = SQLITE_SYNC_NORMAL | (SQLITE_SYNC_NORMAL<<2); in sqlite3PagerOpen()
5015 pPager->nExtra = (u16)nExtra; in sqlite3PagerOpen()
5016 pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT; in sqlite3PagerOpen()
5017 assert( isOpen(pPager->fd) || tempFile ); in sqlite3PagerOpen()
5018 setSectorSize(pPager); in sqlite3PagerOpen()
5020 pPager->journalMode = PAGER_JOURNALMODE_OFF; in sqlite3PagerOpen()
5022 pPager->journalMode = PAGER_JOURNALMODE_MEMORY; in sqlite3PagerOpen()
5026 pPager->xReiniter = xReinit; in sqlite3PagerOpen()
5027 setGetterMethod(pPager); in sqlite3PagerOpen()
5031 *ppPager = pPager; in sqlite3PagerOpen()
5041 Pager *pPager; in sqlite3_database_file_object() local
5045 pPager = *(Pager**)(zName - 4 - sizeof(Pager*)); in sqlite3_database_file_object()
5046 return pPager->fd; in sqlite3_database_file_object()
5081 static int hasHotJournal(Pager *pPager, int *pExists){ in hasHotJournal() argument
5082 sqlite3_vfs * const pVfs = pPager->pVfs; in hasHotJournal()
5085 int jrnlOpen = !!isOpen(pPager->jfd); in hasHotJournal()
5087 assert( pPager->useJournal ); in hasHotJournal()
5088 assert( isOpen(pPager->fd) ); in hasHotJournal()
5089 assert( pPager->eState==PAGER_OPEN ); in hasHotJournal()
5091 assert( jrnlOpen==0 || ( sqlite3OsDeviceCharacteristics(pPager->jfd) & in hasHotJournal()
5097 rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists); in hasHotJournal()
5110 rc = sqlite3OsCheckReservedLock(pPager->fd, &locked); in hasHotJournal()
5114 assert( pPager->tempFile==0 ); in hasHotJournal()
5115 rc = pagerPagecount(pPager, &nPage); in hasHotJournal()
5127 if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){ in hasHotJournal()
5128 sqlite3OsDelete(pVfs, pPager->zJournal, 0); in hasHotJournal()
5129 if( !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); in hasHotJournal()
5141 rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f); in hasHotJournal()
5145 rc = sqlite3OsRead(pPager->jfd, (void *)&first, 1, 0); in hasHotJournal()
5150 sqlite3OsClose(pPager->jfd); in hasHotJournal()
5201 int sqlite3PagerSharedLock(Pager *pPager){ in sqlite3PagerSharedLock() argument
5208 assert( sqlite3PcacheRefCount(pPager->pPCache)==0 ); in sqlite3PagerSharedLock()
5209 assert( assert_pager_state(pPager) ); in sqlite3PagerSharedLock()
5210 assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); in sqlite3PagerSharedLock()
5211 assert( pPager->errCode==SQLITE_OK ); in sqlite3PagerSharedLock()
5213 if( !pagerUseWal(pPager) && pPager->eState==PAGER_OPEN ){ in sqlite3PagerSharedLock()
5217 assert( pPager->tempFile==0 || pPager->eLock==EXCLUSIVE_LOCK ); in sqlite3PagerSharedLock()
5219 rc = pager_wait_on_lock(pPager, SHARED_LOCK); in sqlite3PagerSharedLock()
5221 assert( pPager->eLock==NO_LOCK || pPager->eLock==UNKNOWN_LOCK ); in sqlite3PagerSharedLock()
5228 if( pPager->eLock<=SHARED_LOCK ){ in sqlite3PagerSharedLock()
5229 rc = hasHotJournal(pPager, &bHotJournal); in sqlite3PagerSharedLock()
5235 if( pPager->readOnly ){ in sqlite3PagerSharedLock()
5255 rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); in sqlite3PagerSharedLock()
5273 if( !isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ in sqlite3PagerSharedLock()
5274 sqlite3_vfs * const pVfs = pPager->pVfs; in sqlite3PagerSharedLock()
5277 pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &bExists); in sqlite3PagerSharedLock()
5281 assert( !pPager->tempFile ); in sqlite3PagerSharedLock()
5282 rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout); in sqlite3PagerSharedLock()
5283 assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); in sqlite3PagerSharedLock()
5286 sqlite3OsClose(pPager->jfd); in sqlite3PagerSharedLock()
5299 if( isOpen(pPager->jfd) ){ in sqlite3PagerSharedLock()
5301 rc = pagerSyncHotJournal(pPager); in sqlite3PagerSharedLock()
5303 rc = pager_playback(pPager, !pPager->tempFile); in sqlite3PagerSharedLock()
5304 pPager->eState = PAGER_OPEN; in sqlite3PagerSharedLock()
5306 }else if( !pPager->exclusiveMode ){ in sqlite3PagerSharedLock()
5307 pagerUnlockDb(pPager, SHARED_LOCK); in sqlite3PagerSharedLock()
5327 pager_error(pPager, rc); in sqlite3PagerSharedLock()
5331 assert( pPager->eState==PAGER_OPEN ); in sqlite3PagerSharedLock()
5332 assert( (pPager->eLock==SHARED_LOCK) in sqlite3PagerSharedLock()
5333 || (pPager->exclusiveMode && pPager->eLock>SHARED_LOCK) in sqlite3PagerSharedLock()
5337 if( !pPager->tempFile && pPager->hasHeldSharedLock ){ in sqlite3PagerSharedLock()
5354 char dbFileVers[sizeof(pPager->dbFileVers)]; in sqlite3PagerSharedLock()
5356 IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers))); in sqlite3PagerSharedLock()
5357 rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24); in sqlite3PagerSharedLock()
5365 if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){ in sqlite3PagerSharedLock()
5366 pager_reset(pPager); in sqlite3PagerSharedLock()
5374 if( USEFETCH(pPager) ){ in sqlite3PagerSharedLock()
5375 sqlite3OsUnfetch(pPager->fd, 0, 0); in sqlite3PagerSharedLock()
5383 rc = pagerOpenWalIfPresent(pPager); in sqlite3PagerSharedLock()
5385 assert( pPager->pWal==0 || rc==SQLITE_OK ); in sqlite3PagerSharedLock()
5389 if( pagerUseWal(pPager) ){ in sqlite3PagerSharedLock()
5391 rc = pagerBeginReadTransaction(pPager); in sqlite3PagerSharedLock()
5394 if( pPager->tempFile==0 && pPager->eState==PAGER_OPEN && rc==SQLITE_OK ){ in sqlite3PagerSharedLock()
5395 rc = pagerPagecount(pPager, &pPager->dbSize); in sqlite3PagerSharedLock()
5401 pager_unlock(pPager); in sqlite3PagerSharedLock()
5402 assert( pPager->eState==PAGER_OPEN ); in sqlite3PagerSharedLock()
5404 pPager->eState = PAGER_READER; in sqlite3PagerSharedLock()
5405 pPager->hasHeldSharedLock = 1; in sqlite3PagerSharedLock()
5418 static void pagerUnlockIfUnused(Pager *pPager){ in pagerUnlockIfUnused() argument
5419 if( sqlite3PcacheRefCount(pPager->pPCache)==0 ){ in pagerUnlockIfUnused()
5420 assert( pPager->nMmapOut==0 ); /* because page1 is never memory mapped */ in pagerUnlockIfUnused()
5421 pagerUnlockAndRollback(pPager); in pagerUnlockIfUnused()
5483 Pager *pPager, /* The pager open on the database file */ in getPageNormal() argument
5493 assert( pPager->errCode==SQLITE_OK ); in getPageNormal()
5494 assert( pPager->eState>=PAGER_READER ); in getPageNormal()
5495 assert( assert_pager_state(pPager) ); in getPageNormal()
5496 assert( pPager->hasHeldSharedLock==1 ); in getPageNormal()
5499 pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); in getPageNormal()
5502 rc = sqlite3PcacheFetchStress(pPager->pPCache, pgno, &pBase); in getPageNormal()
5509 pPg = *ppPage = sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pBase); in getPageNormal()
5512 assert( pPg->pPager==pPager || pPg->pPager==0 ); in getPageNormal()
5515 if( pPg->pPager && !noContent ){ in getPageNormal()
5518 assert( pgno!=PAGER_SJ_PGNO(pPager) ); in getPageNormal()
5519 pPager->aStat[PAGER_STAT_HIT]++; in getPageNormal()
5529 if( pgno==PAGER_SJ_PGNO(pPager) ){ in getPageNormal()
5534 pPg->pPager = pPager; in getPageNormal()
5536 assert( !isOpen(pPager->fd) || !MEMDB ); in getPageNormal()
5537 if( !isOpen(pPager->fd) || pPager->dbSize<pgno || noContent ){ in getPageNormal()
5538 if( pgno>pPager->mxPgno ){ in getPageNormal()
5550 if( pgno<=pPager->dbOrigSize ){ in getPageNormal()
5551 TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno); in getPageNormal()
5554 TESTONLY( rc = ) addToSavepointBitvecs(pPager, pgno); in getPageNormal()
5558 memset(pPg->pData, 0, pPager->pageSize); in getPageNormal()
5559 IOTRACE(("ZERO %p %d\n", pPager, pgno)); in getPageNormal()
5561 assert( pPg->pPager==pPager ); in getPageNormal()
5562 pPager->aStat[PAGER_STAT_MISS]++; in getPageNormal()
5577 pagerUnlockIfUnused(pPager); in getPageNormal()
5585 Pager *pPager, /* The pager open on the database file */ in getPageMMap() argument
5599 && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) in getPageMMap()
5602 assert( USEFETCH(pPager) ); in getPageMMap()
5611 assert( pPager->eState>=PAGER_READER ); in getPageMMap()
5612 assert( assert_pager_state(pPager) ); in getPageMMap()
5613 assert( pPager->hasHeldSharedLock==1 ); in getPageMMap()
5614 assert( pPager->errCode==SQLITE_OK ); in getPageMMap()
5616 if( bMmapOk && pagerUseWal(pPager) ){ in getPageMMap()
5617 rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); in getPageMMap()
5625 rc = sqlite3OsFetch(pPager->fd, in getPageMMap()
5626 (i64)(pgno-1) * pPager->pageSize, pPager->pageSize, &pData in getPageMMap()
5629 if( pPager->eState>PAGER_READER || pPager->tempFile ){ in getPageMMap()
5630 pPg = sqlite3PagerLookup(pPager, pgno); in getPageMMap()
5633 rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg); in getPageMMap()
5635 sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData); in getPageMMap()
5648 return getPageNormal(pPager, pgno, ppPage, flags); in getPageMMap()
5654 Pager *pPager, /* The pager open on the database file */ in getPageError() argument
5661 assert( pPager->errCode!=SQLITE_OK ); in getPageError()
5663 return pPager->errCode; in getPageError()
5670 Pager *pPager, /* The pager open on the database file */ in sqlite3PagerGet() argument
5676 return pPager->xGet(pPager, pgno, ppPage, flags); in sqlite3PagerGet()
5690 DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ in sqlite3PagerLookup() argument
5692 assert( pPager!=0 ); in sqlite3PagerLookup()
5694 assert( pPager->pPCache!=0 ); in sqlite3PagerLookup()
5695 pPage = sqlite3PcacheFetch(pPager->pPCache, pgno, 0); in sqlite3PagerLookup()
5696 assert( pPage==0 || pPager->hasHeldSharedLock ); in sqlite3PagerLookup()
5698 return sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pPage); in sqlite3PagerLookup()
5714 TESTONLY( Pager *pPager = pPg->pPager; ) in sqlite3PagerUnrefNotNull()
5723 assert( sqlite3PcacheRefCount(pPager->pPCache)>0 ); in sqlite3PagerUnrefNotNull()
5729 Pager *pPager; in sqlite3PagerUnrefPageOne() local
5733 pPager = pPg->pPager; in sqlite3PagerUnrefPageOne()
5735 pagerUnlockIfUnused(pPager); in sqlite3PagerUnrefPageOne()
5760 static int pager_open_journal(Pager *pPager){ in pager_open_journal() argument
5762 sqlite3_vfs * const pVfs = pPager->pVfs; /* Local cache of vfs pointer */ in pager_open_journal()
5764 assert( pPager->eState==PAGER_WRITER_LOCKED ); in pager_open_journal()
5765 assert( assert_pager_state(pPager) ); in pager_open_journal()
5766 assert( pPager->pInJournal==0 ); in pager_open_journal()
5771 if( NEVER(pPager->errCode) ) return pPager->errCode; in pager_open_journal()
5773 if( !pagerUseWal(pPager) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ in pager_open_journal()
5774 pPager->pInJournal = sqlite3BitvecCreate(pPager->dbSize); in pager_open_journal()
5775 if( pPager->pInJournal==0 ){ in pager_open_journal()
5780 if( !isOpen(pPager->jfd) ){ in pager_open_journal()
5781 if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){ in pager_open_journal()
5782 sqlite3MemJournalOpen(pPager->jfd); in pager_open_journal()
5787 if( pPager->tempFile ){ in pager_open_journal()
5793 nSpill = jrnlBufferSize(pPager); in pager_open_journal()
5798 rc = databaseIsUnmoved(pPager); in pager_open_journal()
5801 pVfs, pPager->zJournal, pPager->jfd, flags, nSpill in pager_open_journal()
5805 assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); in pager_open_journal()
5814 pPager->nRec = 0; in pager_open_journal()
5815 pPager->journalOff = 0; in pager_open_journal()
5816 pPager->setSuper = 0; in pager_open_journal()
5817 pPager->journalHdr = 0; in pager_open_journal()
5818 rc = writeJournalHdr(pPager); in pager_open_journal()
5823 sqlite3BitvecDestroy(pPager->pInJournal); in pager_open_journal()
5824 pPager->pInJournal = 0; in pager_open_journal()
5825 pPager->journalOff = 0; in pager_open_journal()
5827 assert( pPager->eState==PAGER_WRITER_LOCKED ); in pager_open_journal()
5828 pPager->eState = PAGER_WRITER_CACHEMOD; in pager_open_journal()
5851 int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){ in sqlite3PagerBegin() argument
5854 if( pPager->errCode ) return pPager->errCode; in sqlite3PagerBegin()
5855 assert( pPager->eState>=PAGER_READER && pPager->eState<PAGER_ERROR ); in sqlite3PagerBegin()
5856 pPager->subjInMemory = (u8)subjInMemory; in sqlite3PagerBegin()
5858 if( pPager->eState==PAGER_READER ){ in sqlite3PagerBegin()
5859 assert( pPager->pInJournal==0 ); in sqlite3PagerBegin()
5861 if( pagerUseWal(pPager) ){ in sqlite3PagerBegin()
5865 if( pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, -1) ){ in sqlite3PagerBegin()
5866 rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); in sqlite3PagerBegin()
5870 (void)sqlite3WalExclusiveMode(pPager->pWal, 1); in sqlite3PagerBegin()
5878 rc = sqlite3WalBeginWriteTransaction(pPager->pWal); in sqlite3PagerBegin()
5885 rc = pagerLockDb(pPager, RESERVED_LOCK); in sqlite3PagerBegin()
5887 rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); in sqlite3PagerBegin()
5901 pPager->eState = PAGER_WRITER_LOCKED; in sqlite3PagerBegin()
5902 pPager->dbHintSize = pPager->dbSize; in sqlite3PagerBegin()
5903 pPager->dbFileSize = pPager->dbSize; in sqlite3PagerBegin()
5904 pPager->dbOrigSize = pPager->dbSize; in sqlite3PagerBegin()
5905 pPager->journalOff = 0; in sqlite3PagerBegin()
5908 assert( rc==SQLITE_OK || pPager->eState==PAGER_READER ); in sqlite3PagerBegin()
5909 assert( rc!=SQLITE_OK || pPager->eState==PAGER_WRITER_LOCKED ); in sqlite3PagerBegin()
5910 assert( assert_pager_state(pPager) ); in sqlite3PagerBegin()
5913 PAGERTRACE(("TRANSACTION %d\n", PAGERID(pPager))); in sqlite3PagerBegin()
5921 Pager *pPager = pPg->pPager; in pagerAddPageToRollbackJournal() local
5925 i64 iOff = pPager->journalOff; in pagerAddPageToRollbackJournal()
5930 assert( pPg->pgno!=PAGER_SJ_PGNO(pPager) ); in pagerAddPageToRollbackJournal()
5932 assert( pPager->journalHdr<=pPager->journalOff ); in pagerAddPageToRollbackJournal()
5934 cksum = pager_cksum(pPager, (u8*)pData2); in pagerAddPageToRollbackJournal()
5945 rc = write32bits(pPager->jfd, iOff, pPg->pgno); in pagerAddPageToRollbackJournal()
5947 rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, iOff+4); in pagerAddPageToRollbackJournal()
5949 rc = write32bits(pPager->jfd, iOff+pPager->pageSize+4, cksum); in pagerAddPageToRollbackJournal()
5952 IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, in pagerAddPageToRollbackJournal()
5953 pPager->journalOff, pPager->pageSize)); in pagerAddPageToRollbackJournal()
5956 PAGERID(pPager), pPg->pgno, in pagerAddPageToRollbackJournal()
5959 pPager->journalOff += 8 + pPager->pageSize; in pagerAddPageToRollbackJournal()
5960 pPager->nRec++; in pagerAddPageToRollbackJournal()
5961 assert( pPager->pInJournal!=0 ); in pagerAddPageToRollbackJournal()
5962 rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno); in pagerAddPageToRollbackJournal()
5965 rc |= addToSavepointBitvecs(pPager, pPg->pgno); in pagerAddPageToRollbackJournal()
5978 Pager *pPager = pPg->pPager; in pager_write() local
5985 assert( pPager->eState==PAGER_WRITER_LOCKED in pager_write()
5986 || pPager->eState==PAGER_WRITER_CACHEMOD in pager_write()
5987 || pPager->eState==PAGER_WRITER_DBMOD in pager_write()
5989 assert( assert_pager_state(pPager) ); in pager_write()
5990 assert( pPager->errCode==0 ); in pager_write()
5991 assert( pPager->readOnly==0 ); in pager_write()
6003 if( pPager->eState==PAGER_WRITER_LOCKED ){ in pager_write()
6004 rc = pager_open_journal(pPager); in pager_write()
6007 assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); in pager_write()
6008 assert( assert_pager_state(pPager) ); in pager_write()
6017 assert( (pPager->pInJournal!=0) == isOpen(pPager->jfd) ); in pager_write()
6018 if( pPager->pInJournal!=0 in pager_write()
6019 && sqlite3BitvecTestNotNull(pPager->pInJournal, pPg->pgno)==0 in pager_write()
6021 assert( pagerUseWal(pPager)==0 ); in pager_write()
6022 if( pPg->pgno<=pPager->dbOrigSize ){ in pager_write()
6028 if( pPager->eState!=PAGER_WRITER_DBMOD ){ in pager_write()
6032 PAGERID(pPager), pPg->pgno, in pager_write()
6047 if( pPager->nSavepoint>0 ){ in pager_write()
6052 if( pPager->dbSize<pPg->pgno ){ in pager_write()
6053 pPager->dbSize = pPg->pgno; in pager_write()
6076 Pager *pPager = pPg->pPager; /* The pager that owns pPg */ in pagerWriteLargeSector() local
6077 Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); in pagerWriteLargeSector()
6084 assert( (pPager->doNotSpill & SPILLFLAG_NOSYNC)==0 ); in pagerWriteLargeSector()
6085 pPager->doNotSpill |= SPILLFLAG_NOSYNC; in pagerWriteLargeSector()
6093 nPageCount = pPager->dbSize; in pagerWriteLargeSector()
6108 if( pg==pPg->pgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){ in pagerWriteLargeSector()
6109 if( pg!=PAGER_SJ_PGNO(pPager) ){ in pagerWriteLargeSector()
6110 rc = sqlite3PagerGet(pPager, pg, &pPage, 0); in pagerWriteLargeSector()
6119 }else if( (pPage = sqlite3PagerLookup(pPager, pg))!=0 ){ in pagerWriteLargeSector()
6136 PgHdr *pPage = sqlite3PagerLookup(pPager, pg1+ii); in pagerWriteLargeSector()
6144 assert( (pPager->doNotSpill & SPILLFLAG_NOSYNC)!=0 ); in pagerWriteLargeSector()
6145 pPager->doNotSpill &= ~SPILLFLAG_NOSYNC; in pagerWriteLargeSector()
6164 Pager *pPager = pPg->pPager; in sqlite3PagerWrite() local
6166 assert( pPager->eState>=PAGER_WRITER_LOCKED ); in sqlite3PagerWrite()
6167 assert( assert_pager_state(pPager) ); in sqlite3PagerWrite()
6168 if( (pPg->flags & PGHDR_WRITEABLE)!=0 && pPager->dbSize>=pPg->pgno ){ in sqlite3PagerWrite()
6169 if( pPager->nSavepoint ) return subjournalPageIfRequired(pPg); in sqlite3PagerWrite()
6171 }else if( pPager->errCode ){ in sqlite3PagerWrite()
6172 return pPager->errCode; in sqlite3PagerWrite()
6173 }else if( pPager->sectorSize > (u32)pPager->pageSize ){ in sqlite3PagerWrite()
6174 assert( pPager->tempFile==0 ); in sqlite3PagerWrite()
6213 Pager *pPager = pPg->pPager; in sqlite3PagerDontWrite() local
6214 if( !pPager->tempFile && (pPg->flags&PGHDR_DIRTY) && pPager->nSavepoint==0 ){ in sqlite3PagerDontWrite()
6215 PAGERTRACE(("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager))); in sqlite3PagerDontWrite()
6216 IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno)) in sqlite3PagerDontWrite()
6246 static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ in pager_incr_changecounter() argument
6249 assert( pPager->eState==PAGER_WRITER_CACHEMOD in pager_incr_changecounter()
6250 || pPager->eState==PAGER_WRITER_DBMOD in pager_incr_changecounter()
6252 assert( assert_pager_state(pPager) ); in pager_incr_changecounter()
6272 if( !pPager->changeCountDone && ALWAYS(pPager->dbSize>0) ){ in pager_incr_changecounter()
6275 assert( !pPager->tempFile && isOpen(pPager->fd) ); in pager_incr_changecounter()
6278 rc = sqlite3PagerGet(pPager, 1, &pPgHdr, 0); in pager_incr_changecounter()
6297 assert( pPager->dbFileSize>0 ); in pager_incr_changecounter()
6300 rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); in pager_incr_changecounter()
6301 pPager->aStat[PAGER_STAT_WRITE]++; in pager_incr_changecounter()
6308 memcpy(&pPager->dbFileVers, pCopy, sizeof(pPager->dbFileVers)); in pager_incr_changecounter()
6309 pPager->changeCountDone = 1; in pager_incr_changecounter()
6312 pPager->changeCountDone = 1; in pager_incr_changecounter()
6329 int sqlite3PagerSync(Pager *pPager, const char *zSuper){ in sqlite3PagerSync() argument
6332 rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg); in sqlite3PagerSync()
6334 if( rc==SQLITE_OK && !pPager->noSync ){ in sqlite3PagerSync()
6336 rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); in sqlite3PagerSync()
6352 int sqlite3PagerExclusiveLock(Pager *pPager){ in sqlite3PagerExclusiveLock() argument
6353 int rc = pPager->errCode; in sqlite3PagerExclusiveLock()
6354 assert( assert_pager_state(pPager) ); in sqlite3PagerExclusiveLock()
6356 assert( pPager->eState==PAGER_WRITER_CACHEMOD in sqlite3PagerExclusiveLock()
6357 || pPager->eState==PAGER_WRITER_DBMOD in sqlite3PagerExclusiveLock()
6358 || pPager->eState==PAGER_WRITER_LOCKED in sqlite3PagerExclusiveLock()
6360 assert( assert_pager_state(pPager) ); in sqlite3PagerExclusiveLock()
6361 if( 0==pagerUseWal(pPager) ){ in sqlite3PagerExclusiveLock()
6362 rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); in sqlite3PagerExclusiveLock()
6395 Pager *pPager, /* Pager object */ in sqlite3PagerCommitPhaseOne() argument
6401 assert( pPager->eState==PAGER_WRITER_LOCKED in sqlite3PagerCommitPhaseOne()
6402 || pPager->eState==PAGER_WRITER_CACHEMOD in sqlite3PagerCommitPhaseOne()
6403 || pPager->eState==PAGER_WRITER_DBMOD in sqlite3PagerCommitPhaseOne()
6404 || pPager->eState==PAGER_ERROR in sqlite3PagerCommitPhaseOne()
6406 assert( assert_pager_state(pPager) ); in sqlite3PagerCommitPhaseOne()
6409 if( NEVER(pPager->errCode) ) return pPager->errCode; in sqlite3PagerCommitPhaseOne()
6415 pPager->zFilename, zSuper, pPager->dbSize)); in sqlite3PagerCommitPhaseOne()
6418 if( pPager->eState<PAGER_WRITER_CACHEMOD ) return SQLITE_OK; in sqlite3PagerCommitPhaseOne()
6420 assert( MEMDB==0 || pPager->tempFile ); in sqlite3PagerCommitPhaseOne()
6421 assert( isOpen(pPager->fd) || pPager->tempFile ); in sqlite3PagerCommitPhaseOne()
6422 if( 0==pagerFlushOnCommit(pPager, 1) ){ in sqlite3PagerCommitPhaseOne()
6426 sqlite3BackupRestart(pPager->pBackup); in sqlite3PagerCommitPhaseOne()
6429 if( pagerUseWal(pPager) ){ in sqlite3PagerCommitPhaseOne()
6431 pList = sqlite3PcacheDirtyList(pPager->pPCache); in sqlite3PagerCommitPhaseOne()
6435 rc = sqlite3PagerGet(pPager, 1, &pPageOne, 0); in sqlite3PagerCommitPhaseOne()
6441 rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1); in sqlite3PagerCommitPhaseOne()
6445 sqlite3PcacheCleanAll(pPager->pPCache); in sqlite3PagerCommitPhaseOne()
6453 sqlite3_file *fd = pPager->fd; in sqlite3PagerCommitPhaseOne()
6456 && !pPager->noSync in sqlite3PagerCommitPhaseOne()
6457 && sqlite3JournalIsInMemory(pPager->jfd); in sqlite3PagerCommitPhaseOne()
6488 assert( isOpen(pPager->jfd) in sqlite3PagerCommitPhaseOne()
6489 || pPager->journalMode==PAGER_JOURNALMODE_OFF in sqlite3PagerCommitPhaseOne()
6490 || pPager->journalMode==PAGER_JOURNALMODE_WAL in sqlite3PagerCommitPhaseOne()
6492 if( !zSuper && isOpen(pPager->jfd) in sqlite3PagerCommitPhaseOne()
6493 && pPager->journalOff==jrnlBufferSize(pPager) in sqlite3PagerCommitPhaseOne()
6494 && pPager->dbSize>=pPager->dbOrigSize in sqlite3PagerCommitPhaseOne()
6495 && (!(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty) in sqlite3PagerCommitPhaseOne()
6503 rc = pager_incr_changecounter(pPager, 1); in sqlite3PagerCommitPhaseOne()
6505 rc = sqlite3JournalCreate(pPager->jfd); in sqlite3PagerCommitPhaseOne()
6507 rc = pager_incr_changecounter(pPager, 0); in sqlite3PagerCommitPhaseOne()
6514 rc = sqlite3JournalCreate(pPager->jfd); in sqlite3PagerCommitPhaseOne()
6519 rc = pager_incr_changecounter(pPager, 0); in sqlite3PagerCommitPhaseOne()
6527 rc = writeSuperJournal(pPager, zSuper); in sqlite3PagerCommitPhaseOne()
6541 rc = syncJournal(pPager, 0); in sqlite3PagerCommitPhaseOne()
6544 pList = sqlite3PcacheDirtyList(pPager->pPCache); in sqlite3PagerCommitPhaseOne()
6549 rc = pager_write_pagelist(pPager, pList); in sqlite3PagerCommitPhaseOne()
6559 rc = sqlite3JournalCreate(pPager->jfd); in sqlite3PagerCommitPhaseOne()
6561 sqlite3OsClose(pPager->jfd); in sqlite3PagerCommitPhaseOne()
6566 sqlite3OsClose(pPager->jfd); in sqlite3PagerCommitPhaseOne()
6572 rc = pager_write_pagelist(pPager, pList); in sqlite3PagerCommitPhaseOne()
6578 sqlite3PcacheCleanAll(pPager->pPCache); in sqlite3PagerCommitPhaseOne()
6586 if( pPager->dbSize>pPager->dbFileSize ){ in sqlite3PagerCommitPhaseOne()
6587 Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_SJ_PGNO(pPager)); in sqlite3PagerCommitPhaseOne()
6588 assert( pPager->eState==PAGER_WRITER_DBMOD ); in sqlite3PagerCommitPhaseOne()
6589 rc = pager_truncate(pPager, nNew); in sqlite3PagerCommitPhaseOne()
6595 rc = sqlite3PagerSync(pPager, zSuper); in sqlite3PagerCommitPhaseOne()
6597 IOTRACE(("DBSYNC %p\n", pPager)) in sqlite3PagerCommitPhaseOne()
6602 if( rc==SQLITE_OK && !pagerUseWal(pPager) ){ in sqlite3PagerCommitPhaseOne()
6603 pPager->eState = PAGER_WRITER_FINISHED; in sqlite3PagerCommitPhaseOne()
6624 int sqlite3PagerCommitPhaseTwo(Pager *pPager){ in sqlite3PagerCommitPhaseTwo() argument
6630 if( NEVER(pPager->errCode) ) return pPager->errCode; in sqlite3PagerCommitPhaseTwo()
6631 pPager->iDataVersion++; in sqlite3PagerCommitPhaseTwo()
6633 assert( pPager->eState==PAGER_WRITER_LOCKED in sqlite3PagerCommitPhaseTwo()
6634 || pPager->eState==PAGER_WRITER_FINISHED in sqlite3PagerCommitPhaseTwo()
6635 || (pagerUseWal(pPager) && pPager->eState==PAGER_WRITER_CACHEMOD) in sqlite3PagerCommitPhaseTwo()
6637 assert( assert_pager_state(pPager) ); in sqlite3PagerCommitPhaseTwo()
6650 if( pPager->eState==PAGER_WRITER_LOCKED in sqlite3PagerCommitPhaseTwo()
6651 && pPager->exclusiveMode in sqlite3PagerCommitPhaseTwo()
6652 && pPager->journalMode==PAGER_JOURNALMODE_PERSIST in sqlite3PagerCommitPhaseTwo()
6654 assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) || !pPager->journalOff ); in sqlite3PagerCommitPhaseTwo()
6655 pPager->eState = PAGER_READER; in sqlite3PagerCommitPhaseTwo()
6659 PAGERTRACE(("COMMIT %d\n", PAGERID(pPager))); in sqlite3PagerCommitPhaseTwo()
6660 rc = pager_end_transaction(pPager, pPager->setSuper, 1); in sqlite3PagerCommitPhaseTwo()
6661 return pager_error(pPager, rc); in sqlite3PagerCommitPhaseTwo()
6690 int sqlite3PagerRollback(Pager *pPager){ in sqlite3PagerRollback() argument
6692 PAGERTRACE(("ROLLBACK %d\n", PAGERID(pPager))); in sqlite3PagerRollback()
6698 assert( assert_pager_state(pPager) ); in sqlite3PagerRollback()
6699 if( pPager->eState==PAGER_ERROR ) return pPager->errCode; in sqlite3PagerRollback()
6700 if( pPager->eState<=PAGER_READER ) return SQLITE_OK; in sqlite3PagerRollback()
6702 if( pagerUseWal(pPager) ){ in sqlite3PagerRollback()
6704 rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, -1); in sqlite3PagerRollback()
6705 rc2 = pager_end_transaction(pPager, pPager->setSuper, 0); in sqlite3PagerRollback()
6707 }else if( !isOpen(pPager->jfd) || pPager->eState==PAGER_WRITER_LOCKED ){ in sqlite3PagerRollback()
6708 int eState = pPager->eState; in sqlite3PagerRollback()
6709 rc = pager_end_transaction(pPager, 0, 0); in sqlite3PagerRollback()
6715 pPager->errCode = SQLITE_ABORT; in sqlite3PagerRollback()
6716 pPager->eState = PAGER_ERROR; in sqlite3PagerRollback()
6717 setGetterMethod(pPager); in sqlite3PagerRollback()
6721 rc = pager_playback(pPager, 0); in sqlite3PagerRollback()
6724 assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK ); in sqlite3PagerRollback()
6733 return pager_error(pPager, rc); in sqlite3PagerRollback()
6740 u8 sqlite3PagerIsreadonly(Pager *pPager){ in sqlite3PagerIsreadonly() argument
6741 return pPager->readOnly; in sqlite3PagerIsreadonly()
6748 int sqlite3PagerRefcount(Pager *pPager){ in sqlite3PagerRefcount() argument
6749 return sqlite3PcacheRefCount(pPager->pPCache); in sqlite3PagerRefcount()
6757 int sqlite3PagerMemUsed(Pager *pPager){ in sqlite3PagerMemUsed() argument
6758 int perPageSize = pPager->pageSize + pPager->nExtra in sqlite3PagerMemUsed()
6760 return perPageSize*sqlite3PcachePagecount(pPager->pPCache) in sqlite3PagerMemUsed()
6761 + sqlite3MallocSize(pPager) in sqlite3PagerMemUsed()
6762 + pPager->pageSize; in sqlite3PagerMemUsed()
6776 int *sqlite3PagerStats(Pager *pPager){ in sqlite3PagerStats() argument
6778 a[0] = sqlite3PcacheRefCount(pPager->pPCache); in sqlite3PagerStats()
6779 a[1] = sqlite3PcachePagecount(pPager->pPCache); in sqlite3PagerStats()
6780 a[2] = sqlite3PcacheGetCachesize(pPager->pPCache); in sqlite3PagerStats()
6781 a[3] = pPager->eState==PAGER_OPEN ? -1 : (int) pPager->dbSize; in sqlite3PagerStats()
6782 a[4] = pPager->eState; in sqlite3PagerStats()
6783 a[5] = pPager->errCode; in sqlite3PagerStats()
6784 a[6] = pPager->aStat[PAGER_STAT_HIT]; in sqlite3PagerStats()
6785 a[7] = pPager->aStat[PAGER_STAT_MISS]; in sqlite3PagerStats()
6787 a[9] = pPager->nRead; in sqlite3PagerStats()
6788 a[10] = pPager->aStat[PAGER_STAT_WRITE]; in sqlite3PagerStats()
6804 void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){ in sqlite3PagerCacheStat() argument
6818 *pnVal += pPager->aStat[eStat]; in sqlite3PagerCacheStat()
6820 pPager->aStat[eStat] = 0; in sqlite3PagerCacheStat()
6827 int sqlite3PagerIsMemdb(Pager *pPager){ in sqlite3PagerIsMemdb() argument
6828 return pPager->tempFile || pPager->memVfs; in sqlite3PagerIsMemdb()
6841 static SQLITE_NOINLINE int pagerOpenSavepoint(Pager *pPager, int nSavepoint){ in pagerOpenSavepoint() argument
6843 int nCurrent = pPager->nSavepoint; /* Current number of savepoints */ in pagerOpenSavepoint()
6847 assert( pPager->eState>=PAGER_WRITER_LOCKED ); in pagerOpenSavepoint()
6848 assert( assert_pager_state(pPager) ); in pagerOpenSavepoint()
6849 assert( nSavepoint>nCurrent && pPager->useJournal ); in pagerOpenSavepoint()
6856 pPager->aSavepoint, sizeof(PagerSavepoint)*nSavepoint in pagerOpenSavepoint()
6862 pPager->aSavepoint = aNew; in pagerOpenSavepoint()
6866 aNew[ii].nOrig = pPager->dbSize; in pagerOpenSavepoint()
6867 if( isOpen(pPager->jfd) && pPager->journalOff>0 ){ in pagerOpenSavepoint()
6868 aNew[ii].iOffset = pPager->journalOff; in pagerOpenSavepoint()
6870 aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager); in pagerOpenSavepoint()
6872 aNew[ii].iSubRec = pPager->nSubRec; in pagerOpenSavepoint()
6873 aNew[ii].pInSavepoint = sqlite3BitvecCreate(pPager->dbSize); in pagerOpenSavepoint()
6878 if( pagerUseWal(pPager) ){ in pagerOpenSavepoint()
6879 sqlite3WalSavepoint(pPager->pWal, aNew[ii].aWalData); in pagerOpenSavepoint()
6881 pPager->nSavepoint = ii+1; in pagerOpenSavepoint()
6883 assert( pPager->nSavepoint==nSavepoint ); in pagerOpenSavepoint()
6884 assertTruncateConstraint(pPager); in pagerOpenSavepoint()
6887 int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ in sqlite3PagerOpenSavepoint() argument
6888 assert( pPager->eState>=PAGER_WRITER_LOCKED ); in sqlite3PagerOpenSavepoint()
6889 assert( assert_pager_state(pPager) ); in sqlite3PagerOpenSavepoint()
6891 if( nSavepoint>pPager->nSavepoint && pPager->useJournal ){ in sqlite3PagerOpenSavepoint()
6892 return pagerOpenSavepoint(pPager, nSavepoint); in sqlite3PagerOpenSavepoint()
6929 int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ in sqlite3PagerSavepoint() argument
6930 int rc = pPager->errCode; in sqlite3PagerSavepoint()
6939 if( rc==SQLITE_OK && iSavepoint<pPager->nSavepoint ){ in sqlite3PagerSavepoint()
6948 for(ii=nNew; ii<pPager->nSavepoint; ii++){ in sqlite3PagerSavepoint()
6949 sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint); in sqlite3PagerSavepoint()
6951 pPager->nSavepoint = nNew; in sqlite3PagerSavepoint()
6956 PagerSavepoint *pRel = &pPager->aSavepoint[nNew]; in sqlite3PagerSavepoint()
6957 if( pRel->bTruncateOnRelease && isOpen(pPager->sjfd) ){ in sqlite3PagerSavepoint()
6959 if( sqlite3JournalIsInMemory(pPager->sjfd) ){ in sqlite3PagerSavepoint()
6960 i64 sz = (pPager->pageSize+4)*(i64)pRel->iSubRec; in sqlite3PagerSavepoint()
6961 rc = sqlite3OsTruncate(pPager->sjfd, sz); in sqlite3PagerSavepoint()
6964 pPager->nSubRec = pRel->iSubRec; in sqlite3PagerSavepoint()
6972 else if( pagerUseWal(pPager) || isOpen(pPager->jfd) ){ in sqlite3PagerSavepoint()
6973 PagerSavepoint *pSavepoint = (nNew==0)?0:&pPager->aSavepoint[nNew-1]; in sqlite3PagerSavepoint()
6974 rc = pagerPlaybackSavepoint(pPager, pSavepoint); in sqlite3PagerSavepoint()
6984 pPager->journalMode==PAGER_JOURNALMODE_OFF in sqlite3PagerSavepoint()
6985 && pPager->eState>=PAGER_WRITER_CACHEMOD in sqlite3PagerSavepoint()
6987 pPager->errCode = SQLITE_ABORT; in sqlite3PagerSavepoint()
6988 pPager->eState = PAGER_ERROR; in sqlite3PagerSavepoint()
6989 setGetterMethod(pPager); in sqlite3PagerSavepoint()
7010 const char *sqlite3PagerFilename(const Pager *pPager, int nullIfMemDb){ in sqlite3PagerFilename() argument
7012 return (nullIfMemDb && pPager->memDb) ? &zFake[4] : pPager->zFilename; in sqlite3PagerFilename()
7018 sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ in sqlite3PagerVfs() argument
7019 return pPager->pVfs; in sqlite3PagerVfs()
7027 sqlite3_file *sqlite3PagerFile(Pager *pPager){ in sqlite3PagerFile() argument
7028 return pPager->fd; in sqlite3PagerFile()
7035 sqlite3_file *sqlite3PagerJrnlFile(Pager *pPager){ in sqlite3PagerJrnlFile() argument
7037 return pPager->jfd; in sqlite3PagerJrnlFile()
7039 return pPager->pWal ? sqlite3WalFile(pPager->pWal) : pPager->jfd; in sqlite3PagerJrnlFile()
7046 const char *sqlite3PagerJournalname(Pager *pPager){ in sqlite3PagerJournalname() argument
7047 return pPager->zJournal; in sqlite3PagerJournalname()
7076 int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){ in sqlite3PagerMovepage() argument
7083 assert( pPager->eState==PAGER_WRITER_CACHEMOD in sqlite3PagerMovepage()
7084 || pPager->eState==PAGER_WRITER_DBMOD in sqlite3PagerMovepage()
7086 assert( assert_pager_state(pPager) ); in sqlite3PagerMovepage()
7091 assert( pPager->tempFile || !MEMDB ); in sqlite3PagerMovepage()
7092 if( pPager->tempFile ){ in sqlite3PagerMovepage()
7122 PAGERID(pPager), pPg->pgno, (pPg->flags&PGHDR_NEED_SYNC)?1:0, pgno)); in sqlite3PagerMovepage()
7123 IOTRACE(("MOVE %p %d %d\n", pPager, pPg->pgno, pgno)) in sqlite3PagerMovepage()
7134 assert( pPager->journalMode==PAGER_JOURNALMODE_OFF || in sqlite3PagerMovepage()
7135 pageInJournal(pPager, pPg) || pPg->pgno>pPager->dbOrigSize ); in sqlite3PagerMovepage()
7145 pPgOld = sqlite3PagerLookup(pPager, pgno); in sqlite3PagerMovepage()
7153 if( pPager->tempFile ){ in sqlite3PagerMovepage()
7156 sqlite3PcacheMove(pPgOld, pPager->dbSize+1); in sqlite3PagerMovepage()
7170 if( pPager->tempFile && pPgOld ){ in sqlite3PagerMovepage()
7191 rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr, 0); in sqlite3PagerMovepage()
7193 if( needSyncPgno<=pPager->dbOrigSize ){ in sqlite3PagerMovepage()
7194 assert( pPager->pTmpSpace!=0 ); in sqlite3PagerMovepage()
7195 sqlite3BitvecClear(pPager->pInJournal, needSyncPgno, pPager->pTmpSpace); in sqlite3PagerMovepage()
7224 assert( pPg->nRef>0 || pPg->pPager->memDb ); in sqlite3PagerGetData()
7246 int sqlite3PagerLockingMode(Pager *pPager, int eMode){ in sqlite3PagerLockingMode() argument
7252 assert( pPager->exclusiveMode || 0==sqlite3WalHeapMemory(pPager->pWal) ); in sqlite3PagerLockingMode()
7253 if( eMode>=0 && !pPager->tempFile && !sqlite3WalHeapMemory(pPager->pWal) ){ in sqlite3PagerLockingMode()
7254 pPager->exclusiveMode = (u8)eMode; in sqlite3PagerLockingMode()
7256 return (int)pPager->exclusiveMode; in sqlite3PagerLockingMode()
7279 int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ in sqlite3PagerSetJournalMode() argument
7280 u8 eOld = pPager->journalMode; /* Prior journalmode */ in sqlite3PagerSetJournalMode()
7294 assert( pPager->tempFile==0 || eMode!=PAGER_JOURNALMODE_WAL ); in sqlite3PagerSetJournalMode()
7309 assert( pPager->eState!=PAGER_ERROR ); in sqlite3PagerSetJournalMode()
7310 pPager->journalMode = (u8)eMode; in sqlite3PagerSetJournalMode()
7323 assert( isOpen(pPager->fd) || pPager->exclusiveMode ); in sqlite3PagerSetJournalMode()
7324 if( !pPager->exclusiveMode && (eOld & 5)==1 && (eMode & 1)==0 ){ in sqlite3PagerSetJournalMode()
7333 sqlite3OsClose(pPager->jfd); in sqlite3PagerSetJournalMode()
7334 if( pPager->eLock>=RESERVED_LOCK ){ in sqlite3PagerSetJournalMode()
7335 sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); in sqlite3PagerSetJournalMode()
7338 int state = pPager->eState; in sqlite3PagerSetJournalMode()
7341 rc = sqlite3PagerSharedLock(pPager); in sqlite3PagerSetJournalMode()
7343 if( pPager->eState==PAGER_READER ){ in sqlite3PagerSetJournalMode()
7345 rc = pagerLockDb(pPager, RESERVED_LOCK); in sqlite3PagerSetJournalMode()
7348 sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); in sqlite3PagerSetJournalMode()
7351 pagerUnlockDb(pPager, SHARED_LOCK); in sqlite3PagerSetJournalMode()
7353 pager_unlock(pPager); in sqlite3PagerSetJournalMode()
7355 assert( state==pPager->eState ); in sqlite3PagerSetJournalMode()
7358 sqlite3OsClose(pPager->jfd); in sqlite3PagerSetJournalMode()
7363 return (int)pPager->journalMode; in sqlite3PagerSetJournalMode()
7369 int sqlite3PagerGetJournalMode(Pager *pPager){ in sqlite3PagerGetJournalMode() argument
7370 return (int)pPager->journalMode; in sqlite3PagerGetJournalMode()
7378 int sqlite3PagerOkToChangeJournalMode(Pager *pPager){ in sqlite3PagerOkToChangeJournalMode() argument
7379 assert( assert_pager_state(pPager) ); in sqlite3PagerOkToChangeJournalMode()
7380 if( pPager->eState>=PAGER_WRITER_CACHEMOD ) return 0; in sqlite3PagerOkToChangeJournalMode()
7381 if( NEVER(isOpen(pPager->jfd) && pPager->journalOff>0) ) return 0; in sqlite3PagerOkToChangeJournalMode()
7391 i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){ in sqlite3PagerJournalSizeLimit() argument
7393 pPager->journalSizeLimit = iLimit; in sqlite3PagerJournalSizeLimit()
7394 sqlite3WalLimit(pPager->pWal, iLimit); in sqlite3PagerJournalSizeLimit()
7396 return pPager->journalSizeLimit; in sqlite3PagerJournalSizeLimit()
7405 sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ in sqlite3PagerBackupPtr() argument
7406 return &pPager->pBackup; in sqlite3PagerBackupPtr()
7413 void sqlite3PagerClearCache(Pager *pPager){ in sqlite3PagerClearCache() argument
7414 assert( MEMDB==0 || pPager->tempFile ); in sqlite3PagerClearCache()
7415 if( pPager->tempFile==0 ) pager_reset(pPager); in sqlite3PagerClearCache()
7429 Pager *pPager, /* Checkpoint on this pager */ in sqlite3PagerCheckpoint() argument
7436 if( pPager->pWal==0 && pPager->journalMode==PAGER_JOURNALMODE_WAL ){ in sqlite3PagerCheckpoint()
7448 if( pPager->pWal ){ in sqlite3PagerCheckpoint()
7449 rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode, in sqlite3PagerCheckpoint()
7450 (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), in sqlite3PagerCheckpoint()
7451 pPager->pBusyHandlerArg, in sqlite3PagerCheckpoint()
7452 pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, in sqlite3PagerCheckpoint()
7459 int sqlite3PagerWalCallback(Pager *pPager){ in sqlite3PagerWalCallback() argument
7460 return sqlite3WalCallback(pPager->pWal); in sqlite3PagerWalCallback()
7467 int sqlite3PagerWalSupported(Pager *pPager){ in sqlite3PagerWalSupported() argument
7468 const sqlite3_io_methods *pMethods = pPager->fd->pMethods; in sqlite3PagerWalSupported()
7469 if( pPager->noLock ) return 0; in sqlite3PagerWalSupported()
7470 return pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap); in sqlite3PagerWalSupported()
7477 static int pagerExclusiveLock(Pager *pPager){ in pagerExclusiveLock() argument
7480 assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); in pagerExclusiveLock()
7481 rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); in pagerExclusiveLock()
7485 pagerUnlockDb(pPager, SHARED_LOCK); in pagerExclusiveLock()
7497 static int pagerOpenWal(Pager *pPager){ in pagerOpenWal() argument
7500 assert( pPager->pWal==0 && pPager->tempFile==0 ); in pagerOpenWal()
7501 assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); in pagerOpenWal()
7508 if( pPager->exclusiveMode ){ in pagerOpenWal()
7509 rc = pagerExclusiveLock(pPager); in pagerOpenWal()
7516 rc = sqlite3WalOpen(pPager->pVfs, in pagerOpenWal()
7517 pPager->fd, pPager->zWal, pPager->exclusiveMode, in pagerOpenWal()
7518 pPager->journalSizeLimit, &pPager->pWal in pagerOpenWal()
7521 pagerFixMaplimit(pPager); in pagerOpenWal()
7543 Pager *pPager, /* Pager object */ in sqlite3PagerOpenWal() argument
7548 assert( assert_pager_state(pPager) ); in sqlite3PagerOpenWal()
7549 assert( pPager->eState==PAGER_OPEN || pbOpen ); in sqlite3PagerOpenWal()
7550 assert( pPager->eState==PAGER_READER || !pbOpen ); in sqlite3PagerOpenWal()
7552 assert( pbOpen!=0 || (!pPager->tempFile && !pPager->pWal) ); in sqlite3PagerOpenWal()
7554 if( !pPager->tempFile && !pPager->pWal ){ in sqlite3PagerOpenWal()
7555 if( !sqlite3PagerWalSupported(pPager) ) return SQLITE_CANTOPEN; in sqlite3PagerOpenWal()
7558 sqlite3OsClose(pPager->jfd); in sqlite3PagerOpenWal()
7560 rc = pagerOpenWal(pPager); in sqlite3PagerOpenWal()
7562 pPager->journalMode = PAGER_JOURNALMODE_WAL; in sqlite3PagerOpenWal()
7563 pPager->eState = PAGER_OPEN; in sqlite3PagerOpenWal()
7581 int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ in sqlite3PagerCloseWal() argument
7584 assert( pPager->journalMode==PAGER_JOURNALMODE_WAL ); in sqlite3PagerCloseWal()
7590 if( !pPager->pWal ){ in sqlite3PagerCloseWal()
7592 rc = pagerLockDb(pPager, SHARED_LOCK); in sqlite3PagerCloseWal()
7595 pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &logexists in sqlite3PagerCloseWal()
7599 rc = pagerOpenWal(pPager); in sqlite3PagerCloseWal()
7606 if( rc==SQLITE_OK && pPager->pWal ){ in sqlite3PagerCloseWal()
7607 rc = pagerExclusiveLock(pPager); in sqlite3PagerCloseWal()
7609 rc = sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, in sqlite3PagerCloseWal()
7610 pPager->pageSize, (u8*)pPager->pTmpSpace); in sqlite3PagerCloseWal()
7611 pPager->pWal = 0; in sqlite3PagerCloseWal()
7612 pagerFixMaplimit(pPager); in sqlite3PagerCloseWal()
7613 if( rc && !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); in sqlite3PagerCloseWal()
7626 int sqlite3PagerWalWriteLock(Pager *pPager, int bLock){ in sqlite3PagerWalWriteLock() argument
7628 if( pagerUseWal(pPager) && pPager->exclusiveMode==0 ){ in sqlite3PagerWalWriteLock()
7629 rc = sqlite3WalWriteLock(pPager->pWal, bLock); in sqlite3PagerWalWriteLock()
7638 void sqlite3PagerWalDb(Pager *pPager, sqlite3 *db){ in sqlite3PagerWalDb() argument
7639 if( pagerUseWal(pPager) ){ in sqlite3PagerWalDb()
7640 sqlite3WalDb(pPager->pWal, db); in sqlite3PagerWalDb()
7650 int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot){ in sqlite3PagerSnapshotGet() argument
7652 if( pPager->pWal ){ in sqlite3PagerSnapshotGet()
7653 rc = sqlite3WalSnapshotGet(pPager->pWal, ppSnapshot); in sqlite3PagerSnapshotGet()
7664 Pager *pPager, in sqlite3PagerSnapshotOpen() argument
7668 if( pPager->pWal ){ in sqlite3PagerSnapshotOpen()
7669 sqlite3WalSnapshotOpen(pPager->pWal, pSnapshot); in sqlite3PagerSnapshotOpen()
7680 int sqlite3PagerSnapshotRecover(Pager *pPager){ in sqlite3PagerSnapshotRecover() argument
7682 if( pPager->pWal ){ in sqlite3PagerSnapshotRecover()
7683 rc = sqlite3WalSnapshotRecover(pPager->pWal); in sqlite3PagerSnapshotRecover()
7702 int sqlite3PagerSnapshotCheck(Pager *pPager, sqlite3_snapshot *pSnapshot){ in sqlite3PagerSnapshotCheck() argument
7704 if( pPager->pWal ){ in sqlite3PagerSnapshotCheck()
7705 rc = sqlite3WalSnapshotCheck(pPager->pWal, pSnapshot); in sqlite3PagerSnapshotCheck()
7716 void sqlite3PagerSnapshotUnlock(Pager *pPager){ in sqlite3PagerSnapshotUnlock() argument
7717 assert( pPager->pWal ); in sqlite3PagerSnapshotUnlock()
7718 sqlite3WalSnapshotUnlock(pPager->pWal); in sqlite3PagerSnapshotUnlock()
7732 int sqlite3PagerWalFramesize(Pager *pPager){ in sqlite3PagerWalFramesize() argument
7733 assert( pPager->eState>=PAGER_READER ); in sqlite3PagerWalFramesize()
7734 return sqlite3WalFramesize(pPager->pWal); in sqlite3PagerWalFramesize()