Lines Matching refs:pWal

632   Wal *pWal,               /* The WAL context */  in walIndexPageRealloc()  argument
639 if( pWal->nWiData<=iPage ){ in walIndexPageRealloc()
642 apNew = (volatile u32 **)sqlite3Realloc((void *)pWal->apWiData, nByte); in walIndexPageRealloc()
647 memset((void*)&apNew[pWal->nWiData], 0, in walIndexPageRealloc()
648 sizeof(u32*)*(iPage+1-pWal->nWiData)); in walIndexPageRealloc()
649 pWal->apWiData = apNew; in walIndexPageRealloc()
650 pWal->nWiData = iPage+1; in walIndexPageRealloc()
654 assert( pWal->apWiData[iPage]==0 ); in walIndexPageRealloc()
655 if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){ in walIndexPageRealloc()
656 pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ); in walIndexPageRealloc()
657 if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM_BKPT; in walIndexPageRealloc()
659 rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ, in walIndexPageRealloc()
660 pWal->writeLock, (void volatile **)&pWal->apWiData[iPage] in walIndexPageRealloc()
662 assert( pWal->apWiData[iPage]!=0 in walIndexPageRealloc()
664 || (pWal->writeLock==0 && iPage==0) ); in walIndexPageRealloc()
665 testcase( pWal->apWiData[iPage]==0 && rc==SQLITE_OK ); in walIndexPageRealloc()
669 pWal->readOnly |= WAL_SHM_RDONLY; in walIndexPageRealloc()
676 *ppPage = pWal->apWiData[iPage]; in walIndexPageRealloc()
681 Wal *pWal, /* The WAL context */ in walIndexPage() argument
685 if( pWal->nWiData<=iPage || (*ppPage = pWal->apWiData[iPage])==0 ){ in walIndexPage()
686 return walIndexPageRealloc(pWal, iPage, ppPage); in walIndexPage()
694 static volatile WalCkptInfo *walCkptInfo(Wal *pWal){ in walCkptInfo() argument
695 assert( pWal->nWiData>0 && pWal->apWiData[0] ); in walCkptInfo()
696 return (volatile WalCkptInfo*)&(pWal->apWiData[0][sizeof(WalIndexHdr)/2]); in walCkptInfo()
702 static volatile WalIndexHdr *walIndexHdr(Wal *pWal){ in walIndexHdr() argument
703 assert( pWal->nWiData>0 && pWal->apWiData[0] ); in walIndexHdr()
704 return (volatile WalIndexHdr*)pWal->apWiData[0]; in walIndexHdr()
771 static void walShmBarrier(Wal *pWal){ in walShmBarrier() argument
772 if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){ in walShmBarrier()
773 sqlite3OsShmBarrier(pWal->pDbFd); in walShmBarrier()
795 static SQLITE_NO_TSAN void walIndexWriteHdr(Wal *pWal){ in walIndexWriteHdr() argument
796 volatile WalIndexHdr *aHdr = walIndexHdr(pWal); in walIndexWriteHdr()
799 assert( pWal->writeLock ); in walIndexWriteHdr()
800 pWal->hdr.isInit = 1; in walIndexWriteHdr()
801 pWal->hdr.iVersion = WALINDEX_MAX_VERSION; in walIndexWriteHdr()
802 walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum); in walIndexWriteHdr()
804 memcpy((void*)&aHdr[1], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); in walIndexWriteHdr()
805 walShmBarrier(pWal); in walIndexWriteHdr()
806 memcpy((void*)&aHdr[0], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); in walIndexWriteHdr()
823 Wal *pWal, /* The write-ahead log */ in walEncodeFrame() argument
830 u32 *aCksum = pWal->hdr.aFrameCksum; in walEncodeFrame()
834 if( pWal->iReCksum==0 ){ in walEncodeFrame()
835 memcpy(&aFrame[8], pWal->hdr.aSalt, 8); in walEncodeFrame()
837 nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); in walEncodeFrame()
839 walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); in walEncodeFrame()
854 Wal *pWal, /* The write-ahead log */ in walDecodeFrame() argument
861 u32 *aCksum = pWal->hdr.aFrameCksum; in walDecodeFrame()
868 if( memcmp(&pWal->hdr.aSalt, &aFrame[8], 8)!=0 ){ in walDecodeFrame()
884 nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); in walDecodeFrame()
886 walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); in walDecodeFrame()
932 static int walLockShared(Wal *pWal, int lockIdx){ in walLockShared() argument
934 if( pWal->exclusiveMode ) return SQLITE_OK; in walLockShared()
935 rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, in walLockShared()
937 WALTRACE(("WAL%p: acquire SHARED-%s %s\n", pWal, in walLockShared()
939 VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) in walLockShared()
942 static void walUnlockShared(Wal *pWal, int lockIdx){ in walUnlockShared() argument
943 if( pWal->exclusiveMode ) return; in walUnlockShared()
944 (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, in walUnlockShared()
946 WALTRACE(("WAL%p: release SHARED-%s\n", pWal, walLockName(lockIdx))); in walUnlockShared()
948 static int walLockExclusive(Wal *pWal, int lockIdx, int n){ in walLockExclusive() argument
950 if( pWal->exclusiveMode ) return SQLITE_OK; in walLockExclusive()
951 rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, in walLockExclusive()
953 WALTRACE(("WAL%p: acquire EXCLUSIVE-%s cnt=%d %s\n", pWal, in walLockExclusive()
955 VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) in walLockExclusive()
958 static void walUnlockExclusive(Wal *pWal, int lockIdx, int n){ in walUnlockExclusive() argument
959 if( pWal->exclusiveMode ) return; in walUnlockExclusive()
960 (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, in walUnlockExclusive()
962 WALTRACE(("WAL%p: release EXCLUSIVE-%s cnt=%d\n", pWal, in walUnlockExclusive()
1007 Wal *pWal, /* WAL handle */ in walHashGet() argument
1013 rc = walIndexPage(pWal, iHash, &pLoc->aPgno); in walHashGet()
1051 static u32 walFramePgno(Wal *pWal, u32 iFrame){ in walFramePgno() argument
1054 return pWal->apWiData[0][WALINDEX_HDR_SIZE/sizeof(u32) + iFrame - 1]; in walFramePgno()
1056 return pWal->apWiData[iHash][(iFrame-1-HASHTABLE_NPAGE_ONE)%HASHTABLE_NPAGE]; in walFramePgno()
1071 static void walCleanupHash(Wal *pWal){ in walCleanupHash() argument
1077 assert( pWal->writeLock ); in walCleanupHash()
1078 testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE-1 ); in walCleanupHash()
1079 testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE ); in walCleanupHash()
1080 testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE+1 ); in walCleanupHash()
1082 if( pWal->hdr.mxFrame==0 ) return; in walCleanupHash()
1088 assert( pWal->nWiData>walFramePage(pWal->hdr.mxFrame) ); in walCleanupHash()
1089 assert( pWal->apWiData[walFramePage(pWal->hdr.mxFrame)] ); in walCleanupHash()
1090 i = walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &sLoc); in walCleanupHash()
1096 iLimit = pWal->hdr.mxFrame - sLoc.iZero; in walCleanupHash()
1133 static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ in walIndexAppend() argument
1137 rc = walHashGet(pWal, walFramePage(iFrame), &sLoc); in walIndexAppend()
1166 walCleanupHash(pWal); in walIndexAppend()
1222 static int walIndexRecover(Wal *pWal){ in walIndexRecover() argument
1234 assert( pWal->ckptLock==1 || pWal->ckptLock==0 ); in walIndexRecover()
1237 assert( pWal->writeLock ); in walIndexRecover()
1238 iLock = WAL_ALL_BUT_WRITE + pWal->ckptLock; in walIndexRecover()
1239 rc = walLockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock); in walIndexRecover()
1244 WALTRACE(("WAL%p: recovery begin...\n", pWal)); in walIndexRecover()
1246 memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); in walIndexRecover()
1248 rc = sqlite3OsFileSize(pWal->pWalFd, &nSize); in walIndexRecover()
1267 rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0); in walIndexRecover()
1286 pWal->hdr.bigEndCksum = (u8)(magic&0x00000001); in walIndexRecover()
1287 pWal->szPage = szPage; in walIndexRecover()
1288 pWal->nCkpt = sqlite3Get4byte(&aBuf[12]); in walIndexRecover()
1289 memcpy(&pWal->hdr.aSalt, &aBuf[16], 8); in walIndexRecover()
1292 walChecksumBytes(pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN, in walIndexRecover()
1293 aBuf, WAL_HDRSIZE-2*4, 0, pWal->hdr.aFrameCksum in walIndexRecover()
1295 if( pWal->hdr.aFrameCksum[0]!=sqlite3Get4byte(&aBuf[24]) in walIndexRecover()
1296 || pWal->hdr.aFrameCksum[1]!=sqlite3Get4byte(&aBuf[28]) in walIndexRecover()
1327 rc = walIndexPage(pWal, iPg, (volatile u32**)&aShare); in walIndexRecover()
1330 pWal->apWiData[iPg] = aPrivate; in walIndexRecover()
1338 rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset); in walIndexRecover()
1340 isValid = walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame); in walIndexRecover()
1342 rc = walIndexAppend(pWal, iFrame, pgno); in walIndexRecover()
1347 pWal->hdr.mxFrame = iFrame; in walIndexRecover()
1348 pWal->hdr.nPage = nTruncate; in walIndexRecover()
1349 pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16)); in walIndexRecover()
1352 aFrameCksum[0] = pWal->hdr.aFrameCksum[0]; in walIndexRecover()
1353 aFrameCksum[1] = pWal->hdr.aFrameCksum[1]; in walIndexRecover()
1356 pWal->apWiData[iPg] = aShare; in walIndexRecover()
1397 pWal->hdr.aFrameCksum[0] = aFrameCksum[0]; in walIndexRecover()
1398 pWal->hdr.aFrameCksum[1] = aFrameCksum[1]; in walIndexRecover()
1399 walIndexWriteHdr(pWal); in walIndexRecover()
1405 pInfo = walCkptInfo(pWal); in walIndexRecover()
1407 pInfo->nBackfillAttempted = pWal->hdr.mxFrame; in walIndexRecover()
1410 rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1); in walIndexRecover()
1412 if( i==1 && pWal->hdr.mxFrame ){ in walIndexRecover()
1413 pInfo->aReadMark[i] = pWal->hdr.mxFrame; in walIndexRecover()
1417 walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); in walIndexRecover()
1428 if( pWal->hdr.nPage ){ in walIndexRecover()
1431 pWal->hdr.mxFrame, pWal->zWalName in walIndexRecover()
1437 WALTRACE(("WAL%p: recovery %s\n", pWal, rc ? "failed" : "ok")); in walIndexRecover()
1438 walUnlockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock); in walIndexRecover()
1445 static void walIndexClose(Wal *pWal, int isDelete){ in walIndexClose() argument
1446 if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE || pWal->bShmUnreliable ){ in walIndexClose()
1448 for(i=0; i<pWal->nWiData; i++){ in walIndexClose()
1449 sqlite3_free((void *)pWal->apWiData[i]); in walIndexClose()
1450 pWal->apWiData[i] = 0; in walIndexClose()
1453 if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){ in walIndexClose()
1454 sqlite3OsShmUnmap(pWal->pDbFd, isDelete); in walIndexClose()
1576 void sqlite3WalLimit(Wal *pWal, i64 iLimit){ in sqlite3WalLimit() argument
1577 if( pWal ) pWal->mxWalSize = iLimit; in sqlite3WalLimit()
1780 static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ in walIteratorInit() argument
1792 assert( pWal->ckptLock && pWal->hdr.mxFrame>0 ); in walIteratorInit()
1793 iLast = pWal->hdr.mxFrame; in walIteratorInit()
1820 rc = walHashGet(pWal, i, &sLoc); in walIteratorInit()
1861 static int walEnableBlocking(Wal *pWal){ in walEnableBlocking() argument
1863 if( pWal->db ){ in walEnableBlocking()
1864 int tmout = pWal->db->busyTimeout; in walEnableBlocking()
1868 pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout in walEnableBlocking()
1879 static void walDisableBlocking(Wal *pWal){ in walDisableBlocking() argument
1881 sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout); in walDisableBlocking()
1893 int sqlite3WalWriteLock(Wal *pWal, int bLock){ in sqlite3WalWriteLock() argument
1895 assert( pWal->readLock<0 || bLock==0 ); in sqlite3WalWriteLock()
1897 assert( pWal->db ); in sqlite3WalWriteLock()
1898 if( walEnableBlocking(pWal) ){ in sqlite3WalWriteLock()
1899 rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); in sqlite3WalWriteLock()
1901 pWal->writeLock = 1; in sqlite3WalWriteLock()
1903 walDisableBlocking(pWal); in sqlite3WalWriteLock()
1905 }else if( pWal->writeLock ){ in sqlite3WalWriteLock()
1906 walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); in sqlite3WalWriteLock()
1907 pWal->writeLock = 0; in sqlite3WalWriteLock()
1915 void sqlite3WalDb(Wal *pWal, sqlite3 *db){ in sqlite3WalDb() argument
1916 pWal->db = db; in sqlite3WalDb()
1922 static int walLockWriter(Wal *pWal){ in walLockWriter() argument
1924 walEnableBlocking(pWal); in walLockWriter()
1925 rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); in walLockWriter()
1926 walDisableBlocking(pWal); in walLockWriter()
1932 # define walLockWriter(pWal) walLockExclusive((pWal), WAL_WRITE_LOCK, 1) argument
1933 # define sqlite3WalDb(pWal, db) argument
1944 Wal *pWal, /* WAL connection */ in walBusyLock() argument
1952 rc = walLockExclusive(pWal, lockIdx, n); in walBusyLock()
1956 walDisableBlocking(pWal); in walBusyLock()
1967 static int walPagesize(Wal *pWal){ in walPagesize() argument
1968 return (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16); in walPagesize()
1988 static void walRestartHdr(Wal *pWal, u32 salt1){ in walRestartHdr() argument
1989 volatile WalCkptInfo *pInfo = walCkptInfo(pWal); in walRestartHdr()
1991 u32 *aSalt = pWal->hdr.aSalt; /* Big-endian salt values */ in walRestartHdr()
1992 pWal->nCkpt++; in walRestartHdr()
1993 pWal->hdr.mxFrame = 0; in walRestartHdr()
1995 memcpy(&pWal->hdr.aSalt[1], &salt1, 4); in walRestartHdr()
1996 walIndexWriteHdr(pWal); in walRestartHdr()
2036 Wal *pWal, /* Wal connection */ in walCheckpoint() argument
2054 szPage = walPagesize(pWal); in walCheckpoint()
2057 pInfo = walCkptInfo(pWal); in walCheckpoint()
2058 if( pInfo->nBackfill<pWal->hdr.mxFrame ){ in walCheckpoint()
2069 mxSafeFrame = pWal->hdr.mxFrame; in walCheckpoint()
2070 mxPage = pWal->hdr.nPage; in walCheckpoint()
2074 assert( y<=pWal->hdr.mxFrame ); in walCheckpoint()
2075 rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(i), 1); in walCheckpoint()
2079 walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); in walCheckpoint()
2091 rc = walIteratorInit(pWal, pInfo->nBackfill, &pIter); in walCheckpoint()
2096 && (rc = walBusyLock(pWal,xBusy,pBusyArg,WAL_READ_LOCK(0),1))==SQLITE_OK in walCheckpoint()
2103 rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); in walCheckpoint()
2111 sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_START, 0); in walCheckpoint()
2112 rc = sqlite3OsFileSize(pWal->pDbFd, &nSize); in walCheckpoint()
2114 if( (nSize+65536+(i64)pWal->hdr.mxFrame*szPage)<nReq ){ in walCheckpoint()
2121 sqlite3OsFileControlHint(pWal->pDbFd, SQLITE_FCNTL_SIZE_HINT,&nReq); in walCheckpoint()
2130 assert( walFramePgno(pWal, iFrame)==iDbpage ); in walCheckpoint()
2140 rc = sqlite3OsRead(pWal->pWalFd, zBuf, szPage, iOffset); in walCheckpoint()
2144 rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, iOffset); in walCheckpoint()
2147 sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_CKPT_DONE, 0); in walCheckpoint()
2151 if( mxSafeFrame==walIndexHdr(pWal)->mxFrame ){ in walCheckpoint()
2152 i64 szDb = pWal->hdr.nPage*(i64)szPage; in walCheckpoint()
2154 rc = sqlite3OsTruncate(pWal->pDbFd, szDb); in walCheckpoint()
2156 rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags)); in walCheckpoint()
2165 walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1); in walCheckpoint()
2181 assert( pWal->writeLock ); in walCheckpoint()
2182 if( pInfo->nBackfill<pWal->hdr.mxFrame ){ in walCheckpoint()
2187 assert( pInfo->nBackfill==pWal->hdr.mxFrame ); in walCheckpoint()
2188 rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(1), WAL_NREADER-1); in walCheckpoint()
2204 walRestartHdr(pWal, salt1); in walCheckpoint()
2205 rc = sqlite3OsTruncate(pWal->pWalFd, 0); in walCheckpoint()
2207 walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); in walCheckpoint()
2221 static void walLimitSize(Wal *pWal, i64 nMax){ in walLimitSize() argument
2225 rx = sqlite3OsFileSize(pWal->pWalFd, &sz); in walLimitSize()
2227 rx = sqlite3OsTruncate(pWal->pWalFd, nMax); in walLimitSize()
2231 sqlite3_log(rx, "cannot limit WAL size: %s", pWal->zWalName); in walLimitSize()
2239 Wal *pWal, /* Wal to close */ in sqlite3WalClose() argument
2246 if( pWal ){ in sqlite3WalClose()
2258 && SQLITE_OK==(rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE)) in sqlite3WalClose()
2260 if( pWal->exclusiveMode==WAL_NORMAL_MODE ){ in sqlite3WalClose()
2261 pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; in sqlite3WalClose()
2263 rc = sqlite3WalCheckpoint(pWal, db, in sqlite3WalClose()
2269 pWal->pDbFd, SQLITE_FCNTL_PERSIST_WAL, &bPersist in sqlite3WalClose()
2276 }else if( pWal->mxWalSize>=0 ){ in sqlite3WalClose()
2283 walLimitSize(pWal, 0); in sqlite3WalClose()
2288 walIndexClose(pWal, isDelete); in sqlite3WalClose()
2289 sqlite3OsClose(pWal->pWalFd); in sqlite3WalClose()
2292 sqlite3OsDelete(pWal->pVfs, pWal->zWalName, 0); in sqlite3WalClose()
2295 WALTRACE(("WAL%p: closed\n", pWal)); in sqlite3WalClose()
2296 sqlite3_free((void *)pWal->apWiData); in sqlite3WalClose()
2297 sqlite3_free(pWal); in sqlite3WalClose()
2319 static SQLITE_NO_TSAN int walIndexTryHdr(Wal *pWal, int *pChanged){ in walIndexTryHdr() argument
2325 assert( pWal->nWiData>0 && pWal->apWiData[0] ); in walIndexTryHdr()
2343 aHdr = walIndexHdr(pWal); in walIndexTryHdr()
2345 walShmBarrier(pWal); in walIndexTryHdr()
2359 if( memcmp(&pWal->hdr, &h1, sizeof(WalIndexHdr)) ){ in walIndexTryHdr()
2361 memcpy(&pWal->hdr, &h1, sizeof(WalIndexHdr)); in walIndexTryHdr()
2362 pWal->szPage = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16); in walIndexTryHdr()
2363 testcase( pWal->szPage<=32768 ); in walIndexTryHdr()
2364 testcase( pWal->szPage>=65536 ); in walIndexTryHdr()
2389 static int walIndexReadHdr(Wal *pWal, int *pChanged){ in walIndexReadHdr() argument
2398 rc = walIndexPage(pWal, 0, &page0); in walIndexReadHdr()
2409 assert( pWal->writeLock==0 ); in walIndexReadHdr()
2410 assert( pWal->readOnly & WAL_SHM_RDONLY ); in walIndexReadHdr()
2411 pWal->bShmUnreliable = 1; in walIndexReadHdr()
2412 pWal->exclusiveMode = WAL_HEAPMEMORY_MODE; in walIndexReadHdr()
2422 assert( page0!=0 || pWal->writeLock==0 ); in walIndexReadHdr()
2429 badHdr = (page0 ? walIndexTryHdr(pWal, pChanged) : 1); in walIndexReadHdr()
2435 if( pWal->bShmUnreliable==0 && (pWal->readOnly & WAL_SHM_RDONLY) ){ in walIndexReadHdr()
2436 if( SQLITE_OK==(rc = walLockShared(pWal, WAL_WRITE_LOCK)) ){ in walIndexReadHdr()
2437 walUnlockShared(pWal, WAL_WRITE_LOCK); in walIndexReadHdr()
2441 int bWriteLock = pWal->writeLock; in walIndexReadHdr()
2442 if( bWriteLock || SQLITE_OK==(rc = walLockWriter(pWal)) ){ in walIndexReadHdr()
2443 pWal->writeLock = 1; in walIndexReadHdr()
2444 if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){ in walIndexReadHdr()
2445 badHdr = walIndexTryHdr(pWal, pChanged); in walIndexReadHdr()
2451 rc = walIndexRecover(pWal); in walIndexReadHdr()
2456 pWal->writeLock = 0; in walIndexReadHdr()
2457 walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); in walIndexReadHdr()
2467 if( badHdr==0 && pWal->hdr.iVersion!=WALINDEX_MAX_VERSION ){ in walIndexReadHdr()
2470 if( pWal->bShmUnreliable ){ in walIndexReadHdr()
2472 walIndexClose(pWal, 0); in walIndexReadHdr()
2473 pWal->bShmUnreliable = 0; in walIndexReadHdr()
2474 assert( pWal->nWiData>0 && pWal->apWiData[0]==0 ); in walIndexReadHdr()
2480 pWal->exclusiveMode = WAL_NORMAL_MODE; in walIndexReadHdr()
2513 static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ in walBeginShmUnreliable() argument
2524 assert( pWal->bShmUnreliable ); in walBeginShmUnreliable()
2525 assert( pWal->readOnly & WAL_SHM_RDONLY ); in walBeginShmUnreliable()
2526 assert( pWal->nWiData>0 && pWal->apWiData[0] ); in walBeginShmUnreliable()
2531 rc = walLockShared(pWal, WAL_READ_LOCK(0)); in walBeginShmUnreliable()
2536 pWal->readLock = 0; in walBeginShmUnreliable()
2560 rc = sqlite3OsShmMap(pWal->pDbFd, 0, WALINDEX_PGSZ, 0, &pDummy); in walBeginShmUnreliable()
2571 memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); in walBeginShmUnreliable()
2576 rc = sqlite3OsFileSize(pWal->pWalFd, &szWal); in walBeginShmUnreliable()
2588 rc = (pWal->hdr.mxFrame==0 ? SQLITE_OK : WAL_RETRY); in walBeginShmUnreliable()
2593 rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0); in walBeginShmUnreliable()
2597 if( memcmp(&pWal->hdr.aSalt, &aBuf[16], 8) ){ in walBeginShmUnreliable()
2606 assert( (pWal->szPage & (pWal->szPage-1))==0 ); in walBeginShmUnreliable()
2607 assert( pWal->szPage>=512 && pWal->szPage<=65536 ); in walBeginShmUnreliable()
2608 szFrame = pWal->szPage + WAL_FRAME_HDRSIZE; in walBeginShmUnreliable()
2620 aSaveCksum[0] = pWal->hdr.aFrameCksum[0]; in walBeginShmUnreliable()
2621 aSaveCksum[1] = pWal->hdr.aFrameCksum[1]; in walBeginShmUnreliable()
2622 for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->szPage); in walBeginShmUnreliable()
2630 rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset); in walBeginShmUnreliable()
2632 if( !walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame) ) break; in walBeginShmUnreliable()
2642 pWal->hdr.aFrameCksum[0] = aSaveCksum[0]; in walBeginShmUnreliable()
2643 pWal->hdr.aFrameCksum[1] = aSaveCksum[1]; in walBeginShmUnreliable()
2649 for(i=0; i<pWal->nWiData; i++){ in walBeginShmUnreliable()
2650 sqlite3_free((void*)pWal->apWiData[i]); in walBeginShmUnreliable()
2651 pWal->apWiData[i] = 0; in walBeginShmUnreliable()
2653 pWal->bShmUnreliable = 0; in walBeginShmUnreliable()
2654 sqlite3WalEndReadTransaction(pWal); in walBeginShmUnreliable()
2710 static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ in walTryBeginRead() argument
2718 assert( pWal->readLock<0 ); /* Not currently locked */ in walTryBeginRead()
2721 assert( (pWal->readOnly & WAL_SHM_RDONLY)==0 || useWal==0 ); in walTryBeginRead()
2743 VVA_ONLY( pWal->lockError = 1; ) in walTryBeginRead()
2747 sqlite3OsSleep(pWal->pVfs, nDelay); in walTryBeginRead()
2752 if( pWal->bShmUnreliable==0 ){ in walTryBeginRead()
2753 rc = walIndexReadHdr(pWal, pChanged); in walTryBeginRead()
2764 if( pWal->apWiData[0]==0 ){ in walTryBeginRead()
2773 }else if( SQLITE_OK==(rc = walLockShared(pWal, WAL_RECOVER_LOCK)) ){ in walTryBeginRead()
2774 walUnlockShared(pWal, WAL_RECOVER_LOCK); in walTryBeginRead()
2783 else if( pWal->bShmUnreliable ){ in walTryBeginRead()
2784 return walBeginShmUnreliable(pWal, pChanged); in walTryBeginRead()
2788 assert( pWal->nWiData>0 ); in walTryBeginRead()
2789 assert( pWal->apWiData[0]!=0 ); in walTryBeginRead()
2790 pInfo = walCkptInfo(pWal); in walTryBeginRead()
2791 if( !useWal && AtomicLoad(&pInfo->nBackfill)==pWal->hdr.mxFrame in walTryBeginRead()
2793 && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0) in walTryBeginRead()
2799 rc = walLockShared(pWal, WAL_READ_LOCK(0)); in walTryBeginRead()
2800 walShmBarrier(pWal); in walTryBeginRead()
2802 if( memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) ){ in walTryBeginRead()
2816 walUnlockShared(pWal, WAL_READ_LOCK(0)); in walTryBeginRead()
2819 pWal->readLock = 0; in walTryBeginRead()
2833 mxFrame = pWal->hdr.mxFrame; in walTryBeginRead()
2835 if( pWal->pSnapshot && pWal->pSnapshot->mxFrame<mxFrame ){ in walTryBeginRead()
2836 mxFrame = pWal->pSnapshot->mxFrame; in walTryBeginRead()
2847 if( (pWal->readOnly & WAL_SHM_RDONLY)==0 in walTryBeginRead()
2851 rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1); in walTryBeginRead()
2856 walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); in walTryBeginRead()
2864 assert( rc==SQLITE_BUSY || (pWal->readOnly & WAL_SHM_RDONLY)!=0 ); in walTryBeginRead()
2868 rc = walLockShared(pWal, WAL_READ_LOCK(mxI)); in walTryBeginRead()
2906 pWal->minFrame = AtomicLoad(&pInfo->nBackfill)+1; in walTryBeginRead()
2907 walShmBarrier(pWal); in walTryBeginRead()
2909 || memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) in walTryBeginRead()
2911 walUnlockShared(pWal, WAL_READ_LOCK(mxI)); in walTryBeginRead()
2914 assert( mxReadMark<=pWal->hdr.mxFrame ); in walTryBeginRead()
2915 pWal->readLock = (i16)mxI; in walTryBeginRead()
2940 int sqlite3WalSnapshotRecover(Wal *pWal){ in sqlite3WalSnapshotRecover() argument
2943 assert( pWal->readLock>=0 ); in sqlite3WalSnapshotRecover()
2944 rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); in sqlite3WalSnapshotRecover()
2946 volatile WalCkptInfo *pInfo = walCkptInfo(pWal); in sqlite3WalSnapshotRecover()
2947 int szPage = (int)pWal->szPage; in sqlite3WalSnapshotRecover()
2950 rc = sqlite3OsFileSize(pWal->pDbFd, &szDb); in sqlite3WalSnapshotRecover()
2964 rc = walHashGet(pWal, walFramePage(i), &sLoc); in sqlite3WalSnapshotRecover()
2972 rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff); in sqlite3WalSnapshotRecover()
2975 rc = sqlite3OsRead(pWal->pDbFd, pBuf2, szPage, iDbOff); in sqlite3WalSnapshotRecover()
2990 walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); in sqlite3WalSnapshotRecover()
3011 int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ in sqlite3WalBeginReadTransaction() argument
3016 WalIndexHdr *pSnapshot = pWal->pSnapshot; in sqlite3WalBeginReadTransaction()
3019 assert( pWal->ckptLock==0 ); in sqlite3WalBeginReadTransaction()
3023 if( memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ in sqlite3WalBeginReadTransaction()
3035 (void)walEnableBlocking(pWal); in sqlite3WalBeginReadTransaction()
3036 rc = walLockShared(pWal, WAL_CKPT_LOCK); in sqlite3WalBeginReadTransaction()
3037 walDisableBlocking(pWal); in sqlite3WalBeginReadTransaction()
3042 pWal->ckptLock = 1; in sqlite3WalBeginReadTransaction()
3047 rc = walTryBeginRead(pWal, pChanged, 0, ++cnt); in sqlite3WalBeginReadTransaction()
3056 if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ in sqlite3WalBeginReadTransaction()
3070 volatile WalCkptInfo *pInfo = walCkptInfo(pWal); in sqlite3WalBeginReadTransaction()
3072 assert( pWal->readLock>0 || pWal->hdr.mxFrame==0 ); in sqlite3WalBeginReadTransaction()
3073 assert( pInfo->aReadMark[pWal->readLock]<=pSnapshot->mxFrame ); in sqlite3WalBeginReadTransaction()
3081 if( !memcmp(pSnapshot->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) in sqlite3WalBeginReadTransaction()
3084 assert( pWal->readLock>0 ); in sqlite3WalBeginReadTransaction()
3085 memcpy(&pWal->hdr, pSnapshot, sizeof(WalIndexHdr)); in sqlite3WalBeginReadTransaction()
3097 pWal->minFrame = 1; in sqlite3WalBeginReadTransaction()
3100 sqlite3WalEndReadTransaction(pWal); in sqlite3WalBeginReadTransaction()
3106 if( pWal->ckptLock ){ in sqlite3WalBeginReadTransaction()
3108 walUnlockShared(pWal, WAL_CKPT_LOCK); in sqlite3WalBeginReadTransaction()
3109 pWal->ckptLock = 0; in sqlite3WalBeginReadTransaction()
3119 void sqlite3WalEndReadTransaction(Wal *pWal){ in sqlite3WalEndReadTransaction() argument
3120 sqlite3WalEndWriteTransaction(pWal); in sqlite3WalEndReadTransaction()
3121 if( pWal->readLock>=0 ){ in sqlite3WalEndReadTransaction()
3122 walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); in sqlite3WalEndReadTransaction()
3123 pWal->readLock = -1; in sqlite3WalEndReadTransaction()
3136 Wal *pWal, /* WAL handle */ in sqlite3WalFindFrame() argument
3141 u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */ in sqlite3WalFindFrame()
3146 assert( pWal->readLock>=0 || pWal->lockError ); in sqlite3WalFindFrame()
3154 if( iLast==0 || (pWal->readLock==0 && pWal->bShmUnreliable==0) ){ in sqlite3WalFindFrame()
3184 iMinHash = walFramePage(pWal->minFrame); in sqlite3WalFindFrame()
3192 rc = walHashGet(pWal, iHash, &sLoc); in sqlite3WalFindFrame()
3200 if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH-1]==pgno ){ in sqlite3WalFindFrame()
3219 assert( pWal->bShmUnreliable || pWal->minFrame>0 ); in sqlite3WalFindFrame()
3220 for(iTest=iLast; iTest>=pWal->minFrame && iTest>0; iTest--){ in sqlite3WalFindFrame()
3221 if( walFramePgno(pWal, iTest)==pgno ){ in sqlite3WalFindFrame()
3240 Wal *pWal, /* WAL handle */ in sqlite3WalReadFrame() argument
3247 sz = pWal->hdr.szPage; in sqlite3WalReadFrame()
3253 return sqlite3OsRead(pWal->pWalFd, pOut, (nOut>sz ? sz : nOut), iOffset); in sqlite3WalReadFrame()
3259 Pgno sqlite3WalDbsize(Wal *pWal){ in sqlite3WalDbsize() argument
3260 if( pWal && ALWAYS(pWal->readLock>=0) ){ in sqlite3WalDbsize()
3261 return pWal->hdr.nPage; in sqlite3WalDbsize()
3280 int sqlite3WalBeginWriteTransaction(Wal *pWal){ in sqlite3WalBeginWriteTransaction() argument
3287 if( pWal->writeLock ){ in sqlite3WalBeginWriteTransaction()
3288 assert( !memcmp(&pWal->hdr,(void *)walIndexHdr(pWal),sizeof(WalIndexHdr)) ); in sqlite3WalBeginWriteTransaction()
3295 assert( pWal->readLock>=0 ); in sqlite3WalBeginWriteTransaction()
3296 assert( pWal->writeLock==0 && pWal->iReCksum==0 ); in sqlite3WalBeginWriteTransaction()
3298 if( pWal->readOnly ){ in sqlite3WalBeginWriteTransaction()
3305 rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); in sqlite3WalBeginWriteTransaction()
3309 pWal->writeLock = 1; in sqlite3WalBeginWriteTransaction()
3315 if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){ in sqlite3WalBeginWriteTransaction()
3316 walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); in sqlite3WalBeginWriteTransaction()
3317 pWal->writeLock = 0; in sqlite3WalBeginWriteTransaction()
3328 int sqlite3WalEndWriteTransaction(Wal *pWal){ in sqlite3WalEndWriteTransaction() argument
3329 if( pWal->writeLock ){ in sqlite3WalEndWriteTransaction()
3330 walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); in sqlite3WalEndWriteTransaction()
3331 pWal->writeLock = 0; in sqlite3WalEndWriteTransaction()
3332 pWal->iReCksum = 0; in sqlite3WalEndWriteTransaction()
3333 pWal->truncateOnCommit = 0; in sqlite3WalEndWriteTransaction()
3350 int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){ in sqlite3WalUndo() argument
3352 if( ALWAYS(pWal->writeLock) ){ in sqlite3WalUndo()
3353 Pgno iMax = pWal->hdr.mxFrame; in sqlite3WalUndo()
3359 memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr)); in sqlite3WalUndo()
3361 for(iFrame=pWal->hdr.mxFrame+1; in sqlite3WalUndo()
3376 assert( walFramePgno(pWal, iFrame)!=1 ); in sqlite3WalUndo()
3377 rc = xUndo(pUndoCtx, walFramePgno(pWal, iFrame)); in sqlite3WalUndo()
3379 if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal); in sqlite3WalUndo()
3390 void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){ in sqlite3WalSavepoint() argument
3391 assert( pWal->writeLock ); in sqlite3WalSavepoint()
3392 aWalData[0] = pWal->hdr.mxFrame; in sqlite3WalSavepoint()
3393 aWalData[1] = pWal->hdr.aFrameCksum[0]; in sqlite3WalSavepoint()
3394 aWalData[2] = pWal->hdr.aFrameCksum[1]; in sqlite3WalSavepoint()
3395 aWalData[3] = pWal->nCkpt; in sqlite3WalSavepoint()
3404 int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ in sqlite3WalSavepointUndo() argument
3407 assert( pWal->writeLock ); in sqlite3WalSavepointUndo()
3408 assert( aWalData[3]!=pWal->nCkpt || aWalData[0]<=pWal->hdr.mxFrame ); in sqlite3WalSavepointUndo()
3410 if( aWalData[3]!=pWal->nCkpt ){ in sqlite3WalSavepointUndo()
3416 aWalData[3] = pWal->nCkpt; in sqlite3WalSavepointUndo()
3419 if( aWalData[0]<pWal->hdr.mxFrame ){ in sqlite3WalSavepointUndo()
3420 pWal->hdr.mxFrame = aWalData[0]; in sqlite3WalSavepointUndo()
3421 pWal->hdr.aFrameCksum[0] = aWalData[1]; in sqlite3WalSavepointUndo()
3422 pWal->hdr.aFrameCksum[1] = aWalData[2]; in sqlite3WalSavepointUndo()
3423 walCleanupHash(pWal); in sqlite3WalSavepointUndo()
3441 static int walRestartLog(Wal *pWal){ in walRestartLog() argument
3445 if( pWal->readLock==0 ){ in walRestartLog()
3446 volatile WalCkptInfo *pInfo = walCkptInfo(pWal); in walRestartLog()
3447 assert( pInfo->nBackfill==pWal->hdr.mxFrame ); in walRestartLog()
3451 rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); in walRestartLog()
3462 walRestartHdr(pWal, salt1); in walRestartLog()
3463 walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); in walRestartLog()
3468 walUnlockShared(pWal, WAL_READ_LOCK(0)); in walRestartLog()
3469 pWal->readLock = -1; in walRestartLog()
3473 rc = walTryBeginRead(pWal, &notUsed, 1, ++cnt); in walRestartLog()
3489 Wal *pWal; /* The complete WAL information */ member
3539 walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame); in walWriteOneFrame()
3555 static int walRewriteChecksums(Wal *pWal, u32 iLast){ in walRewriteChecksums() argument
3556 const int szPage = pWal->szPage;/* Database page size */ in walRewriteChecksums()
3571 assert( pWal->iReCksum>0 ); in walRewriteChecksums()
3572 if( pWal->iReCksum==1 ){ in walRewriteChecksums()
3575 iCksumOff = walFrameOffset(pWal->iReCksum-1, szPage) + 16; in walRewriteChecksums()
3577 rc = sqlite3OsRead(pWal->pWalFd, aBuf, sizeof(u32)*2, iCksumOff); in walRewriteChecksums()
3578 pWal->hdr.aFrameCksum[0] = sqlite3Get4byte(aBuf); in walRewriteChecksums()
3579 pWal->hdr.aFrameCksum[1] = sqlite3Get4byte(&aBuf[sizeof(u32)]); in walRewriteChecksums()
3581 iRead = pWal->iReCksum; in walRewriteChecksums()
3582 pWal->iReCksum = 0; in walRewriteChecksums()
3585 rc = sqlite3OsRead(pWal->pWalFd, aBuf, szPage+WAL_FRAME_HDRSIZE, iOff); in walRewriteChecksums()
3591 walEncodeFrame(pWal, iPgno, nDbSize, &aBuf[WAL_FRAME_HDRSIZE], aFrame); in walRewriteChecksums()
3592 rc = sqlite3OsWrite(pWal->pWalFd, aFrame, sizeof(aFrame), iOff); in walRewriteChecksums()
3605 Wal *pWal, /* Wal handle to write to */ in sqlite3WalFrames() argument
3624 assert( pWal->writeLock ); in sqlite3WalFrames()
3633 pWal, cnt, pWal->hdr.mxFrame, isCommit ? "Commit" : "Spill")); in sqlite3WalFrames()
3637 pLive = (WalIndexHdr*)walIndexHdr(pWal); in sqlite3WalFrames()
3638 if( memcmp(&pWal->hdr, (void *)pLive, sizeof(WalIndexHdr))!=0 ){ in sqlite3WalFrames()
3645 if( SQLITE_OK!=(rc = walRestartLog(pWal)) ){ in sqlite3WalFrames()
3653 iFrame = pWal->hdr.mxFrame; in sqlite3WalFrames()
3661 sqlite3Put4byte(&aWalHdr[12], pWal->nCkpt); in sqlite3WalFrames()
3662 if( pWal->nCkpt==0 ) sqlite3_randomness(8, pWal->hdr.aSalt); in sqlite3WalFrames()
3663 memcpy(&aWalHdr[16], pWal->hdr.aSalt, 8); in sqlite3WalFrames()
3668 pWal->szPage = szPage; in sqlite3WalFrames()
3669 pWal->hdr.bigEndCksum = SQLITE_BIGENDIAN; in sqlite3WalFrames()
3670 pWal->hdr.aFrameCksum[0] = aCksum[0]; in sqlite3WalFrames()
3671 pWal->hdr.aFrameCksum[1] = aCksum[1]; in sqlite3WalFrames()
3672 pWal->truncateOnCommit = 1; in sqlite3WalFrames()
3674 rc = sqlite3OsWrite(pWal->pWalFd, aWalHdr, sizeof(aWalHdr), 0); in sqlite3WalFrames()
3675 WALTRACE(("WAL%p: wal-header write %s\n", pWal, rc ? "failed" : "ok")); in sqlite3WalFrames()
3687 if( pWal->syncHeader ){ in sqlite3WalFrames()
3688 rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); in sqlite3WalFrames()
3692 assert( (int)pWal->szPage==szPage ); in sqlite3WalFrames()
3695 w.pWal = pWal; in sqlite3WalFrames()
3696 w.pFd = pWal->pWalFd; in sqlite3WalFrames()
3713 VVA_ONLY(rc =) sqlite3WalFindFrame(pWal, p->pgno, &iWrite); in sqlite3WalFrames()
3718 if( pWal->iReCksum==0 || iWrite<pWal->iReCksum ){ in sqlite3WalFrames()
3719 pWal->iReCksum = iWrite; in sqlite3WalFrames()
3722 rc = sqlite3OsWrite(pWal->pWalFd, pData, szPage, iOff); in sqlite3WalFrames()
3740 if( isCommit && pWal->iReCksum ){ in sqlite3WalFrames()
3741 rc = walRewriteChecksums(pWal, iFrame); in sqlite3WalFrames()
3761 if( pWal->padToSectorBoundary ){ in sqlite3WalFrames()
3762 int sectorSize = sqlite3SectorSize(pWal->pWalFd); in sqlite3WalFrames()
3784 if( isCommit && pWal->truncateOnCommit && pWal->mxWalSize>=0 ){ in sqlite3WalFrames()
3785 i64 sz = pWal->mxWalSize; in sqlite3WalFrames()
3786 if( walFrameOffset(iFrame+nExtra+1, szPage)>pWal->mxWalSize ){ in sqlite3WalFrames()
3789 walLimitSize(pWal, sz); in sqlite3WalFrames()
3790 pWal->truncateOnCommit = 0; in sqlite3WalFrames()
3798 iFrame = pWal->hdr.mxFrame; in sqlite3WalFrames()
3802 rc = walIndexAppend(pWal, iFrame, p->pgno); in sqlite3WalFrames()
3808 rc = walIndexAppend(pWal, iFrame, pLast->pgno); in sqlite3WalFrames()
3813 pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16)); in sqlite3WalFrames()
3816 pWal->hdr.mxFrame = iFrame; in sqlite3WalFrames()
3818 pWal->hdr.iChange++; in sqlite3WalFrames()
3819 pWal->hdr.nPage = nTruncate; in sqlite3WalFrames()
3823 walIndexWriteHdr(pWal); in sqlite3WalFrames()
3824 pWal->iCallback = iFrame; in sqlite3WalFrames()
3828 WALTRACE(("WAL%p: frame write %s\n", pWal, rc ? "failed" : "ok")); in sqlite3WalFrames()
3843 Wal *pWal, /* Wal connection */ in sqlite3WalCheckpoint() argument
3859 assert( pWal->ckptLock==0 ); in sqlite3WalCheckpoint()
3860 assert( pWal->writeLock==0 ); in sqlite3WalCheckpoint()
3866 if( pWal->readOnly ) return SQLITE_READONLY; in sqlite3WalCheckpoint()
3867 WALTRACE(("WAL%p: checkpoint begins\n", pWal)); in sqlite3WalCheckpoint()
3871 sqlite3WalDb(pWal, db); in sqlite3WalCheckpoint()
3872 (void)walEnableBlocking(pWal); in sqlite3WalCheckpoint()
3882 rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); in sqlite3WalCheckpoint()
3886 pWal->ckptLock = 1; in sqlite3WalCheckpoint()
3898 rc = walBusyLock(pWal, xBusy2, pBusyArg, WAL_WRITE_LOCK, 1); in sqlite3WalCheckpoint()
3900 pWal->writeLock = 1; in sqlite3WalCheckpoint()
3912 walDisableBlocking(pWal); in sqlite3WalCheckpoint()
3913 rc = walIndexReadHdr(pWal, &isChanged); in sqlite3WalCheckpoint()
3914 (void)walEnableBlocking(pWal); in sqlite3WalCheckpoint()
3915 if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ in sqlite3WalCheckpoint()
3916 sqlite3OsUnfetch(pWal->pDbFd, 0, 0); in sqlite3WalCheckpoint()
3923 if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ in sqlite3WalCheckpoint()
3926 rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); in sqlite3WalCheckpoint()
3931 if( pnLog ) *pnLog = (int)pWal->hdr.mxFrame; in sqlite3WalCheckpoint()
3932 if( pnCkpt ) *pnCkpt = (int)(walCkptInfo(pWal)->nBackfill); in sqlite3WalCheckpoint()
3943 memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); in sqlite3WalCheckpoint()
3946 walDisableBlocking(pWal); in sqlite3WalCheckpoint()
3947 sqlite3WalDb(pWal, 0); in sqlite3WalCheckpoint()
3950 sqlite3WalEndWriteTransaction(pWal); in sqlite3WalCheckpoint()
3951 if( pWal->ckptLock ){ in sqlite3WalCheckpoint()
3952 walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); in sqlite3WalCheckpoint()
3953 pWal->ckptLock = 0; in sqlite3WalCheckpoint()
3955 WALTRACE(("WAL%p: checkpoint %s\n", pWal, rc ? "failed" : "ok")); in sqlite3WalCheckpoint()
3967 int sqlite3WalCallback(Wal *pWal){ in sqlite3WalCallback() argument
3969 if( pWal ){ in sqlite3WalCallback()
3970 ret = pWal->iCallback; in sqlite3WalCallback()
3971 pWal->iCallback = 0; in sqlite3WalCallback()
4000 int sqlite3WalExclusiveMode(Wal *pWal, int op){ in sqlite3WalExclusiveMode() argument
4002 assert( pWal->writeLock==0 ); in sqlite3WalExclusiveMode()
4003 assert( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE || op==-1 ); in sqlite3WalExclusiveMode()
4011 assert( pWal->readLock>=0 || pWal->lockError ); in sqlite3WalExclusiveMode()
4012 assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) ); in sqlite3WalExclusiveMode()
4015 if( pWal->exclusiveMode!=WAL_NORMAL_MODE ){ in sqlite3WalExclusiveMode()
4016 pWal->exclusiveMode = WAL_NORMAL_MODE; in sqlite3WalExclusiveMode()
4017 if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){ in sqlite3WalExclusiveMode()
4018 pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; in sqlite3WalExclusiveMode()
4020 rc = pWal->exclusiveMode==WAL_NORMAL_MODE; in sqlite3WalExclusiveMode()
4026 assert( pWal->exclusiveMode==WAL_NORMAL_MODE ); in sqlite3WalExclusiveMode()
4027 assert( pWal->readLock>=0 ); in sqlite3WalExclusiveMode()
4028 walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); in sqlite3WalExclusiveMode()
4029 pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; in sqlite3WalExclusiveMode()
4032 rc = pWal->exclusiveMode==WAL_NORMAL_MODE; in sqlite3WalExclusiveMode()
4042 int sqlite3WalHeapMemory(Wal *pWal){ in sqlite3WalHeapMemory() argument
4043 return (pWal && pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ); in sqlite3WalHeapMemory()
4051 int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot){ in sqlite3WalSnapshotGet() argument
4056 assert( pWal->readLock>=0 && pWal->writeLock==0 ); in sqlite3WalSnapshotGet()
4058 if( memcmp(&pWal->hdr.aFrameCksum[0],aZero,16)==0 ){ in sqlite3WalSnapshotGet()
4066 memcpy(pRet, &pWal->hdr, sizeof(WalIndexHdr)); in sqlite3WalSnapshotGet()
4076 Wal *pWal, in sqlite3WalSnapshotOpen() argument
4079 pWal->pSnapshot = (WalIndexHdr*)pSnapshot; in sqlite3WalSnapshotOpen()
4110 int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot){ in sqlite3WalSnapshotCheck() argument
4112 rc = walLockShared(pWal, WAL_CKPT_LOCK); in sqlite3WalSnapshotCheck()
4115 if( memcmp(pNew->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) in sqlite3WalSnapshotCheck()
4116 || pNew->mxFrame<walCkptInfo(pWal)->nBackfillAttempted in sqlite3WalSnapshotCheck()
4119 walUnlockShared(pWal, WAL_CKPT_LOCK); in sqlite3WalSnapshotCheck()
4129 void sqlite3WalSnapshotUnlock(Wal *pWal){ in sqlite3WalSnapshotUnlock() argument
4130 assert( pWal ); in sqlite3WalSnapshotUnlock()
4131 walUnlockShared(pWal, WAL_CKPT_LOCK); in sqlite3WalSnapshotUnlock()
4143 int sqlite3WalFramesize(Wal *pWal){ in sqlite3WalFramesize() argument
4144 assert( pWal==0 || pWal->readLock>=0 ); in sqlite3WalFramesize()
4145 return (pWal ? pWal->szPage : 0); in sqlite3WalFramesize()
4151 sqlite3_file *sqlite3WalFile(Wal *pWal){ in sqlite3WalFile() argument
4152 return pWal->pWalFd; in sqlite3WalFile()