| OLD | NEW |
| 1 /* | 1 /* |
| 2 ** 2001 September 15 | 2 ** 2001 September 15 |
| 3 ** | 3 ** |
| 4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
| 5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
| 6 ** | 6 ** |
| 7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
| 8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
| 9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
| 10 ** | 10 ** |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 ** first 100 bytes of the database file. | 68 ** first 100 bytes of the database file. |
| 69 ** | 69 ** |
| 70 ** (5) All writes to the database file are synced prior to the rollback journal | 70 ** (5) All writes to the database file are synced prior to the rollback journal |
| 71 ** being deleted, truncated, or zeroed. | 71 ** being deleted, truncated, or zeroed. |
| 72 ** | 72 ** |
| 73 ** (6) If a master journal file is used, then all writes to the database file | 73 ** (6) If a master journal file is used, then all writes to the database file |
| 74 ** are synced prior to the master journal being deleted. | 74 ** are synced prior to the master journal being deleted. |
| 75 ** | 75 ** |
| 76 ** Definition: Two databases (or the same database at two points it time) | 76 ** Definition: Two databases (or the same database at two points it time) |
| 77 ** are said to be "logically equivalent" if they give the same answer to | 77 ** are said to be "logically equivalent" if they give the same answer to |
| 78 ** all queries. Note in particular the the content of freelist leaf | 78 ** all queries. Note in particular the content of freelist leaf |
| 79 ** pages can be changed arbitarily without effecting the logical equivalence | 79 ** pages can be changed arbitrarily without affecting the logical equivalence |
| 80 ** of the database. | 80 ** of the database. |
| 81 ** | 81 ** |
| 82 ** (7) At any time, if any subset, including the empty set and the total set, | 82 ** (7) At any time, if any subset, including the empty set and the total set, |
| 83 ** of the unsynced changes to a rollback journal are removed and the | 83 ** of the unsynced changes to a rollback journal are removed and the |
| 84 ** journal is rolled back, the resulting database file will be logical | 84 ** journal is rolled back, the resulting database file will be logically |
| 85 ** equivalent to the database file at the beginning of the transaction. | 85 ** equivalent to the database file at the beginning of the transaction. |
| 86 ** | 86 ** |
| 87 ** (8) When a transaction is rolled back, the xTruncate method of the VFS | 87 ** (8) When a transaction is rolled back, the xTruncate method of the VFS |
| 88 ** is called to restore the database file to the same size it was at | 88 ** is called to restore the database file to the same size it was at |
| 89 ** the beginning of the transaction. (In some VFSes, the xTruncate | 89 ** the beginning of the transaction. (In some VFSes, the xTruncate |
| 90 ** method is a no-op, but that does not change the fact the SQLite will | 90 ** method is a no-op, but that does not change the fact the SQLite will |
| 91 ** invoke it.) | 91 ** invoke it.) |
| 92 ** | 92 ** |
| 93 ** (9) Whenever the database file is modified, at least one bit in the range | 93 ** (9) Whenever the database file is modified, at least one bit in the range |
| 94 ** of bytes from 24 through 39 inclusive will be changed prior to releasing | 94 ** of bytes from 24 through 39 inclusive will be changed prior to releasing |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 ** A rollback-mode pager changes to WRITER_FINISHED state from WRITER_DBMOD | 266 ** A rollback-mode pager changes to WRITER_FINISHED state from WRITER_DBMOD |
| 267 ** state after the entire transaction has been successfully written into the | 267 ** state after the entire transaction has been successfully written into the |
| 268 ** database file. In this state the transaction may be committed simply | 268 ** database file. In this state the transaction may be committed simply |
| 269 ** by finalizing the journal file. Once in WRITER_FINISHED state, it is | 269 ** by finalizing the journal file. Once in WRITER_FINISHED state, it is |
| 270 ** not possible to modify the database further. At this point, the upper | 270 ** not possible to modify the database further. At this point, the upper |
| 271 ** layer must either commit or rollback the transaction. | 271 ** layer must either commit or rollback the transaction. |
| 272 ** | 272 ** |
| 273 ** * A write transaction is active. | 273 ** * A write transaction is active. |
| 274 ** * An EXCLUSIVE or greater lock is held on the database file. | 274 ** * An EXCLUSIVE or greater lock is held on the database file. |
| 275 ** * All writing and syncing of journal and database data has finished. | 275 ** * All writing and syncing of journal and database data has finished. |
| 276 ** If no error occured, all that remains is to finalize the journal to | 276 ** If no error occurred, all that remains is to finalize the journal to |
| 277 ** commit the transaction. If an error did occur, the caller will need | 277 ** commit the transaction. If an error did occur, the caller will need |
| 278 ** to rollback the transaction. | 278 ** to rollback the transaction. |
| 279 ** | 279 ** |
| 280 ** ERROR: | 280 ** ERROR: |
| 281 ** | 281 ** |
| 282 ** The ERROR state is entered when an IO or disk-full error (including | 282 ** The ERROR state is entered when an IO or disk-full error (including |
| 283 ** SQLITE_IOERR_NOMEM) occurs at a point in the code that makes it | 283 ** SQLITE_IOERR_NOMEM) occurs at a point in the code that makes it |
| 284 ** difficult to be sure that the in-memory pager state (cache contents, | 284 ** difficult to be sure that the in-memory pager state (cache contents, |
| 285 ** db size etc.) are consistent with the contents of the file-system. | 285 ** db size etc.) are consistent with the contents of the file-system. |
| 286 ** | 286 ** |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 ** VFS call is successful. This way, the Pager.eLock variable may be set | 371 ** VFS call is successful. This way, the Pager.eLock variable may be set |
| 372 ** to a less exclusive (lower) value than the lock that is actually held | 372 ** to a less exclusive (lower) value than the lock that is actually held |
| 373 ** at the system level, but it is never set to a more exclusive value. | 373 ** at the system level, but it is never set to a more exclusive value. |
| 374 ** | 374 ** |
| 375 ** This is usually safe. If an xUnlock fails or appears to fail, there may | 375 ** This is usually safe. If an xUnlock fails or appears to fail, there may |
| 376 ** be a few redundant xLock() calls or a lock may be held for longer than | 376 ** be a few redundant xLock() calls or a lock may be held for longer than |
| 377 ** required, but nothing really goes wrong. | 377 ** required, but nothing really goes wrong. |
| 378 ** | 378 ** |
| 379 ** The exception is when the database file is unlocked as the pager moves | 379 ** The exception is when the database file is unlocked as the pager moves |
| 380 ** from ERROR to OPEN state. At this point there may be a hot-journal file | 380 ** from ERROR to OPEN state. At this point there may be a hot-journal file |
| 381 ** in the file-system that needs to be rolled back (as part of a OPEN->SHARED | 381 ** in the file-system that needs to be rolled back (as part of an OPEN->SHARED |
| 382 ** transition, by the same pager or any other). If the call to xUnlock() | 382 ** transition, by the same pager or any other). If the call to xUnlock() |
| 383 ** fails at this point and the pager is left holding an EXCLUSIVE lock, this | 383 ** fails at this point and the pager is left holding an EXCLUSIVE lock, this |
| 384 ** can confuse the call to xCheckReservedLock() call made later as part | 384 ** can confuse the call to xCheckReservedLock() call made later as part |
| 385 ** of hot-journal detection. | 385 ** of hot-journal detection. |
| 386 ** | 386 ** |
| 387 ** xCheckReservedLock() is defined as returning true "if there is a RESERVED | 387 ** xCheckReservedLock() is defined as returning true "if there is a RESERVED |
| 388 ** lock held by this process or any others". So xCheckReservedLock may | 388 ** lock held by this process or any others". So xCheckReservedLock may |
| 389 ** return true because the caller itself is holding an EXCLUSIVE lock (but | 389 ** return true because the caller itself is holding an EXCLUSIVE lock (but |
| 390 ** doesn't know it because of a previous error in xUnlock). If this happens | 390 ** doesn't know it because of a previous error in xUnlock). If this happens |
| 391 ** a hot-journal may be mistaken for a journal being created by an active | 391 ** a hot-journal may be mistaken for a journal being created by an active |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 i64 iHdrOffset; /* See above */ | 447 i64 iHdrOffset; /* See above */ |
| 448 Bitvec *pInSavepoint; /* Set of pages in this savepoint */ | 448 Bitvec *pInSavepoint; /* Set of pages in this savepoint */ |
| 449 Pgno nOrig; /* Original number of pages in file */ | 449 Pgno nOrig; /* Original number of pages in file */ |
| 450 Pgno iSubRec; /* Index of first record in sub-journal */ | 450 Pgno iSubRec; /* Index of first record in sub-journal */ |
| 451 #ifndef SQLITE_OMIT_WAL | 451 #ifndef SQLITE_OMIT_WAL |
| 452 u32 aWalData[WAL_SAVEPOINT_NDATA]; /* WAL savepoint context */ | 452 u32 aWalData[WAL_SAVEPOINT_NDATA]; /* WAL savepoint context */ |
| 453 #endif | 453 #endif |
| 454 }; | 454 }; |
| 455 | 455 |
| 456 /* | 456 /* |
| 457 ** A open page cache is an instance of struct Pager. A description of | 457 ** Bits of the Pager.doNotSpill flag. See further description below. |
| 458 */ |
| 459 #define SPILLFLAG_OFF 0x01 /* Never spill cache. Set via pragma */ |
| 460 #define SPILLFLAG_ROLLBACK 0x02 /* Current rolling back, so do not spill
*/ |
| 461 #define SPILLFLAG_NOSYNC 0x04 /* Spill is ok, but do not sync */ |
| 462 |
| 463 /* |
| 464 ** An open page cache is an instance of struct Pager. A description of |
| 458 ** some of the more important member variables follows: | 465 ** some of the more important member variables follows: |
| 459 ** | 466 ** |
| 460 ** eState | 467 ** eState |
| 461 ** | 468 ** |
| 462 ** The current 'state' of the pager object. See the comment and state | 469 ** The current 'state' of the pager object. See the comment and state |
| 463 ** diagram above for a description of the pager state. | 470 ** diagram above for a description of the pager state. |
| 464 ** | 471 ** |
| 465 ** eLock | 472 ** eLock |
| 466 ** | 473 ** |
| 467 ** For a real on-disk database, the current lock held on the database file - | 474 ** For a real on-disk database, the current lock held on the database file - |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 ** Journal files that contain master journal pointers cannot be finalized | 519 ** Journal files that contain master journal pointers cannot be finalized |
| 513 ** simply by overwriting the first journal-header with zeroes, as the | 520 ** simply by overwriting the first journal-header with zeroes, as the |
| 514 ** master journal pointer could interfere with hot-journal rollback of any | 521 ** master journal pointer could interfere with hot-journal rollback of any |
| 515 ** subsequently interrupted transaction that reuses the journal file. | 522 ** subsequently interrupted transaction that reuses the journal file. |
| 516 ** | 523 ** |
| 517 ** The flag is cleared as soon as the journal file is finalized (either | 524 ** The flag is cleared as soon as the journal file is finalized (either |
| 518 ** by PagerCommitPhaseTwo or PagerRollback). If an IO error prevents the | 525 ** by PagerCommitPhaseTwo or PagerRollback). If an IO error prevents the |
| 519 ** journal file from being successfully finalized, the setMaster flag | 526 ** journal file from being successfully finalized, the setMaster flag |
| 520 ** is cleared anyway (and the pager will move to ERROR state). | 527 ** is cleared anyway (and the pager will move to ERROR state). |
| 521 ** | 528 ** |
| 522 ** doNotSpill, doNotSyncSpill | 529 ** doNotSpill |
| 523 ** | 530 ** |
| 524 ** These two boolean variables control the behaviour of cache-spills | 531 ** This variables control the behavior of cache-spills (calls made by |
| 525 ** (calls made by the pcache module to the pagerStress() routine to | 532 ** the pcache module to the pagerStress() routine to write cached data |
| 526 ** write cached data to the file-system in order to free up memory). | 533 ** to the file-system in order to free up memory). |
| 527 ** | 534 ** |
| 528 ** When doNotSpill is non-zero, writing to the database from pagerStress() | 535 ** When bits SPILLFLAG_OFF or SPILLFLAG_ROLLBACK of doNotSpill are set, |
| 529 ** is disabled altogether. This is done in a very obscure case that | 536 ** writing to the database from pagerStress() is disabled altogether. |
| 537 ** The SPILLFLAG_ROLLBACK case is done in a very obscure case that |
| 530 ** comes up during savepoint rollback that requires the pcache module | 538 ** comes up during savepoint rollback that requires the pcache module |
| 531 ** to allocate a new page to prevent the journal file from being written | 539 ** to allocate a new page to prevent the journal file from being written |
| 532 ** while it is being traversed by code in pager_playback(). | 540 ** while it is being traversed by code in pager_playback(). The SPILLFLAG_OFF |
| 541 ** case is a user preference. |
| 533 ** | 542 ** |
| 534 ** If doNotSyncSpill is non-zero, writing to the database from pagerStress() | 543 ** If the SPILLFLAG_NOSYNC bit is set, writing to the database from pagerStres
s() |
| 535 ** is permitted, but syncing the journal file is not. This flag is set | 544 ** is permitted, but syncing the journal file is not. This flag is set |
| 536 ** by sqlite3PagerWrite() when the file-system sector-size is larger than | 545 ** by sqlite3PagerWrite() when the file-system sector-size is larger than |
| 537 ** the database page-size in order to prevent a journal sync from happening | 546 ** the database page-size in order to prevent a journal sync from happening |
| 538 ** in between the journalling of two pages on the same sector. | 547 ** in between the journalling of two pages on the same sector. |
| 539 ** | 548 ** |
| 540 ** subjInMemory | 549 ** subjInMemory |
| 541 ** | 550 ** |
| 542 ** This is a boolean variable. If true, then any required sub-journal | 551 ** This is a boolean variable. If true, then any required sub-journal |
| 543 ** is opened as an in-memory journal file. If false, then in-memory | 552 ** is opened as an in-memory journal file. If false, then in-memory |
| 544 ** sub-journals are only used for in-memory pager files. | 553 ** sub-journals are only used for in-memory pager files. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 605 ** The Pager.errCode variable is only ever used in PAGER_ERROR state. It | 614 ** The Pager.errCode variable is only ever used in PAGER_ERROR state. It |
| 606 ** is set to zero in all other states. In PAGER_ERROR state, Pager.errCode | 615 ** is set to zero in all other states. In PAGER_ERROR state, Pager.errCode |
| 607 ** is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX | 616 ** is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX |
| 608 ** sub-codes. | 617 ** sub-codes. |
| 609 */ | 618 */ |
| 610 struct Pager { | 619 struct Pager { |
| 611 sqlite3_vfs *pVfs; /* OS functions to use for IO */ | 620 sqlite3_vfs *pVfs; /* OS functions to use for IO */ |
| 612 u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */ | 621 u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */ |
| 613 u8 journalMode; /* One of the PAGER_JOURNALMODE_* values */ | 622 u8 journalMode; /* One of the PAGER_JOURNALMODE_* values */ |
| 614 u8 useJournal; /* Use a rollback journal on this file */ | 623 u8 useJournal; /* Use a rollback journal on this file */ |
| 615 u8 noReadlock; /* Do not bother to obtain readlocks */ | |
| 616 u8 noSync; /* Do not sync the journal if true */ | 624 u8 noSync; /* Do not sync the journal if true */ |
| 617 u8 fullSync; /* Do extra syncs of the journal for robustness */ | 625 u8 fullSync; /* Do extra syncs of the journal for robustness */ |
| 618 u8 ckptSyncFlags; /* SYNC_NORMAL or SYNC_FULL for checkpoint */ | 626 u8 ckptSyncFlags; /* SYNC_NORMAL or SYNC_FULL for checkpoint */ |
| 627 u8 walSyncFlags; /* SYNC_NORMAL or SYNC_FULL for wal writes */ |
| 619 u8 syncFlags; /* SYNC_NORMAL or SYNC_FULL otherwise */ | 628 u8 syncFlags; /* SYNC_NORMAL or SYNC_FULL otherwise */ |
| 620 u8 tempFile; /* zFilename is a temporary file */ | 629 u8 tempFile; /* zFilename is a temporary or immutable file */ |
| 630 u8 noLock; /* Do not lock (except in WAL mode) */ |
| 621 u8 readOnly; /* True for a read-only database */ | 631 u8 readOnly; /* True for a read-only database */ |
| 622 u8 memDb; /* True to inhibit all file I/O */ | 632 u8 memDb; /* True to inhibit all file I/O */ |
| 623 | 633 |
| 624 /************************************************************************** | 634 /************************************************************************** |
| 625 ** The following block contains those class members that change during | 635 ** The following block contains those class members that change during |
| 626 ** routine opertion. Class members not in this block are either fixed | 636 ** routine operation. Class members not in this block are either fixed |
| 627 ** when the pager is first created or else only change when there is a | 637 ** when the pager is first created or else only change when there is a |
| 628 ** significant mode change (such as changing the page_size, locking_mode, | 638 ** significant mode change (such as changing the page_size, locking_mode, |
| 629 ** or the journal_mode). From another view, these class members describe | 639 ** or the journal_mode). From another view, these class members describe |
| 630 ** the "state" of the pager, while other class members describe the | 640 ** the "state" of the pager, while other class members describe the |
| 631 ** "configuration" of the pager. | 641 ** "configuration" of the pager. |
| 632 */ | 642 */ |
| 633 u8 eState; /* Pager state (OPEN, READER, WRITER_LOCKED..) */ | 643 u8 eState; /* Pager state (OPEN, READER, WRITER_LOCKED..) */ |
| 634 u8 eLock; /* Current lock held on database file */ | 644 u8 eLock; /* Current lock held on database file */ |
| 635 u8 changeCountDone; /* Set after incrementing the change-counter */ | 645 u8 changeCountDone; /* Set after incrementing the change-counter */ |
| 636 u8 setMaster; /* True if a m-j name has been written to jrnl */ | 646 u8 setMaster; /* True if a m-j name has been written to jrnl */ |
| 637 u8 doNotSpill; /* Do not spill the cache when non-zero */ | 647 u8 doNotSpill; /* Do not spill the cache when non-zero */ |
| 638 u8 doNotSyncSpill; /* Do not do a spill that requires jrnl sync */ | |
| 639 u8 subjInMemory; /* True to use in-memory sub-journals */ | 648 u8 subjInMemory; /* True to use in-memory sub-journals */ |
| 640 Pgno dbSize; /* Number of pages in the database */ | 649 Pgno dbSize; /* Number of pages in the database */ |
| 641 Pgno dbOrigSize; /* dbSize before the current transaction */ | 650 Pgno dbOrigSize; /* dbSize before the current transaction */ |
| 642 Pgno dbFileSize; /* Number of pages in the database file */ | 651 Pgno dbFileSize; /* Number of pages in the database file */ |
| 643 Pgno dbHintSize; /* Value passed to FCNTL_SIZE_HINT call */ | 652 Pgno dbHintSize; /* Value passed to FCNTL_SIZE_HINT call */ |
| 644 int errCode; /* One of several kinds of errors */ | 653 int errCode; /* One of several kinds of errors */ |
| 645 int nRec; /* Pages journalled since last j-header written */ | 654 int nRec; /* Pages journalled since last j-header written */ |
| 646 u32 cksumInit; /* Quasi-random value added to every checksum */ | 655 u32 cksumInit; /* Quasi-random value added to every checksum */ |
| 647 u32 nSubRec; /* Number of records written to sub-journal */ | 656 u32 nSubRec; /* Number of records written to sub-journal */ |
| 648 Bitvec *pInJournal; /* One bit for each page in the database file */ | 657 Bitvec *pInJournal; /* One bit for each page in the database file */ |
| 649 sqlite3_file *fd; /* File descriptor for database */ | 658 sqlite3_file *fd; /* File descriptor for database */ |
| 650 sqlite3_file *jfd; /* File descriptor for main journal */ | 659 sqlite3_file *jfd; /* File descriptor for main journal */ |
| 651 sqlite3_file *sjfd; /* File descriptor for sub-journal */ | 660 sqlite3_file *sjfd; /* File descriptor for sub-journal */ |
| 652 i64 journalOff; /* Current write offset in the journal file */ | 661 i64 journalOff; /* Current write offset in the journal file */ |
| 653 i64 journalHdr; /* Byte offset to previous journal header */ | 662 i64 journalHdr; /* Byte offset to previous journal header */ |
| 654 sqlite3_backup *pBackup; /* Pointer to list of ongoing backup processes */ | 663 sqlite3_backup *pBackup; /* Pointer to list of ongoing backup processes */ |
| 655 PagerSavepoint *aSavepoint; /* Array of active savepoints */ | 664 PagerSavepoint *aSavepoint; /* Array of active savepoints */ |
| 656 int nSavepoint; /* Number of elements in aSavepoint[] */ | 665 int nSavepoint; /* Number of elements in aSavepoint[] */ |
| 657 char dbFileVers[16]; /* Changes whenever database file changes */ | 666 char dbFileVers[16]; /* Changes whenever database file changes */ |
| 667 |
| 668 u8 bUseFetch; /* True to use xFetch() */ |
| 669 int nMmapOut; /* Number of mmap pages currently outstanding */ |
| 670 sqlite3_int64 szMmap; /* Desired maximum mmap size */ |
| 671 PgHdr *pMmapFreelist; /* List of free mmap page headers (pDirty) */ |
| 658 /* | 672 /* |
| 659 ** End of the routinely-changing class members | 673 ** End of the routinely-changing class members |
| 660 ***************************************************************************/ | 674 ***************************************************************************/ |
| 661 | 675 |
| 662 u16 nExtra; /* Add this many bytes to each in-memory page */ | 676 u16 nExtra; /* Add this many bytes to each in-memory page */ |
| 663 i16 nReserve; /* Number of unused bytes at end of each page */ | 677 i16 nReserve; /* Number of unused bytes at end of each page */ |
| 664 u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */ | 678 u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */ |
| 665 u32 sectorSize; /* Assumed sector size during rollback */ | 679 u32 sectorSize; /* Assumed sector size during rollback */ |
| 666 int pageSize; /* Number of bytes in a page */ | 680 int pageSize; /* Number of bytes in a page */ |
| 667 Pgno mxPgno; /* Maximum allowed size of the database */ | 681 Pgno mxPgno; /* Maximum allowed size of the database */ |
| 668 i64 journalSizeLimit; /* Size limit for persistent journal files */ | 682 i64 journalSizeLimit; /* Size limit for persistent journal files */ |
| 669 char *zFilename; /* Name of the database file */ | 683 char *zFilename; /* Name of the database file */ |
| 670 char *zJournal; /* Name of the journal file */ | 684 char *zJournal; /* Name of the journal file */ |
| 671 int (*xBusyHandler)(void*); /* Function to call when busy */ | 685 int (*xBusyHandler)(void*); /* Function to call when busy */ |
| 672 void *pBusyHandlerArg; /* Context argument for xBusyHandler */ | 686 void *pBusyHandlerArg; /* Context argument for xBusyHandler */ |
| 687 int aStat[3]; /* Total cache hits, misses and writes */ |
| 673 #ifdef SQLITE_TEST | 688 #ifdef SQLITE_TEST |
| 674 int nHit, nMiss; /* Cache hits and missing */ | 689 int nRead; /* Database pages read */ |
| 675 int nRead, nWrite; /* Database pages read/written */ | |
| 676 #endif | 690 #endif |
| 677 void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */ | 691 void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */ |
| 678 #ifdef SQLITE_HAS_CODEC | 692 #ifdef SQLITE_HAS_CODEC |
| 679 void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */ | 693 void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */ |
| 680 void (*xCodecSizeChng)(void*,int,int); /* Notify of page size changes */ | 694 void (*xCodecSizeChng)(void*,int,int); /* Notify of page size changes */ |
| 681 void (*xCodecFree)(void*); /* Destructor for the codec */ | 695 void (*xCodecFree)(void*); /* Destructor for the codec */ |
| 682 void *pCodec; /* First argument to xCodec... methods */ | 696 void *pCodec; /* First argument to xCodec... methods */ |
| 683 #endif | 697 #endif |
| 684 char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */ | 698 char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */ |
| 685 PCache *pPCache; /* Pointer to page cache object */ | 699 PCache *pPCache; /* Pointer to page cache object */ |
| 686 #ifndef SQLITE_OMIT_WAL | 700 #ifndef SQLITE_OMIT_WAL |
| 687 Wal *pWal; /* Write-ahead log used by "journal_mode=wal" */ | 701 Wal *pWal; /* Write-ahead log used by "journal_mode=wal" */ |
| 688 char *zWal; /* File name for write-ahead log */ | 702 char *zWal; /* File name for write-ahead log */ |
| 689 #endif | 703 #endif |
| 690 }; | 704 }; |
| 691 | 705 |
| 692 /* | 706 /* |
| 707 ** Indexes for use with Pager.aStat[]. The Pager.aStat[] array contains |
| 708 ** the values accessed by passing SQLITE_DBSTATUS_CACHE_HIT, CACHE_MISS |
| 709 ** or CACHE_WRITE to sqlite3_db_status(). |
| 710 */ |
| 711 #define PAGER_STAT_HIT 0 |
| 712 #define PAGER_STAT_MISS 1 |
| 713 #define PAGER_STAT_WRITE 2 |
| 714 |
| 715 /* |
| 693 ** The following global variables hold counters used for | 716 ** The following global variables hold counters used for |
| 694 ** testing purposes only. These variables do not exist in | 717 ** testing purposes only. These variables do not exist in |
| 695 ** a non-testing build. These variables are not thread-safe. | 718 ** a non-testing build. These variables are not thread-safe. |
| 696 */ | 719 */ |
| 697 #ifdef SQLITE_TEST | 720 #ifdef SQLITE_TEST |
| 698 int sqlite3_pager_readdb_count = 0; /* Number of full pages read from DB */ | 721 int sqlite3_pager_readdb_count = 0; /* Number of full pages read from DB */ |
| 699 int sqlite3_pager_writedb_count = 0; /* Number of full pages written to DB */ | 722 int sqlite3_pager_writedb_count = 0; /* Number of full pages written to DB */ |
| 700 int sqlite3_pager_writej_count = 0; /* Number of pages written to journal */ | 723 int sqlite3_pager_writej_count = 0; /* Number of pages written to journal */ |
| 701 # define PAGER_INCR(v) v++ | 724 # define PAGER_INCR(v) v++ |
| 702 #else | 725 #else |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 750 ** the value of MEMDB will be a constant and the compiler will optimize | 773 ** the value of MEMDB will be a constant and the compiler will optimize |
| 751 ** out code that would never execute. | 774 ** out code that would never execute. |
| 752 */ | 775 */ |
| 753 #ifdef SQLITE_OMIT_MEMORYDB | 776 #ifdef SQLITE_OMIT_MEMORYDB |
| 754 # define MEMDB 0 | 777 # define MEMDB 0 |
| 755 #else | 778 #else |
| 756 # define MEMDB pPager->memDb | 779 # define MEMDB pPager->memDb |
| 757 #endif | 780 #endif |
| 758 | 781 |
| 759 /* | 782 /* |
| 783 ** The macro USEFETCH is true if we are allowed to use the xFetch and xUnfetch |
| 784 ** interfaces to access the database using memory-mapped I/O. |
| 785 */ |
| 786 #if SQLITE_MAX_MMAP_SIZE>0 |
| 787 # define USEFETCH(x) ((x)->bUseFetch) |
| 788 #else |
| 789 # define USEFETCH(x) 0 |
| 790 #endif |
| 791 |
| 792 /* |
| 760 ** The maximum legal page number is (2^31 - 1). | 793 ** The maximum legal page number is (2^31 - 1). |
| 761 */ | 794 */ |
| 762 #define PAGER_MAX_PGNO 2147483647 | 795 #define PAGER_MAX_PGNO 2147483647 |
| 763 | 796 |
| 764 /* | 797 /* |
| 765 ** The argument to this macro is a file descriptor (type sqlite3_file*). | 798 ** The argument to this macro is a file descriptor (type sqlite3_file*). |
| 766 ** Return 0 if it is not open, or non-zero (but not 1) if it is. | 799 ** Return 0 if it is not open, or non-zero (but not 1) if it is. |
| 767 ** | 800 ** |
| 768 ** This is so that expressions can be written as: | 801 ** This is so that expressions can be written as: |
| 769 ** | 802 ** |
| 770 ** if( isOpen(pPager->jfd) ){ ... | 803 ** if( isOpen(pPager->jfd) ){ ... |
| 771 ** | 804 ** |
| 772 ** instead of | 805 ** instead of |
| 773 ** | 806 ** |
| 774 ** if( pPager->jfd->pMethods ){ ... | 807 ** if( pPager->jfd->pMethods ){ ... |
| 775 */ | 808 */ |
| 776 #define isOpen(pFd) ((pFd)->pMethods) | 809 #define isOpen(pFd) ((pFd)->pMethods) |
| 777 | 810 |
| 778 /* | 811 /* |
| 779 ** Return true if this pager uses a write-ahead log instead of the usual | 812 ** Return true if this pager uses a write-ahead log instead of the usual |
| 780 ** rollback journal. Otherwise false. | 813 ** rollback journal. Otherwise false. |
| 781 */ | 814 */ |
| 782 #ifndef SQLITE_OMIT_WAL | 815 #ifndef SQLITE_OMIT_WAL |
| 783 static int pagerUseWal(Pager *pPager){ | 816 static int pagerUseWal(Pager *pPager){ |
| 784 return (pPager->pWal!=0); | 817 return (pPager->pWal!=0); |
| 785 } | 818 } |
| 786 #else | 819 #else |
| 787 # define pagerUseWal(x) 0 | 820 # define pagerUseWal(x) 0 |
| 788 # define pagerRollbackWal(x) 0 | 821 # define pagerRollbackWal(x) 0 |
| 789 # define pagerWalFrames(v,w,x,y,z) 0 | 822 # define pagerWalFrames(v,w,x,y) 0 |
| 790 # define pagerOpenWalIfPresent(z) SQLITE_OK | 823 # define pagerOpenWalIfPresent(z) SQLITE_OK |
| 791 # define pagerBeginReadTransaction(z) SQLITE_OK | 824 # define pagerBeginReadTransaction(z) SQLITE_OK |
| 792 #endif | 825 #endif |
| 793 | 826 |
| 794 #ifndef NDEBUG | 827 #ifndef NDEBUG |
| 795 /* | 828 /* |
| 796 ** Usage: | 829 ** Usage: |
| 797 ** | 830 ** |
| 798 ** assert( assert_pager_state(pPager) ); | 831 ** assert( assert_pager_state(pPager) ); |
| 799 ** | 832 ** |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 852 switch( p->eState ){ | 885 switch( p->eState ){ |
| 853 case PAGER_OPEN: | 886 case PAGER_OPEN: |
| 854 assert( !MEMDB ); | 887 assert( !MEMDB ); |
| 855 assert( pPager->errCode==SQLITE_OK ); | 888 assert( pPager->errCode==SQLITE_OK ); |
| 856 assert( sqlite3PcacheRefCount(pPager->pPCache)==0 || pPager->tempFile ); | 889 assert( sqlite3PcacheRefCount(pPager->pPCache)==0 || pPager->tempFile ); |
| 857 break; | 890 break; |
| 858 | 891 |
| 859 case PAGER_READER: | 892 case PAGER_READER: |
| 860 assert( pPager->errCode==SQLITE_OK ); | 893 assert( pPager->errCode==SQLITE_OK ); |
| 861 assert( p->eLock!=UNKNOWN_LOCK ); | 894 assert( p->eLock!=UNKNOWN_LOCK ); |
| 862 assert( p->eLock>=SHARED_LOCK || p->noReadlock ); | 895 assert( p->eLock>=SHARED_LOCK ); |
| 863 break; | 896 break; |
| 864 | 897 |
| 865 case PAGER_WRITER_LOCKED: | 898 case PAGER_WRITER_LOCKED: |
| 866 assert( p->eLock!=UNKNOWN_LOCK ); | 899 assert( p->eLock!=UNKNOWN_LOCK ); |
| 867 assert( pPager->errCode==SQLITE_OK ); | 900 assert( pPager->errCode==SQLITE_OK ); |
| 868 if( !pagerUseWal(pPager) ){ | 901 if( !pagerUseWal(pPager) ){ |
| 869 assert( p->eLock>=RESERVED_LOCK ); | 902 assert( p->eLock>=RESERVED_LOCK ); |
| 870 } | 903 } |
| 871 assert( pPager->dbSize==pPager->dbOrigSize ); | 904 assert( pPager->dbSize==pPager->dbOrigSize ); |
| 872 assert( pPager->dbOrigSize==pPager->dbFileSize ); | 905 assert( pPager->dbOrigSize==pPager->dbFileSize ); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 983 /* | 1016 /* |
| 984 ** Return true if it is necessary to write page *pPg into the sub-journal. | 1017 ** Return true if it is necessary to write page *pPg into the sub-journal. |
| 985 ** A page needs to be written into the sub-journal if there exists one | 1018 ** A page needs to be written into the sub-journal if there exists one |
| 986 ** or more open savepoints for which: | 1019 ** or more open savepoints for which: |
| 987 ** | 1020 ** |
| 988 ** * The page-number is less than or equal to PagerSavepoint.nOrig, and | 1021 ** * The page-number is less than or equal to PagerSavepoint.nOrig, and |
| 989 ** * The bit corresponding to the page-number is not set in | 1022 ** * The bit corresponding to the page-number is not set in |
| 990 ** PagerSavepoint.pInSavepoint. | 1023 ** PagerSavepoint.pInSavepoint. |
| 991 */ | 1024 */ |
| 992 static int subjRequiresPage(PgHdr *pPg){ | 1025 static int subjRequiresPage(PgHdr *pPg){ |
| 1026 Pager *pPager = pPg->pPager; |
| 1027 PagerSavepoint *p; |
| 993 Pgno pgno = pPg->pgno; | 1028 Pgno pgno = pPg->pgno; |
| 994 Pager *pPager = pPg->pPager; | |
| 995 int i; | 1029 int i; |
| 996 for(i=0; i<pPager->nSavepoint; i++){ | 1030 for(i=0; i<pPager->nSavepoint; i++){ |
| 997 PagerSavepoint *p = &pPager->aSavepoint[i]; | 1031 p = &pPager->aSavepoint[i]; |
| 998 if( p->nOrig>=pgno && 0==sqlite3BitvecTest(p->pInSavepoint, pgno) ){ | 1032 if( p->nOrig>=pgno && 0==sqlite3BitvecTest(p->pInSavepoint, pgno) ){ |
| 999 return 1; | 1033 return 1; |
| 1000 } | 1034 } |
| 1001 } | 1035 } |
| 1002 return 0; | 1036 return 0; |
| 1003 } | 1037 } |
| 1004 | 1038 |
| 1005 /* | 1039 /* |
| 1006 ** Return true if the page is already in the journal file. | 1040 ** Return true if the page is already in the journal file. |
| 1007 */ | 1041 */ |
| 1008 static int pageInJournal(PgHdr *pPg){ | 1042 static int pageInJournal(Pager *pPager, PgHdr *pPg){ |
| 1009 return sqlite3BitvecTest(pPg->pPager->pInJournal, pPg->pgno); | 1043 return sqlite3BitvecTest(pPager->pInJournal, pPg->pgno); |
| 1010 } | 1044 } |
| 1011 | 1045 |
| 1012 /* | 1046 /* |
| 1013 ** Read a 32-bit integer from the given file descriptor. Store the integer | 1047 ** Read a 32-bit integer from the given file descriptor. Store the integer |
| 1014 ** that is read in *pRes. Return SQLITE_OK if everything worked, or an | 1048 ** that is read in *pRes. Return SQLITE_OK if everything worked, or an |
| 1015 ** error code is something goes wrong. | 1049 ** error code is something goes wrong. |
| 1016 ** | 1050 ** |
| 1017 ** All values are stored on disk as big-endian. | 1051 ** All values are stored on disk as big-endian. |
| 1018 */ | 1052 */ |
| 1019 static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){ | 1053 static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){ |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1051 ** UNKNOWN_LOCK for an explanation of this. | 1085 ** UNKNOWN_LOCK for an explanation of this. |
| 1052 */ | 1086 */ |
| 1053 static int pagerUnlockDb(Pager *pPager, int eLock){ | 1087 static int pagerUnlockDb(Pager *pPager, int eLock){ |
| 1054 int rc = SQLITE_OK; | 1088 int rc = SQLITE_OK; |
| 1055 | 1089 |
| 1056 assert( !pPager->exclusiveMode || pPager->eLock==eLock ); | 1090 assert( !pPager->exclusiveMode || pPager->eLock==eLock ); |
| 1057 assert( eLock==NO_LOCK || eLock==SHARED_LOCK ); | 1091 assert( eLock==NO_LOCK || eLock==SHARED_LOCK ); |
| 1058 assert( eLock!=NO_LOCK || pagerUseWal(pPager)==0 ); | 1092 assert( eLock!=NO_LOCK || pagerUseWal(pPager)==0 ); |
| 1059 if( isOpen(pPager->fd) ){ | 1093 if( isOpen(pPager->fd) ){ |
| 1060 assert( pPager->eLock>=eLock ); | 1094 assert( pPager->eLock>=eLock ); |
| 1061 rc = sqlite3OsUnlock(pPager->fd, eLock); | 1095 rc = pPager->noLock ? SQLITE_OK : sqlite3OsUnlock(pPager->fd, eLock); |
| 1062 if( pPager->eLock!=UNKNOWN_LOCK ){ | 1096 if( pPager->eLock!=UNKNOWN_LOCK ){ |
| 1063 pPager->eLock = (u8)eLock; | 1097 pPager->eLock = (u8)eLock; |
| 1064 } | 1098 } |
| 1065 IOTRACE(("UNLOCK %p %d\n", pPager, eLock)) | 1099 IOTRACE(("UNLOCK %p %d\n", pPager, eLock)) |
| 1066 } | 1100 } |
| 1067 return rc; | 1101 return rc; |
| 1068 } | 1102 } |
| 1069 | 1103 |
| 1070 /* | 1104 /* |
| 1071 ** Lock the database file to level eLock, which must be either SHARED_LOCK, | 1105 ** Lock the database file to level eLock, which must be either SHARED_LOCK, |
| 1072 ** RESERVED_LOCK or EXCLUSIVE_LOCK. If the caller is successful, set the | 1106 ** RESERVED_LOCK or EXCLUSIVE_LOCK. If the caller is successful, set the |
| 1073 ** Pager.eLock variable to the new locking state. | 1107 ** Pager.eLock variable to the new locking state. |
| 1074 ** | 1108 ** |
| 1075 ** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is | 1109 ** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is |
| 1076 ** called, do not modify it unless the new locking state is EXCLUSIVE_LOCK. | 1110 ** called, do not modify it unless the new locking state is EXCLUSIVE_LOCK. |
| 1077 ** See the comment above the #define of UNKNOWN_LOCK for an explanation | 1111 ** See the comment above the #define of UNKNOWN_LOCK for an explanation |
| 1078 ** of this. | 1112 ** of this. |
| 1079 */ | 1113 */ |
| 1080 static int pagerLockDb(Pager *pPager, int eLock){ | 1114 static int pagerLockDb(Pager *pPager, int eLock){ |
| 1081 int rc = SQLITE_OK; | 1115 int rc = SQLITE_OK; |
| 1082 | 1116 |
| 1083 assert( eLock==SHARED_LOCK || eLock==RESERVED_LOCK || eLock==EXCLUSIVE_LOCK ); | 1117 assert( eLock==SHARED_LOCK || eLock==RESERVED_LOCK || eLock==EXCLUSIVE_LOCK ); |
| 1084 if( pPager->eLock<eLock || pPager->eLock==UNKNOWN_LOCK ){ | 1118 if( pPager->eLock<eLock || pPager->eLock==UNKNOWN_LOCK ){ |
| 1085 rc = sqlite3OsLock(pPager->fd, eLock); | 1119 rc = pPager->noLock ? SQLITE_OK : sqlite3OsLock(pPager->fd, eLock); |
| 1086 if( rc==SQLITE_OK && (pPager->eLock!=UNKNOWN_LOCK||eLock==EXCLUSIVE_LOCK) ){ | 1120 if( rc==SQLITE_OK && (pPager->eLock!=UNKNOWN_LOCK||eLock==EXCLUSIVE_LOCK) ){ |
| 1087 pPager->eLock = (u8)eLock; | 1121 pPager->eLock = (u8)eLock; |
| 1088 IOTRACE(("LOCK %p %d\n", pPager, eLock)) | 1122 IOTRACE(("LOCK %p %d\n", pPager, eLock)) |
| 1089 } | 1123 } |
| 1090 } | 1124 } |
| 1091 return rc; | 1125 return rc; |
| 1092 } | 1126 } |
| 1093 | 1127 |
| 1094 /* | 1128 /* |
| 1095 ** This function determines whether or not the atomic-write optimization | 1129 ** This function determines whether or not the atomic-write optimization |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1206 i64 szJ; /* Total size in bytes of journal file pJrnl */ | 1240 i64 szJ; /* Total size in bytes of journal file pJrnl */ |
| 1207 u32 cksum; /* MJ checksum value read from journal */ | 1241 u32 cksum; /* MJ checksum value read from journal */ |
| 1208 u32 u; /* Unsigned loop counter */ | 1242 u32 u; /* Unsigned loop counter */ |
| 1209 unsigned char aMagic[8]; /* A buffer to hold the magic header */ | 1243 unsigned char aMagic[8]; /* A buffer to hold the magic header */ |
| 1210 zMaster[0] = '\0'; | 1244 zMaster[0] = '\0'; |
| 1211 | 1245 |
| 1212 if( SQLITE_OK!=(rc = sqlite3OsFileSize(pJrnl, &szJ)) | 1246 if( SQLITE_OK!=(rc = sqlite3OsFileSize(pJrnl, &szJ)) |
| 1213 || szJ<16 | 1247 || szJ<16 |
| 1214 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len)) | 1248 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len)) |
| 1215 || len>=nMaster | 1249 || len>=nMaster |
| 1250 || len==0 |
| 1216 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum)) | 1251 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum)) |
| 1217 || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8)) | 1252 || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8)) |
| 1218 || memcmp(aMagic, aJournalMagic, 8) | 1253 || memcmp(aMagic, aJournalMagic, 8) |
| 1219 || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, zMaster, len, szJ-16-len)) | 1254 || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, zMaster, len, szJ-16-len)) |
| 1220 ){ | 1255 ){ |
| 1221 return rc; | 1256 return rc; |
| 1222 } | 1257 } |
| 1223 | 1258 |
| 1224 /* See if the checksum matches the master journal name */ | 1259 /* See if the checksum matches the master journal name */ |
| 1225 for(u=0; u<len; u++){ | 1260 for(u=0; u<len; u++){ |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1383 assert( isOpen(pPager->fd) || pPager->noSync ); | 1418 assert( isOpen(pPager->fd) || pPager->noSync ); |
| 1384 if( pPager->noSync || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY) | 1419 if( pPager->noSync || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY) |
| 1385 || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) | 1420 || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND) |
| 1386 ){ | 1421 ){ |
| 1387 memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); | 1422 memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic)); |
| 1388 put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff); | 1423 put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff); |
| 1389 }else{ | 1424 }else{ |
| 1390 memset(zHeader, 0, sizeof(aJournalMagic)+4); | 1425 memset(zHeader, 0, sizeof(aJournalMagic)+4); |
| 1391 } | 1426 } |
| 1392 | 1427 |
| 1393 /* The random check-hash initialiser */ | 1428 /* The random check-hash initializer */ |
| 1394 sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); | 1429 sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); |
| 1395 put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit); | 1430 put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit); |
| 1396 /* The initial database size */ | 1431 /* The initial database size */ |
| 1397 put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize); | 1432 put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize); |
| 1398 /* The assumed sector size for this process */ | 1433 /* The assumed sector size for this process */ |
| 1399 put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize); | 1434 put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize); |
| 1400 | 1435 |
| 1401 /* The page size */ | 1436 /* The page size */ |
| 1402 put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize); | 1437 put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize); |
| 1403 | 1438 |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1583 int nMaster; /* Length of string zMaster */ | 1618 int nMaster; /* Length of string zMaster */ |
| 1584 i64 iHdrOff; /* Offset of header in journal file */ | 1619 i64 iHdrOff; /* Offset of header in journal file */ |
| 1585 i64 jrnlSize; /* Size of journal file on disk */ | 1620 i64 jrnlSize; /* Size of journal file on disk */ |
| 1586 u32 cksum = 0; /* Checksum of string zMaster */ | 1621 u32 cksum = 0; /* Checksum of string zMaster */ |
| 1587 | 1622 |
| 1588 assert( pPager->setMaster==0 ); | 1623 assert( pPager->setMaster==0 ); |
| 1589 assert( !pagerUseWal(pPager) ); | 1624 assert( !pagerUseWal(pPager) ); |
| 1590 | 1625 |
| 1591 if( !zMaster | 1626 if( !zMaster |
| 1592 || pPager->journalMode==PAGER_JOURNALMODE_MEMORY | 1627 || pPager->journalMode==PAGER_JOURNALMODE_MEMORY |
| 1593 || pPager->journalMode==PAGER_JOURNALMODE_OFF | 1628 || !isOpen(pPager->jfd) |
| 1594 ){ | 1629 ){ |
| 1595 return SQLITE_OK; | 1630 return SQLITE_OK; |
| 1596 } | 1631 } |
| 1597 pPager->setMaster = 1; | 1632 pPager->setMaster = 1; |
| 1598 assert( isOpen(pPager->jfd) ); | |
| 1599 assert( pPager->journalHdr <= pPager->journalOff ); | 1633 assert( pPager->journalHdr <= pPager->journalOff ); |
| 1600 | 1634 |
| 1601 /* Calculate the length in bytes and the checksum of zMaster */ | 1635 /* Calculate the length in bytes and the checksum of zMaster */ |
| 1602 for(nMaster=0; zMaster[nMaster]; nMaster++){ | 1636 for(nMaster=0; zMaster[nMaster]; nMaster++){ |
| 1603 cksum += zMaster[nMaster]; | 1637 cksum += zMaster[nMaster]; |
| 1604 } | 1638 } |
| 1605 | 1639 |
| 1606 /* If in full-sync mode, advance to the next disk sector before writing | 1640 /* If in full-sync mode, advance to the next disk sector before writing |
| 1607 ** the master journal name. This is in case the previous page written to | 1641 ** the master journal name. This is in case the previous page written to |
| 1608 ** the journal has already been synced. | 1642 ** the journal has already been synced. |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1637 */ | 1671 */ |
| 1638 if( SQLITE_OK==(rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize)) | 1672 if( SQLITE_OK==(rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize)) |
| 1639 && jrnlSize>pPager->journalOff | 1673 && jrnlSize>pPager->journalOff |
| 1640 ){ | 1674 ){ |
| 1641 rc = sqlite3OsTruncate(pPager->jfd, pPager->journalOff); | 1675 rc = sqlite3OsTruncate(pPager->jfd, pPager->journalOff); |
| 1642 } | 1676 } |
| 1643 return rc; | 1677 return rc; |
| 1644 } | 1678 } |
| 1645 | 1679 |
| 1646 /* | 1680 /* |
| 1647 ** Find a page in the hash table given its page number. Return | |
| 1648 ** a pointer to the page or NULL if the requested page is not | |
| 1649 ** already in memory. | |
| 1650 */ | |
| 1651 static PgHdr *pager_lookup(Pager *pPager, Pgno pgno){ | |
| 1652 PgHdr *p; /* Return value */ | |
| 1653 | |
| 1654 /* It is not possible for a call to PcacheFetch() with createFlag==0 to | |
| 1655 ** fail, since no attempt to allocate dynamic memory will be made. | |
| 1656 */ | |
| 1657 (void)sqlite3PcacheFetch(pPager->pPCache, pgno, 0, &p); | |
| 1658 return p; | |
| 1659 } | |
| 1660 | |
| 1661 /* | |
| 1662 ** Discard the entire contents of the in-memory page-cache. | 1681 ** Discard the entire contents of the in-memory page-cache. |
| 1663 */ | 1682 */ |
| 1664 static void pager_reset(Pager *pPager){ | 1683 static void pager_reset(Pager *pPager){ |
| 1665 sqlite3BackupRestart(pPager->pBackup); | 1684 sqlite3BackupRestart(pPager->pBackup); |
| 1666 sqlite3PcacheClear(pPager->pPCache); | 1685 sqlite3PcacheClear(pPager->pPCache); |
| 1667 } | 1686 } |
| 1668 | 1687 |
| 1669 /* | 1688 /* |
| 1670 ** Free all structures in the Pager.aSavepoint[] array and set both | 1689 ** Free all structures in the Pager.aSavepoint[] array and set both |
| 1671 ** Pager.aSavepoint and Pager.nSavepoint to zero. Close the sub-journal | 1690 ** Pager.aSavepoint and Pager.nSavepoint to zero. Close the sub-journal |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1781 ** trusted. Now that there are no outstanding references to the pager, | 1800 ** trusted. Now that there are no outstanding references to the pager, |
| 1782 ** it can safely move back to PAGER_OPEN state. This happens in both | 1801 ** it can safely move back to PAGER_OPEN state. This happens in both |
| 1783 ** normal and exclusive-locking mode. | 1802 ** normal and exclusive-locking mode. |
| 1784 */ | 1803 */ |
| 1785 if( pPager->errCode ){ | 1804 if( pPager->errCode ){ |
| 1786 assert( !MEMDB ); | 1805 assert( !MEMDB ); |
| 1787 pager_reset(pPager); | 1806 pager_reset(pPager); |
| 1788 pPager->changeCountDone = pPager->tempFile; | 1807 pPager->changeCountDone = pPager->tempFile; |
| 1789 pPager->eState = PAGER_OPEN; | 1808 pPager->eState = PAGER_OPEN; |
| 1790 pPager->errCode = SQLITE_OK; | 1809 pPager->errCode = SQLITE_OK; |
| 1810 if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); |
| 1791 } | 1811 } |
| 1792 | 1812 |
| 1793 pPager->journalOff = 0; | 1813 pPager->journalOff = 0; |
| 1794 pPager->journalHdr = 0; | 1814 pPager->journalHdr = 0; |
| 1795 pPager->setMaster = 0; | 1815 pPager->setMaster = 0; |
| 1796 } | 1816 } |
| 1797 | 1817 |
| 1798 /* | 1818 /* |
| 1799 ** This function is called whenever an IOERR or FULL error that requires | 1819 ** This function is called whenever an IOERR or FULL error that requires |
| 1800 ** the pager to transition into the ERROR state may ahve occurred. | 1820 ** the pager to transition into the ERROR state may ahve occurred. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1822 pPager->errCode==SQLITE_OK || | 1842 pPager->errCode==SQLITE_OK || |
| 1823 (pPager->errCode & 0xff)==SQLITE_IOERR | 1843 (pPager->errCode & 0xff)==SQLITE_IOERR |
| 1824 ); | 1844 ); |
| 1825 if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){ | 1845 if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){ |
| 1826 pPager->errCode = rc; | 1846 pPager->errCode = rc; |
| 1827 pPager->eState = PAGER_ERROR; | 1847 pPager->eState = PAGER_ERROR; |
| 1828 } | 1848 } |
| 1829 return rc; | 1849 return rc; |
| 1830 } | 1850 } |
| 1831 | 1851 |
| 1852 static int pager_truncate(Pager *pPager, Pgno nPage); |
| 1853 |
| 1832 /* | 1854 /* |
| 1833 ** This routine ends a transaction. A transaction is usually ended by | 1855 ** This routine ends a transaction. A transaction is usually ended by |
| 1834 ** either a COMMIT or a ROLLBACK operation. This routine may be called | 1856 ** either a COMMIT or a ROLLBACK operation. This routine may be called |
| 1835 ** after rollback of a hot-journal, or if an error occurs while opening | 1857 ** after rollback of a hot-journal, or if an error occurs while opening |
| 1836 ** the journal file or writing the very first journal-header of a | 1858 ** the journal file or writing the very first journal-header of a |
| 1837 ** database transaction. | 1859 ** database transaction. |
| 1838 ** | 1860 ** |
| 1839 ** This routine is never called in PAGER_ERROR state. If it is called | 1861 ** This routine is never called in PAGER_ERROR state. If it is called |
| 1840 ** in PAGER_NONE or PAGER_SHARED state and the lock held is less | 1862 ** in PAGER_NONE or PAGER_SHARED state and the lock held is less |
| 1841 ** exclusive than a RESERVED lock, it is a no-op. | 1863 ** exclusive than a RESERVED lock, it is a no-op. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1875 ** | 1897 ** |
| 1876 ** SQLITE_OK is returned if no error occurs. If an error occurs during | 1898 ** SQLITE_OK is returned if no error occurs. If an error occurs during |
| 1877 ** any of the IO operations to finalize the journal file or unlock the | 1899 ** any of the IO operations to finalize the journal file or unlock the |
| 1878 ** database then the IO error code is returned to the user. If the | 1900 ** database then the IO error code is returned to the user. If the |
| 1879 ** operation to finalize the journal file fails, then the code still | 1901 ** operation to finalize the journal file fails, then the code still |
| 1880 ** tries to unlock the database file if not in exclusive mode. If the | 1902 ** tries to unlock the database file if not in exclusive mode. If the |
| 1881 ** unlock operation fails as well, then the first error code related | 1903 ** unlock operation fails as well, then the first error code related |
| 1882 ** to the first error encountered (the journal finalization one) is | 1904 ** to the first error encountered (the journal finalization one) is |
| 1883 ** returned. | 1905 ** returned. |
| 1884 */ | 1906 */ |
| 1885 static int pager_end_transaction(Pager *pPager, int hasMaster){ | 1907 static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ |
| 1886 int rc = SQLITE_OK; /* Error code from journal finalization operation */ | 1908 int rc = SQLITE_OK; /* Error code from journal finalization operation */ |
| 1887 int rc2 = SQLITE_OK; /* Error code from db file unlock operation */ | 1909 int rc2 = SQLITE_OK; /* Error code from db file unlock operation */ |
| 1888 | 1910 |
| 1889 /* Do nothing if the pager does not have an open write transaction | 1911 /* Do nothing if the pager does not have an open write transaction |
| 1890 ** or at least a RESERVED lock. This function may be called when there | 1912 ** or at least a RESERVED lock. This function may be called when there |
| 1891 ** is no write-transaction active but a RESERVED or greater lock is | 1913 ** is no write-transaction active but a RESERVED or greater lock is |
| 1892 ** held under two circumstances: | 1914 ** held under two circumstances: |
| 1893 ** | 1915 ** |
| 1894 ** 1. After a successful hot-journal rollback, it is called with | 1916 ** 1. After a successful hot-journal rollback, it is called with |
| 1895 ** eState==PAGER_NONE and eLock==EXCLUSIVE_LOCK. | 1917 ** eState==PAGER_NONE and eLock==EXCLUSIVE_LOCK. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1912 | 1934 |
| 1913 /* Finalize the journal file. */ | 1935 /* Finalize the journal file. */ |
| 1914 if( sqlite3IsMemJournal(pPager->jfd) ){ | 1936 if( sqlite3IsMemJournal(pPager->jfd) ){ |
| 1915 assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ); | 1937 assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ); |
| 1916 sqlite3OsClose(pPager->jfd); | 1938 sqlite3OsClose(pPager->jfd); |
| 1917 }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){ | 1939 }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){ |
| 1918 if( pPager->journalOff==0 ){ | 1940 if( pPager->journalOff==0 ){ |
| 1919 rc = SQLITE_OK; | 1941 rc = SQLITE_OK; |
| 1920 }else{ | 1942 }else{ |
| 1921 rc = sqlite3OsTruncate(pPager->jfd, 0); | 1943 rc = sqlite3OsTruncate(pPager->jfd, 0); |
| 1944 if( rc==SQLITE_OK && pPager->fullSync ){ |
| 1945 /* Make sure the new file size is written into the inode right away. |
| 1946 ** Otherwise the journal might resurrect following a power loss and |
| 1947 ** cause the last transaction to roll back. See |
| 1948 ** https://bugzilla.mozilla.org/show_bug.cgi?id=1072773 |
| 1949 */ |
| 1950 rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags); |
| 1951 } |
| 1922 } | 1952 } |
| 1923 pPager->journalOff = 0; | 1953 pPager->journalOff = 0; |
| 1924 }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST | 1954 }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST |
| 1925 || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL) | 1955 || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL) |
| 1926 ){ | 1956 ){ |
| 1927 rc = zeroJournalHdr(pPager, hasMaster); | 1957 rc = zeroJournalHdr(pPager, hasMaster); |
| 1928 pPager->journalOff = 0; | 1958 pPager->journalOff = 0; |
| 1929 }else{ | 1959 }else{ |
| 1930 /* This branch may be executed with Pager.journalMode==MEMORY if | 1960 /* This branch may be executed with Pager.journalMode==MEMORY if |
| 1931 ** a hot-journal was just rolled back. In this case the journal | 1961 ** a hot-journal was just rolled back. In this case the journal |
| 1932 ** file should be closed and deleted. If this connection writes to | 1962 ** file should be closed and deleted. If this connection writes to |
| 1933 ** the database file, it will do so using an in-memory journal. | 1963 ** the database file, it will do so using an in-memory journal. |
| 1934 */ | 1964 */ |
| 1965 int bDelete = (!pPager->tempFile && sqlite3JournalExists(pPager->jfd)); |
| 1935 assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE | 1966 assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE |
| 1936 || pPager->journalMode==PAGER_JOURNALMODE_MEMORY | 1967 || pPager->journalMode==PAGER_JOURNALMODE_MEMORY |
| 1937 || pPager->journalMode==PAGER_JOURNALMODE_WAL | 1968 || pPager->journalMode==PAGER_JOURNALMODE_WAL |
| 1938 ); | 1969 ); |
| 1939 sqlite3OsClose(pPager->jfd); | 1970 sqlite3OsClose(pPager->jfd); |
| 1940 if( !pPager->tempFile ){ | 1971 if( bDelete ){ |
| 1941 rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); | 1972 rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); |
| 1942 } | 1973 } |
| 1943 } | 1974 } |
| 1944 } | 1975 } |
| 1945 | 1976 |
| 1946 #ifdef SQLITE_CHECK_PAGES | 1977 #ifdef SQLITE_CHECK_PAGES |
| 1947 sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash); | 1978 sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash); |
| 1948 if( pPager->dbSize==0 && sqlite3PcacheRefCount(pPager->pPCache)>0 ){ | 1979 if( pPager->dbSize==0 && sqlite3PcacheRefCount(pPager->pPCache)>0 ){ |
| 1949 PgHdr *p = pager_lookup(pPager, 1); | 1980 PgHdr *p = sqlite3PagerLookup(pPager, 1); |
| 1950 if( p ){ | 1981 if( p ){ |
| 1951 p->pageHash = 0; | 1982 p->pageHash = 0; |
| 1952 sqlite3PagerUnref(p); | 1983 sqlite3PagerUnrefNotNull(p); |
| 1953 } | 1984 } |
| 1954 } | 1985 } |
| 1955 #endif | 1986 #endif |
| 1956 | 1987 |
| 1957 sqlite3BitvecDestroy(pPager->pInJournal); | 1988 sqlite3BitvecDestroy(pPager->pInJournal); |
| 1958 pPager->pInJournal = 0; | 1989 pPager->pInJournal = 0; |
| 1959 pPager->nRec = 0; | 1990 pPager->nRec = 0; |
| 1960 sqlite3PcacheCleanAll(pPager->pPCache); | 1991 sqlite3PcacheCleanAll(pPager->pPCache); |
| 1961 sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); | 1992 sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); |
| 1962 | 1993 |
| 1963 if( pagerUseWal(pPager) ){ | 1994 if( pagerUseWal(pPager) ){ |
| 1964 /* Drop the WAL write-lock, if any. Also, if the connection was in | 1995 /* Drop the WAL write-lock, if any. Also, if the connection was in |
| 1965 ** locking_mode=exclusive mode but is no longer, drop the EXCLUSIVE | 1996 ** locking_mode=exclusive mode but is no longer, drop the EXCLUSIVE |
| 1966 ** lock held on the database file. | 1997 ** lock held on the database file. |
| 1967 */ | 1998 */ |
| 1968 rc2 = sqlite3WalEndWriteTransaction(pPager->pWal); | 1999 rc2 = sqlite3WalEndWriteTransaction(pPager->pWal); |
| 1969 assert( rc2==SQLITE_OK ); | 2000 assert( rc2==SQLITE_OK ); |
| 2001 }else if( rc==SQLITE_OK && bCommit && pPager->dbFileSize>pPager->dbSize ){ |
| 2002 /* This branch is taken when committing a transaction in rollback-journal |
| 2003 ** mode if the database file on disk is larger than the database image. |
| 2004 ** At this point the journal has been finalized and the transaction |
| 2005 ** successfully committed, but the EXCLUSIVE lock is still held on the |
| 2006 ** file. So it is safe to truncate the database file to its minimum |
| 2007 ** required size. */ |
| 2008 assert( pPager->eLock==EXCLUSIVE_LOCK ); |
| 2009 rc = pager_truncate(pPager, pPager->dbSize); |
| 1970 } | 2010 } |
| 2011 |
| 2012 if( rc==SQLITE_OK && bCommit && isOpen(pPager->fd) ){ |
| 2013 rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0); |
| 2014 if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; |
| 2015 } |
| 2016 |
| 1971 if( !pPager->exclusiveMode | 2017 if( !pPager->exclusiveMode |
| 1972 && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) | 2018 && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) |
| 1973 ){ | 2019 ){ |
| 1974 rc2 = pagerUnlockDb(pPager, SHARED_LOCK); | 2020 rc2 = pagerUnlockDb(pPager, SHARED_LOCK); |
| 1975 pPager->changeCountDone = 0; | 2021 pPager->changeCountDone = 0; |
| 1976 } | 2022 } |
| 1977 pPager->eState = PAGER_READER; | 2023 pPager->eState = PAGER_READER; |
| 1978 pPager->setMaster = 0; | 2024 pPager->setMaster = 0; |
| 1979 | 2025 |
| 1980 return (rc==SQLITE_OK?rc2:rc); | 2026 return (rc==SQLITE_OK?rc2:rc); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1999 */ | 2045 */ |
| 2000 static void pagerUnlockAndRollback(Pager *pPager){ | 2046 static void pagerUnlockAndRollback(Pager *pPager){ |
| 2001 if( pPager->eState!=PAGER_ERROR && pPager->eState!=PAGER_OPEN ){ | 2047 if( pPager->eState!=PAGER_ERROR && pPager->eState!=PAGER_OPEN ){ |
| 2002 assert( assert_pager_state(pPager) ); | 2048 assert( assert_pager_state(pPager) ); |
| 2003 if( pPager->eState>=PAGER_WRITER_LOCKED ){ | 2049 if( pPager->eState>=PAGER_WRITER_LOCKED ){ |
| 2004 sqlite3BeginBenignMalloc(); | 2050 sqlite3BeginBenignMalloc(); |
| 2005 sqlite3PagerRollback(pPager); | 2051 sqlite3PagerRollback(pPager); |
| 2006 sqlite3EndBenignMalloc(); | 2052 sqlite3EndBenignMalloc(); |
| 2007 }else if( !pPager->exclusiveMode ){ | 2053 }else if( !pPager->exclusiveMode ){ |
| 2008 assert( pPager->eState==PAGER_READER ); | 2054 assert( pPager->eState==PAGER_READER ); |
| 2009 pager_end_transaction(pPager, 0); | 2055 pager_end_transaction(pPager, 0, 0); |
| 2010 } | 2056 } |
| 2011 } | 2057 } |
| 2012 pager_unlock(pPager); | 2058 pager_unlock(pPager); |
| 2013 } | 2059 } |
| 2014 | 2060 |
| 2015 /* | 2061 /* |
| 2016 ** Parameter aData must point to a buffer of pPager->pageSize bytes | 2062 ** Parameter aData must point to a buffer of pPager->pageSize bytes |
| 2017 ** of data. Compute and return a checksum based ont the contents of the | 2063 ** of data. Compute and return a checksum based ont the contents of the |
| 2018 ** page of data and the current value of pPager->cksumInit. | 2064 ** page of data and the current value of pPager->cksumInit. |
| 2019 ** | 2065 ** |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2203 ** in the main journal either because the page is not in cache or else | 2249 ** in the main journal either because the page is not in cache or else |
| 2204 ** the page is marked as needSync==0. | 2250 ** the page is marked as needSync==0. |
| 2205 ** | 2251 ** |
| 2206 ** 2008-04-14: When attempting to vacuum a corrupt database file, it | 2252 ** 2008-04-14: When attempting to vacuum a corrupt database file, it |
| 2207 ** is possible to fail a statement on a database that does not yet exist. | 2253 ** is possible to fail a statement on a database that does not yet exist. |
| 2208 ** Do not attempt to write if database file has never been opened. | 2254 ** Do not attempt to write if database file has never been opened. |
| 2209 */ | 2255 */ |
| 2210 if( pagerUseWal(pPager) ){ | 2256 if( pagerUseWal(pPager) ){ |
| 2211 pPg = 0; | 2257 pPg = 0; |
| 2212 }else{ | 2258 }else{ |
| 2213 pPg = pager_lookup(pPager, pgno); | 2259 pPg = sqlite3PagerLookup(pPager, pgno); |
| 2214 } | 2260 } |
| 2215 assert( pPg || !MEMDB ); | 2261 assert( pPg || !MEMDB ); |
| 2216 assert( pPager->eState!=PAGER_OPEN || pPg==0 ); | 2262 assert( pPager->eState!=PAGER_OPEN || pPg==0 ); |
| 2217 PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n", | 2263 PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n", |
| 2218 PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData), | 2264 PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData), |
| 2219 (isMainJrnl?"main-journal":"sub-journal") | 2265 (isMainJrnl?"main-journal":"sub-journal") |
| 2220 )); | 2266 )); |
| 2221 if( isMainJrnl ){ | 2267 if( isMainJrnl ){ |
| 2222 isSynced = pPager->noSync || (*pOffset <= pPager->journalHdr); | 2268 isSynced = pPager->noSync || (*pOffset <= pPager->journalHdr); |
| 2223 }else{ | 2269 }else{ |
| 2224 isSynced = (pPg==0 || 0==(pPg->flags & PGHDR_NEED_SYNC)); | 2270 isSynced = (pPg==0 || 0==(pPg->flags & PGHDR_NEED_SYNC)); |
| 2225 } | 2271 } |
| 2226 if( isOpen(pPager->fd) | 2272 if( isOpen(pPager->fd) |
| 2227 && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) | 2273 && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) |
| 2228 && isSynced | 2274 && isSynced |
| 2229 ){ | 2275 ){ |
| 2230 i64 ofst = (pgno-1)*(i64)pPager->pageSize; | 2276 i64 ofst = (pgno-1)*(i64)pPager->pageSize; |
| 2231 testcase( !isSavepnt && pPg!=0 && (pPg->flags&PGHDR_NEED_SYNC)!=0 ); | 2277 testcase( !isSavepnt && pPg!=0 && (pPg->flags&PGHDR_NEED_SYNC)!=0 ); |
| 2232 assert( !pagerUseWal(pPager) ); | 2278 assert( !pagerUseWal(pPager) ); |
| 2233 rc = sqlite3OsWrite(pPager->fd, (u8*)aData, pPager->pageSize, ofst); | 2279 rc = sqlite3OsWrite(pPager->fd, (u8 *)aData, pPager->pageSize, ofst); |
| 2234 if( pgno>pPager->dbFileSize ){ | 2280 if( pgno>pPager->dbFileSize ){ |
| 2235 pPager->dbFileSize = pgno; | 2281 pPager->dbFileSize = pgno; |
| 2236 } | 2282 } |
| 2237 if( pPager->pBackup ){ | 2283 if( pPager->pBackup ){ |
| 2238 CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM); | 2284 CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM); |
| 2239 sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); | 2285 sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); |
| 2240 CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM, aData); | 2286 CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM, aData); |
| 2241 } | 2287 } |
| 2242 }else if( !isMainJrnl && pPg==0 ){ | 2288 }else if( !isMainJrnl && pPg==0 ){ |
| 2243 /* If this is a rollback of a savepoint and data was not written to | 2289 /* If this is a rollback of a savepoint and data was not written to |
| 2244 ** the database and the page is not in-memory, there is a potential | 2290 ** the database and the page is not in-memory, there is a potential |
| 2245 ** problem. When the page is next fetched by the b-tree layer, it | 2291 ** problem. When the page is next fetched by the b-tree layer, it |
| 2246 ** will be read from the database file, which may or may not be | 2292 ** will be read from the database file, which may or may not be |
| 2247 ** current. | 2293 ** current. |
| 2248 ** | 2294 ** |
| 2249 ** There are a couple of different ways this can happen. All are quite | 2295 ** There are a couple of different ways this can happen. All are quite |
| 2250 ** obscure. When running in synchronous mode, this can only happen | 2296 ** obscure. When running in synchronous mode, this can only happen |
| 2251 ** if the page is on the free-list at the start of the transaction, then | 2297 ** if the page is on the free-list at the start of the transaction, then |
| 2252 ** populated, then moved using sqlite3PagerMovepage(). | 2298 ** populated, then moved using sqlite3PagerMovepage(). |
| 2253 ** | 2299 ** |
| 2254 ** The solution is to add an in-memory page to the cache containing | 2300 ** The solution is to add an in-memory page to the cache containing |
| 2255 ** the data just read from the sub-journal. Mark the page as dirty | 2301 ** the data just read from the sub-journal. Mark the page as dirty |
| 2256 ** and if the pager requires a journal-sync, then mark the page as | 2302 ** and if the pager requires a journal-sync, then mark the page as |
| 2257 ** requiring a journal-sync before it is written. | 2303 ** requiring a journal-sync before it is written. |
| 2258 */ | 2304 */ |
| 2259 assert( isSavepnt ); | 2305 assert( isSavepnt ); |
| 2260 assert( pPager->doNotSpill==0 ); | 2306 assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)==0 ); |
| 2261 pPager->doNotSpill++; | 2307 pPager->doNotSpill |= SPILLFLAG_ROLLBACK; |
| 2262 rc = sqlite3PagerAcquire(pPager, pgno, &pPg, 1); | 2308 rc = sqlite3PagerAcquire(pPager, pgno, &pPg, 1); |
| 2263 assert( pPager->doNotSpill==1 ); | 2309 assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)!=0 ); |
| 2264 pPager->doNotSpill--; | 2310 pPager->doNotSpill &= ~SPILLFLAG_ROLLBACK; |
| 2265 if( rc!=SQLITE_OK ) return rc; | 2311 if( rc!=SQLITE_OK ) return rc; |
| 2266 pPg->flags &= ~PGHDR_NEED_READ; | 2312 pPg->flags &= ~PGHDR_NEED_READ; |
| 2267 sqlite3PcacheMakeDirty(pPg); | 2313 sqlite3PcacheMakeDirty(pPg); |
| 2268 } | 2314 } |
| 2269 if( pPg ){ | 2315 if( pPg ){ |
| 2270 /* No page should ever be explicitly rolled back that is in use, except | 2316 /* No page should ever be explicitly rolled back that is in use, except |
| 2271 ** for page 1 which is held in use in order to keep the lock on the | 2317 ** for page 1 which is held in use in order to keep the lock on the |
| 2272 ** database active. However such a page may be rolled back as a result | 2318 ** database active. However such a page may be rolled back as a result |
| 2273 ** of an internal error resulting in an automatic call to | 2319 ** of an internal error resulting in an automatic call to |
| 2274 ** sqlite3PagerRollback(). | 2320 ** sqlite3PagerRollback(). |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2383 if( rc!=SQLITE_OK ) goto delmaster_out; | 2429 if( rc!=SQLITE_OK ) goto delmaster_out; |
| 2384 | 2430 |
| 2385 /* Load the entire master journal file into space obtained from | 2431 /* Load the entire master journal file into space obtained from |
| 2386 ** sqlite3_malloc() and pointed to by zMasterJournal. Also obtain | 2432 ** sqlite3_malloc() and pointed to by zMasterJournal. Also obtain |
| 2387 ** sufficient space (in zMasterPtr) to hold the names of master | 2433 ** sufficient space (in zMasterPtr) to hold the names of master |
| 2388 ** journal files extracted from regular rollback-journals. | 2434 ** journal files extracted from regular rollback-journals. |
| 2389 */ | 2435 */ |
| 2390 rc = sqlite3OsFileSize(pMaster, &nMasterJournal); | 2436 rc = sqlite3OsFileSize(pMaster, &nMasterJournal); |
| 2391 if( rc!=SQLITE_OK ) goto delmaster_out; | 2437 if( rc!=SQLITE_OK ) goto delmaster_out; |
| 2392 nMasterPtr = pVfs->mxPathname+1; | 2438 nMasterPtr = pVfs->mxPathname+1; |
| 2393 zMasterJournal = sqlite3Malloc((int)nMasterJournal + nMasterPtr + 1); | 2439 zMasterJournal = sqlite3Malloc(nMasterJournal + nMasterPtr + 1); |
| 2394 if( !zMasterJournal ){ | 2440 if( !zMasterJournal ){ |
| 2395 rc = SQLITE_NOMEM; | 2441 rc = SQLITE_NOMEM; |
| 2396 goto delmaster_out; | 2442 goto delmaster_out; |
| 2397 } | 2443 } |
| 2398 zMasterPtr = &zMasterJournal[nMasterJournal+1]; | 2444 zMasterPtr = &zMasterJournal[nMasterJournal+1]; |
| 2399 rc = sqlite3OsRead(pMaster, zMasterJournal, (int)nMasterJournal, 0); | 2445 rc = sqlite3OsRead(pMaster, zMasterJournal, (int)nMasterJournal, 0); |
| 2400 if( rc!=SQLITE_OK ) goto delmaster_out; | 2446 if( rc!=SQLITE_OK ) goto delmaster_out; |
| 2401 zMasterJournal[nMasterJournal] = 0; | 2447 zMasterJournal[nMasterJournal] = 0; |
| 2402 | 2448 |
| 2403 zJournal = zMasterJournal; | 2449 zJournal = zMasterJournal; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2452 ** This function is used to change the actual size of the database | 2498 ** This function is used to change the actual size of the database |
| 2453 ** file in the file-system. This only happens when committing a transaction, | 2499 ** file in the file-system. This only happens when committing a transaction, |
| 2454 ** or rolling back a transaction (including rolling back a hot-journal). | 2500 ** or rolling back a transaction (including rolling back a hot-journal). |
| 2455 ** | 2501 ** |
| 2456 ** If the main database file is not open, or the pager is not in either | 2502 ** If the main database file is not open, or the pager is not in either |
| 2457 ** DBMOD or OPEN state, this function is a no-op. Otherwise, the size | 2503 ** DBMOD or OPEN state, this function is a no-op. Otherwise, the size |
| 2458 ** of the file is changed to nPage pages (nPage*pPager->pageSize bytes). | 2504 ** of the file is changed to nPage pages (nPage*pPager->pageSize bytes). |
| 2459 ** If the file on disk is currently larger than nPage pages, then use the VFS | 2505 ** If the file on disk is currently larger than nPage pages, then use the VFS |
| 2460 ** xTruncate() method to truncate it. | 2506 ** xTruncate() method to truncate it. |
| 2461 ** | 2507 ** |
| 2462 ** Or, it might might be the case that the file on disk is smaller than | 2508 ** Or, it might be the case that the file on disk is smaller than |
| 2463 ** nPage pages. Some operating system implementations can get confused if | 2509 ** nPage pages. Some operating system implementations can get confused if |
| 2464 ** you try to truncate a file to some size that is larger than it | 2510 ** you try to truncate a file to some size that is larger than it |
| 2465 ** currently is, so detect this case and write a single zero byte to | 2511 ** currently is, so detect this case and write a single zero byte to |
| 2466 ** the end of the new file instead. | 2512 ** the end of the new file instead. |
| 2467 ** | 2513 ** |
| 2468 ** If successful, return SQLITE_OK. If an IO error occurs while modifying | 2514 ** If successful, return SQLITE_OK. If an IO error occurs while modifying |
| 2469 ** the database file, return the error code to the caller. | 2515 ** the database file, return the error code to the caller. |
| 2470 */ | 2516 */ |
| 2471 static int pager_truncate(Pager *pPager, Pgno nPage){ | 2517 static int pager_truncate(Pager *pPager, Pgno nPage){ |
| 2472 int rc = SQLITE_OK; | 2518 int rc = SQLITE_OK; |
| 2473 assert( pPager->eState!=PAGER_ERROR ); | 2519 assert( pPager->eState!=PAGER_ERROR ); |
| 2474 assert( pPager->eState!=PAGER_READER ); | 2520 assert( pPager->eState!=PAGER_READER ); |
| 2475 | 2521 |
| 2476 if( isOpen(pPager->fd) | 2522 if( isOpen(pPager->fd) |
| 2477 && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) | 2523 && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) |
| 2478 ){ | 2524 ){ |
| 2479 i64 currentSize, newSize; | 2525 i64 currentSize, newSize; |
| 2480 int szPage = pPager->pageSize; | 2526 int szPage = pPager->pageSize; |
| 2481 assert( pPager->eLock==EXCLUSIVE_LOCK ); | 2527 assert( pPager->eLock==EXCLUSIVE_LOCK ); |
| 2482 /* TODO: Is it safe to use Pager.dbFileSize here? */ | 2528 /* TODO: Is it safe to use Pager.dbFileSize here? */ |
| 2483 rc = sqlite3OsFileSize(pPager->fd, ¤tSize); | 2529 rc = sqlite3OsFileSize(pPager->fd, ¤tSize); |
| 2484 newSize = szPage*(i64)nPage; | 2530 newSize = szPage*(i64)nPage; |
| 2485 if( rc==SQLITE_OK && currentSize!=newSize ){ | 2531 if( rc==SQLITE_OK && currentSize!=newSize ){ |
| 2486 if( currentSize>newSize ){ | 2532 if( currentSize>newSize ){ |
| 2487 rc = sqlite3OsTruncate(pPager->fd, newSize); | 2533 rc = sqlite3OsTruncate(pPager->fd, newSize); |
| 2488 }else{ | 2534 }else if( (currentSize+szPage)<=newSize ){ |
| 2489 char *pTmp = pPager->pTmpSpace; | 2535 char *pTmp = pPager->pTmpSpace; |
| 2490 memset(pTmp, 0, szPage); | 2536 memset(pTmp, 0, szPage); |
| 2491 testcase( (newSize-szPage) < currentSize ); | |
| 2492 testcase( (newSize-szPage) == currentSize ); | 2537 testcase( (newSize-szPage) == currentSize ); |
| 2493 testcase( (newSize-szPage) > currentSize ); | 2538 testcase( (newSize-szPage) > currentSize ); |
| 2494 rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage); | 2539 rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage); |
| 2495 } | 2540 } |
| 2496 if( rc==SQLITE_OK ){ | 2541 if( rc==SQLITE_OK ){ |
| 2497 pPager->dbFileSize = nPage; | 2542 pPager->dbFileSize = nPage; |
| 2498 } | 2543 } |
| 2499 } | 2544 } |
| 2500 } | 2545 } |
| 2501 return rc; | 2546 return rc; |
| 2502 } | 2547 } |
| 2503 | 2548 |
| 2504 /* | 2549 /* |
| 2550 ** Return a sanitized version of the sector-size of OS file pFile. The |
| 2551 ** return value is guaranteed to lie between 32 and MAX_SECTOR_SIZE. |
| 2552 */ |
| 2553 int sqlite3SectorSize(sqlite3_file *pFile){ |
| 2554 int iRet = sqlite3OsSectorSize(pFile); |
| 2555 if( iRet<32 ){ |
| 2556 iRet = 512; |
| 2557 }else if( iRet>MAX_SECTOR_SIZE ){ |
| 2558 assert( MAX_SECTOR_SIZE>=512 ); |
| 2559 iRet = MAX_SECTOR_SIZE; |
| 2560 } |
| 2561 return iRet; |
| 2562 } |
| 2563 |
| 2564 /* |
| 2505 ** Set the value of the Pager.sectorSize variable for the given | 2565 ** Set the value of the Pager.sectorSize variable for the given |
| 2506 ** pager based on the value returned by the xSectorSize method | 2566 ** pager based on the value returned by the xSectorSize method |
| 2507 ** of the open database file. The sector size will be used used | 2567 ** of the open database file. The sector size will be used |
| 2508 ** to determine the size and alignment of journal header and | 2568 ** to determine the size and alignment of journal header and |
| 2509 ** master journal pointers within created journal files. | 2569 ** master journal pointers within created journal files. |
| 2510 ** | 2570 ** |
| 2511 ** For temporary files the effective sector size is always 512 bytes. | 2571 ** For temporary files the effective sector size is always 512 bytes. |
| 2512 ** | 2572 ** |
| 2513 ** Otherwise, for non-temporary files, the effective sector size is | 2573 ** Otherwise, for non-temporary files, the effective sector size is |
| 2514 ** the value returned by the xSectorSize() method rounded up to 32 if | 2574 ** the value returned by the xSectorSize() method rounded up to 32 if |
| 2515 ** it is less than 32, or rounded down to MAX_SECTOR_SIZE if it | 2575 ** it is less than 32, or rounded down to MAX_SECTOR_SIZE if it |
| 2516 ** is greater than MAX_SECTOR_SIZE. | 2576 ** is greater than MAX_SECTOR_SIZE. |
| 2577 ** |
| 2578 ** If the file has the SQLITE_IOCAP_POWERSAFE_OVERWRITE property, then set |
| 2579 ** the effective sector size to its minimum value (512). The purpose of |
| 2580 ** pPager->sectorSize is to define the "blast radius" of bytes that |
| 2581 ** might change if a crash occurs while writing to a single byte in |
| 2582 ** that range. But with POWERSAFE_OVERWRITE, the blast radius is zero |
| 2583 ** (that is what POWERSAFE_OVERWRITE means), so we minimize the sector |
| 2584 ** size. For backwards compatibility of the rollback journal file format, |
| 2585 ** we cannot reduce the effective sector size below 512. |
| 2517 */ | 2586 */ |
| 2518 static void setSectorSize(Pager *pPager){ | 2587 static void setSectorSize(Pager *pPager){ |
| 2519 assert( isOpen(pPager->fd) || pPager->tempFile ); | 2588 assert( isOpen(pPager->fd) || pPager->tempFile ); |
| 2520 | 2589 |
| 2521 if( !pPager->tempFile ){ | 2590 if( pPager->tempFile |
| 2591 || (sqlite3OsDeviceCharacteristics(pPager->fd) & |
| 2592 SQLITE_IOCAP_POWERSAFE_OVERWRITE)!=0 |
| 2593 ){ |
| 2522 /* Sector size doesn't matter for temporary files. Also, the file | 2594 /* Sector size doesn't matter for temporary files. Also, the file |
| 2523 ** may not have been opened yet, in which case the OsSectorSize() | 2595 ** may not have been opened yet, in which case the OsSectorSize() |
| 2524 ** call will segfault. | 2596 ** call will segfault. */ |
| 2525 */ | |
| 2526 pPager->sectorSize = sqlite3OsSectorSize(pPager->fd); | |
| 2527 } | |
| 2528 if( pPager->sectorSize<32 ){ | |
| 2529 pPager->sectorSize = 512; | 2597 pPager->sectorSize = 512; |
| 2530 } | 2598 }else{ |
| 2531 if( pPager->sectorSize>MAX_SECTOR_SIZE ){ | 2599 pPager->sectorSize = sqlite3SectorSize(pPager->fd); |
| 2532 assert( MAX_SECTOR_SIZE>=512 ); | |
| 2533 pPager->sectorSize = MAX_SECTOR_SIZE; | |
| 2534 } | 2600 } |
| 2535 } | 2601 } |
| 2536 | 2602 |
| 2537 /* | 2603 /* |
| 2538 ** Playback the journal and thus restore the database file to | 2604 ** Playback the journal and thus restore the database file to |
| 2539 ** the state it was in before we started making changes. | 2605 ** the state it was in before we started making changes. |
| 2540 ** | 2606 ** |
| 2541 ** The journal file format is as follows: | 2607 ** The journal file format is as follows: |
| 2542 ** | 2608 ** |
| 2543 ** (1) 8 byte prefix. A copy of aJournalMagic[]. | 2609 ** (1) 8 byte prefix. A copy of aJournalMagic[]. |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2594 static int pager_playback(Pager *pPager, int isHot){ | 2660 static int pager_playback(Pager *pPager, int isHot){ |
| 2595 sqlite3_vfs *pVfs = pPager->pVfs; | 2661 sqlite3_vfs *pVfs = pPager->pVfs; |
| 2596 i64 szJ; /* Size of the journal file in bytes */ | 2662 i64 szJ; /* Size of the journal file in bytes */ |
| 2597 u32 nRec; /* Number of Records in the journal */ | 2663 u32 nRec; /* Number of Records in the journal */ |
| 2598 u32 u; /* Unsigned loop counter */ | 2664 u32 u; /* Unsigned loop counter */ |
| 2599 Pgno mxPg = 0; /* Size of the original file in pages */ | 2665 Pgno mxPg = 0; /* Size of the original file in pages */ |
| 2600 int rc; /* Result code of a subroutine */ | 2666 int rc; /* Result code of a subroutine */ |
| 2601 int res = 1; /* Value returned by sqlite3OsAccess() */ | 2667 int res = 1; /* Value returned by sqlite3OsAccess() */ |
| 2602 char *zMaster = 0; /* Name of master journal file if any */ | 2668 char *zMaster = 0; /* Name of master journal file if any */ |
| 2603 int needPagerReset; /* True to reset page prior to first page rollback */ | 2669 int needPagerReset; /* True to reset page prior to first page rollback */ |
| 2670 int nPlayback = 0; /* Total number of pages restored from journal */ |
| 2604 | 2671 |
| 2605 /* Figure out how many records are in the journal. Abort early if | 2672 /* Figure out how many records are in the journal. Abort early if |
| 2606 ** the journal is empty. | 2673 ** the journal is empty. |
| 2607 */ | 2674 */ |
| 2608 assert( isOpen(pPager->jfd) ); | 2675 assert( isOpen(pPager->jfd) ); |
| 2609 rc = sqlite3OsFileSize(pPager->jfd, &szJ); | 2676 rc = sqlite3OsFileSize(pPager->jfd, &szJ); |
| 2610 if( rc!=SQLITE_OK ){ | 2677 if( rc!=SQLITE_OK ){ |
| 2611 goto end_playback; | 2678 goto end_playback; |
| 2612 } | 2679 } |
| 2613 | 2680 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2694 | 2761 |
| 2695 /* Copy original pages out of the journal and back into the | 2762 /* Copy original pages out of the journal and back into the |
| 2696 ** database file and/or page cache. | 2763 ** database file and/or page cache. |
| 2697 */ | 2764 */ |
| 2698 for(u=0; u<nRec; u++){ | 2765 for(u=0; u<nRec; u++){ |
| 2699 if( needPagerReset ){ | 2766 if( needPagerReset ){ |
| 2700 pager_reset(pPager); | 2767 pager_reset(pPager); |
| 2701 needPagerReset = 0; | 2768 needPagerReset = 0; |
| 2702 } | 2769 } |
| 2703 rc = pager_playback_one_page(pPager,&pPager->journalOff,0,1,0); | 2770 rc = pager_playback_one_page(pPager,&pPager->journalOff,0,1,0); |
| 2704 if( rc!=SQLITE_OK ){ | 2771 if( rc==SQLITE_OK ){ |
| 2772 nPlayback++; |
| 2773 }else{ |
| 2705 if( rc==SQLITE_DONE ){ | 2774 if( rc==SQLITE_DONE ){ |
| 2706 rc = SQLITE_OK; | |
| 2707 pPager->journalOff = szJ; | 2775 pPager->journalOff = szJ; |
| 2708 break; | 2776 break; |
| 2709 }else if( rc==SQLITE_IOERR_SHORT_READ ){ | 2777 }else if( rc==SQLITE_IOERR_SHORT_READ ){ |
| 2710 /* If the journal has been truncated, simply stop reading and | 2778 /* If the journal has been truncated, simply stop reading and |
| 2711 ** processing the journal. This might happen if the journal was | 2779 ** processing the journal. This might happen if the journal was |
| 2712 ** not completely written and synced prior to a crash. In that | 2780 ** not completely written and synced prior to a crash. In that |
| 2713 ** case, the database should have never been written in the | 2781 ** case, the database should have never been written in the |
| 2714 ** first place so it is OK to simply abandon the rollback. */ | 2782 ** first place so it is OK to simply abandon the rollback. */ |
| 2715 rc = SQLITE_OK; | 2783 rc = SQLITE_OK; |
| 2716 goto end_playback; | 2784 goto end_playback; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2727 } | 2795 } |
| 2728 /*NOTREACHED*/ | 2796 /*NOTREACHED*/ |
| 2729 assert( 0 ); | 2797 assert( 0 ); |
| 2730 | 2798 |
| 2731 end_playback: | 2799 end_playback: |
| 2732 /* Following a rollback, the database file should be back in its original | 2800 /* Following a rollback, the database file should be back in its original |
| 2733 ** state prior to the start of the transaction, so invoke the | 2801 ** state prior to the start of the transaction, so invoke the |
| 2734 ** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the | 2802 ** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the |
| 2735 ** assertion that the transaction counter was modified. | 2803 ** assertion that the transaction counter was modified. |
| 2736 */ | 2804 */ |
| 2737 assert( | 2805 #ifdef SQLITE_DEBUG |
| 2738 pPager->fd->pMethods==0 || | 2806 if( pPager->fd->pMethods ){ |
| 2739 sqlite3OsFileControl(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0)>=SQLITE_OK | 2807 sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0); |
| 2740 ); | 2808 } |
| 2809 #endif |
| 2741 | 2810 |
| 2742 /* If this playback is happening automatically as a result of an IO or | 2811 /* If this playback is happening automatically as a result of an IO or |
| 2743 ** malloc error that occurred after the change-counter was updated but | 2812 ** malloc error that occurred after the change-counter was updated but |
| 2744 ** before the transaction was committed, then the change-counter | 2813 ** before the transaction was committed, then the change-counter |
| 2745 ** modification may just have been reverted. If this happens in exclusive | 2814 ** modification may just have been reverted. If this happens in exclusive |
| 2746 ** mode, then subsequent transactions performed by the connection will not | 2815 ** mode, then subsequent transactions performed by the connection will not |
| 2747 ** update the change-counter at all. This may lead to cache inconsistency | 2816 ** update the change-counter at all. This may lead to cache inconsistency |
| 2748 ** problems for other processes at some point in the future. So, just | 2817 ** problems for other processes at some point in the future. So, just |
| 2749 ** in case this has happened, clear the changeCountDone flag now. | 2818 ** in case this has happened, clear the changeCountDone flag now. |
| 2750 */ | 2819 */ |
| 2751 pPager->changeCountDone = pPager->tempFile; | 2820 pPager->changeCountDone = pPager->tempFile; |
| 2752 | 2821 |
| 2753 if( rc==SQLITE_OK ){ | 2822 if( rc==SQLITE_OK ){ |
| 2754 zMaster = pPager->pTmpSpace; | 2823 zMaster = pPager->pTmpSpace; |
| 2755 rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1); | 2824 rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1); |
| 2756 testcase( rc!=SQLITE_OK ); | 2825 testcase( rc!=SQLITE_OK ); |
| 2757 } | 2826 } |
| 2758 if( rc==SQLITE_OK | 2827 if( rc==SQLITE_OK |
| 2759 && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) | 2828 && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) |
| 2760 ){ | 2829 ){ |
| 2761 rc = sqlite3PagerSync(pPager); | 2830 rc = sqlite3PagerSync(pPager, 0); |
| 2762 } | 2831 } |
| 2763 if( rc==SQLITE_OK ){ | 2832 if( rc==SQLITE_OK ){ |
| 2764 rc = pager_end_transaction(pPager, zMaster[0]!='\0'); | 2833 rc = pager_end_transaction(pPager, zMaster[0]!='\0', 0); |
| 2765 testcase( rc!=SQLITE_OK ); | 2834 testcase( rc!=SQLITE_OK ); |
| 2766 } | 2835 } |
| 2767 if( rc==SQLITE_OK && zMaster[0] && res ){ | 2836 if( rc==SQLITE_OK && zMaster[0] && res ){ |
| 2768 /* If there was a master journal and this routine will return success, | 2837 /* If there was a master journal and this routine will return success, |
| 2769 ** see if it is possible to delete the master journal. | 2838 ** see if it is possible to delete the master journal. |
| 2770 */ | 2839 */ |
| 2771 rc = pager_delmaster(pPager, zMaster); | 2840 rc = pager_delmaster(pPager, zMaster); |
| 2772 testcase( rc!=SQLITE_OK ); | 2841 testcase( rc!=SQLITE_OK ); |
| 2773 } | 2842 } |
| 2843 if( isHot && nPlayback ){ |
| 2844 sqlite3_log(SQLITE_NOTICE_RECOVER_ROLLBACK, "recovered %d pages from %s", |
| 2845 nPlayback, pPager->zJournal); |
| 2846 } |
| 2774 | 2847 |
| 2775 /* The Pager.sectorSize variable may have been updated while rolling | 2848 /* The Pager.sectorSize variable may have been updated while rolling |
| 2776 ** back a journal created by a process with a different sector size | 2849 ** back a journal created by a process with a different sector size |
| 2777 ** value. Reset it to the correct value for this process. | 2850 ** value. Reset it to the correct value for this process. |
| 2778 */ | 2851 */ |
| 2779 setSectorSize(pPager); | 2852 setSectorSize(pPager); |
| 2780 return rc; | 2853 return rc; |
| 2781 } | 2854 } |
| 2782 | 2855 |
| 2783 | 2856 |
| 2784 /* | 2857 /* |
| 2785 ** Read the content for page pPg out of the database file and into | 2858 ** Read the content for page pPg out of the database file and into |
| 2786 ** pPg->pData. A shared lock or greater must be held on the database | 2859 ** pPg->pData. A shared lock or greater must be held on the database |
| 2787 ** file before this function is called. | 2860 ** file before this function is called. |
| 2788 ** | 2861 ** |
| 2789 ** If page 1 is read, then the value of Pager.dbFileVers[] is set to | 2862 ** If page 1 is read, then the value of Pager.dbFileVers[] is set to |
| 2790 ** the value read from the database file. | 2863 ** the value read from the database file. |
| 2791 ** | 2864 ** |
| 2792 ** If an IO error occurs, then the IO error is returned to the caller. | 2865 ** If an IO error occurs, then the IO error is returned to the caller. |
| 2793 ** Otherwise, SQLITE_OK is returned. | 2866 ** Otherwise, SQLITE_OK is returned. |
| 2794 */ | 2867 */ |
| 2795 static int readDbPage(PgHdr *pPg){ | 2868 static int readDbPage(PgHdr *pPg, u32 iFrame){ |
| 2796 Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */ | 2869 Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */ |
| 2797 Pgno pgno = pPg->pgno; /* Page number to read */ | 2870 Pgno pgno = pPg->pgno; /* Page number to read */ |
| 2798 int rc = SQLITE_OK; /* Return code */ | 2871 int rc = SQLITE_OK; /* Return code */ |
| 2799 int isInWal = 0; /* True if page is in log file */ | |
| 2800 int pgsz = pPager->pageSize; /* Number of bytes to read */ | 2872 int pgsz = pPager->pageSize; /* Number of bytes to read */ |
| 2801 | 2873 |
| 2802 assert( pPager->eState>=PAGER_READER && !MEMDB ); | 2874 assert( pPager->eState>=PAGER_READER && !MEMDB ); |
| 2803 assert( isOpen(pPager->fd) ); | 2875 assert( isOpen(pPager->fd) ); |
| 2804 | 2876 |
| 2805 if( NEVER(!isOpen(pPager->fd)) ){ | 2877 #ifndef SQLITE_OMIT_WAL |
| 2806 assert( pPager->tempFile ); | 2878 if( iFrame ){ |
| 2807 memset(pPg->pData, 0, pPager->pageSize); | |
| 2808 return SQLITE_OK; | |
| 2809 } | |
| 2810 | |
| 2811 if( pagerUseWal(pPager) ){ | |
| 2812 /* Try to pull the page from the write-ahead log. */ | 2879 /* Try to pull the page from the write-ahead log. */ |
| 2813 rc = sqlite3WalRead(pPager->pWal, pgno, &isInWal, pgsz, pPg->pData); | 2880 rc = sqlite3WalReadFrame(pPager->pWal, iFrame, pgsz, pPg->pData); |
| 2814 } | 2881 }else |
| 2815 if( rc==SQLITE_OK && !isInWal ){ | 2882 #endif |
| 2883 { |
| 2816 i64 iOffset = (pgno-1)*(i64)pPager->pageSize; | 2884 i64 iOffset = (pgno-1)*(i64)pPager->pageSize; |
| 2817 rc = sqlite3OsRead(pPager->fd, pPg->pData, pgsz, iOffset); | 2885 rc = sqlite3OsRead(pPager->fd, pPg->pData, pgsz, iOffset); |
| 2818 if( rc==SQLITE_IOERR_SHORT_READ ){ | 2886 if( rc==SQLITE_IOERR_SHORT_READ ){ |
| 2819 rc = SQLITE_OK; | 2887 rc = SQLITE_OK; |
| 2820 } | 2888 } |
| 2821 } | 2889 } |
| 2822 | 2890 |
| 2823 if( pgno==1 ){ | 2891 if( pgno==1 ){ |
| 2824 if( rc ){ | 2892 if( rc ){ |
| 2825 /* If the read is unsuccessful, set the dbFileVers[] to something | 2893 /* If the read is unsuccessful, set the dbFileVers[] to something |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2884 ** it is discarded. Otherwise, if there are one or more outstanding | 2952 ** it is discarded. Otherwise, if there are one or more outstanding |
| 2885 ** references, the page content is reloaded from the database. If the | 2953 ** references, the page content is reloaded from the database. If the |
| 2886 ** attempt to reload content from the database is required and fails, | 2954 ** attempt to reload content from the database is required and fails, |
| 2887 ** return an SQLite error code. Otherwise, SQLITE_OK. | 2955 ** return an SQLite error code. Otherwise, SQLITE_OK. |
| 2888 */ | 2956 */ |
| 2889 static int pagerUndoCallback(void *pCtx, Pgno iPg){ | 2957 static int pagerUndoCallback(void *pCtx, Pgno iPg){ |
| 2890 int rc = SQLITE_OK; | 2958 int rc = SQLITE_OK; |
| 2891 Pager *pPager = (Pager *)pCtx; | 2959 Pager *pPager = (Pager *)pCtx; |
| 2892 PgHdr *pPg; | 2960 PgHdr *pPg; |
| 2893 | 2961 |
| 2962 assert( pagerUseWal(pPager) ); |
| 2894 pPg = sqlite3PagerLookup(pPager, iPg); | 2963 pPg = sqlite3PagerLookup(pPager, iPg); |
| 2895 if( pPg ){ | 2964 if( pPg ){ |
| 2896 if( sqlite3PcachePageRefcount(pPg)==1 ){ | 2965 if( sqlite3PcachePageRefcount(pPg)==1 ){ |
| 2897 sqlite3PcacheDrop(pPg); | 2966 sqlite3PcacheDrop(pPg); |
| 2898 }else{ | 2967 }else{ |
| 2899 rc = readDbPage(pPg); | 2968 u32 iFrame = 0; |
| 2969 rc = sqlite3WalFindFrame(pPager->pWal, pPg->pgno, &iFrame); |
| 2970 if( rc==SQLITE_OK ){ |
| 2971 rc = readDbPage(pPg, iFrame); |
| 2972 } |
| 2900 if( rc==SQLITE_OK ){ | 2973 if( rc==SQLITE_OK ){ |
| 2901 pPager->xReiniter(pPg); | 2974 pPager->xReiniter(pPg); |
| 2902 } | 2975 } |
| 2903 sqlite3PagerUnref(pPg); | 2976 sqlite3PagerUnrefNotNull(pPg); |
| 2904 } | 2977 } |
| 2905 } | 2978 } |
| 2906 | 2979 |
| 2907 /* Normally, if a transaction is rolled back, any backup processes are | 2980 /* Normally, if a transaction is rolled back, any backup processes are |
| 2908 ** updated as data is copied out of the rollback journal and into the | 2981 ** updated as data is copied out of the rollback journal and into the |
| 2909 ** database. This is not generally possible with a WAL database, as | 2982 ** database. This is not generally possible with a WAL database, as |
| 2910 ** rollback involves simply truncating the log file. Therefore, if one | 2983 ** rollback involves simply truncating the log file. Therefore, if one |
| 2911 ** or more frames have already been written to the log (and therefore | 2984 ** or more frames have already been written to the log (and therefore |
| 2912 ** also copied into the backup databases) as part of this transaction, | 2985 ** also copied into the backup databases) as part of this transaction, |
| 2913 ** the backups must be restarted. | 2986 ** the backups must be restarted. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2949 ** this function notifies any active backup processes that the pages have | 3022 ** this function notifies any active backup processes that the pages have |
| 2950 ** changed. | 3023 ** changed. |
| 2951 ** | 3024 ** |
| 2952 ** The list of pages passed into this routine is always sorted by page number. | 3025 ** The list of pages passed into this routine is always sorted by page number. |
| 2953 ** Hence, if page 1 appears anywhere on the list, it will be the first page. | 3026 ** Hence, if page 1 appears anywhere on the list, it will be the first page. |
| 2954 */ | 3027 */ |
| 2955 static int pagerWalFrames( | 3028 static int pagerWalFrames( |
| 2956 Pager *pPager, /* Pager object */ | 3029 Pager *pPager, /* Pager object */ |
| 2957 PgHdr *pList, /* List of frames to log */ | 3030 PgHdr *pList, /* List of frames to log */ |
| 2958 Pgno nTruncate, /* Database size after this commit */ | 3031 Pgno nTruncate, /* Database size after this commit */ |
| 2959 int isCommit, /* True if this is a commit */ | 3032 int isCommit /* True if this is a commit */ |
| 2960 int syncFlags /* Flags to pass to OsSync() (or 0) */ | |
| 2961 ){ | 3033 ){ |
| 2962 int rc; /* Return code */ | 3034 int rc; /* Return code */ |
| 3035 int nList; /* Number of pages in pList */ |
| 2963 #if defined(SQLITE_DEBUG) || defined(SQLITE_CHECK_PAGES) | 3036 #if defined(SQLITE_DEBUG) || defined(SQLITE_CHECK_PAGES) |
| 2964 PgHdr *p; /* For looping over pages */ | 3037 PgHdr *p; /* For looping over pages */ |
| 2965 #endif | 3038 #endif |
| 2966 | 3039 |
| 2967 assert( pPager->pWal ); | 3040 assert( pPager->pWal ); |
| 3041 assert( pList ); |
| 2968 #ifdef SQLITE_DEBUG | 3042 #ifdef SQLITE_DEBUG |
| 2969 /* Verify that the page list is in accending order */ | 3043 /* Verify that the page list is in accending order */ |
| 2970 for(p=pList; p && p->pDirty; p=p->pDirty){ | 3044 for(p=pList; p && p->pDirty; p=p->pDirty){ |
| 2971 assert( p->pgno < p->pDirty->pgno ); | 3045 assert( p->pgno < p->pDirty->pgno ); |
| 2972 } | 3046 } |
| 2973 #endif | 3047 #endif |
| 2974 | 3048 |
| 3049 assert( pList->pDirty==0 || isCommit ); |
| 2975 if( isCommit ){ | 3050 if( isCommit ){ |
| 2976 /* If a WAL transaction is being committed, there is no point in writing | 3051 /* If a WAL transaction is being committed, there is no point in writing |
| 2977 ** any pages with page numbers greater than nTruncate into the WAL file. | 3052 ** any pages with page numbers greater than nTruncate into the WAL file. |
| 2978 ** They will never be read by any client. So remove them from the pDirty | 3053 ** They will never be read by any client. So remove them from the pDirty |
| 2979 ** list here. */ | 3054 ** list here. */ |
| 2980 PgHdr *p; | 3055 PgHdr *p; |
| 2981 PgHdr **ppNext = &pList; | 3056 PgHdr **ppNext = &pList; |
| 2982 for(p=pList; (*ppNext = p); p=p->pDirty){ | 3057 nList = 0; |
| 2983 if( p->pgno<=nTruncate ) ppNext = &p->pDirty; | 3058 for(p=pList; (*ppNext = p)!=0; p=p->pDirty){ |
| 3059 if( p->pgno<=nTruncate ){ |
| 3060 ppNext = &p->pDirty; |
| 3061 nList++; |
| 3062 } |
| 2984 } | 3063 } |
| 2985 assert( pList ); | 3064 assert( pList ); |
| 3065 }else{ |
| 3066 nList = 1; |
| 2986 } | 3067 } |
| 3068 pPager->aStat[PAGER_STAT_WRITE] += nList; |
| 2987 | 3069 |
| 2988 if( pList->pgno==1 ) pager_write_changecounter(pList); | 3070 if( pList->pgno==1 ) pager_write_changecounter(pList); |
| 2989 rc = sqlite3WalFrames(pPager->pWal, | 3071 rc = sqlite3WalFrames(pPager->pWal, |
| 2990 pPager->pageSize, pList, nTruncate, isCommit, syncFlags | 3072 pPager->pageSize, pList, nTruncate, isCommit, pPager->walSyncFlags |
| 2991 ); | 3073 ); |
| 2992 if( rc==SQLITE_OK && pPager->pBackup ){ | 3074 if( rc==SQLITE_OK && pPager->pBackup ){ |
| 2993 PgHdr *p; | 3075 PgHdr *p; |
| 2994 for(p=pList; p; p=p->pDirty){ | 3076 for(p=pList; p; p=p->pDirty){ |
| 2995 sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData); | 3077 sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData); |
| 2996 } | 3078 } |
| 2997 } | 3079 } |
| 2998 | 3080 |
| 2999 #ifdef SQLITE_CHECK_PAGES | 3081 #ifdef SQLITE_CHECK_PAGES |
| 3000 pList = sqlite3PcacheDirtyList(pPager->pPCache); | 3082 pList = sqlite3PcacheDirtyList(pPager->pPCache); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 3024 /* sqlite3WalEndReadTransaction() was not called for the previous | 3106 /* sqlite3WalEndReadTransaction() was not called for the previous |
| 3025 ** transaction in locking_mode=EXCLUSIVE. So call it now. If we | 3107 ** transaction in locking_mode=EXCLUSIVE. So call it now. If we |
| 3026 ** are in locking_mode=NORMAL and EndRead() was previously called, | 3108 ** are in locking_mode=NORMAL and EndRead() was previously called, |
| 3027 ** the duplicate call is harmless. | 3109 ** the duplicate call is harmless. |
| 3028 */ | 3110 */ |
| 3029 sqlite3WalEndReadTransaction(pPager->pWal); | 3111 sqlite3WalEndReadTransaction(pPager->pWal); |
| 3030 | 3112 |
| 3031 rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed); | 3113 rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed); |
| 3032 if( rc!=SQLITE_OK || changed ){ | 3114 if( rc!=SQLITE_OK || changed ){ |
| 3033 pager_reset(pPager); | 3115 pager_reset(pPager); |
| 3116 if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); |
| 3034 } | 3117 } |
| 3035 | 3118 |
| 3036 return rc; | 3119 return rc; |
| 3037 } | 3120 } |
| 3038 #endif | 3121 #endif |
| 3039 | 3122 |
| 3040 /* | 3123 /* |
| 3041 ** This function is called as part of the transition from PAGER_OPEN | 3124 ** This function is called as part of the transition from PAGER_OPEN |
| 3042 ** to PAGER_READER state to determine the size of the database file | 3125 ** to PAGER_READER state to determine the size of the database file |
| 3043 ** in pages (assuming the page size currently stored in Pager.pageSize). | 3126 ** in pages (assuming the page size currently stored in Pager.pageSize). |
| 3044 ** | 3127 ** |
| 3045 ** If no error occurs, SQLITE_OK is returned and the size of the database | 3128 ** If no error occurs, SQLITE_OK is returned and the size of the database |
| 3046 ** in pages is stored in *pnPage. Otherwise, an error code (perhaps | 3129 ** in pages is stored in *pnPage. Otherwise, an error code (perhaps |
| 3047 ** SQLITE_IOERR_FSTAT) is returned and *pnPage is left unmodified. | 3130 ** SQLITE_IOERR_FSTAT) is returned and *pnPage is left unmodified. |
| 3048 */ | 3131 */ |
| 3049 static int pagerPagecount(Pager *pPager, Pgno *pnPage){ | 3132 static int pagerPagecount(Pager *pPager, Pgno *pnPage){ |
| 3050 Pgno nPage; /* Value to return via *pnPage */ | 3133 Pgno nPage; /* Value to return via *pnPage */ |
| 3051 | 3134 |
| 3052 /* Query the WAL sub-system for the database size. The WalDbsize() | 3135 /* Query the WAL sub-system for the database size. The WalDbsize() |
| 3053 ** function returns zero if the WAL is not open (i.e. Pager.pWal==0), or | 3136 ** function returns zero if the WAL is not open (i.e. Pager.pWal==0), or |
| 3054 ** if the database size is not available. The database size is not | 3137 ** if the database size is not available. The database size is not |
| 3055 ** available from the WAL sub-system if the log file is empty or | 3138 ** available from the WAL sub-system if the log file is empty or |
| 3056 ** contains no valid committed transactions. | 3139 ** contains no valid committed transactions. |
| 3057 */ | 3140 */ |
| 3058 assert( pPager->eState==PAGER_OPEN ); | 3141 assert( pPager->eState==PAGER_OPEN ); |
| 3059 assert( pPager->eLock>=SHARED_LOCK || pPager->noReadlock ); | 3142 assert( pPager->eLock>=SHARED_LOCK ); |
| 3060 nPage = sqlite3WalDbsize(pPager->pWal); | 3143 nPage = sqlite3WalDbsize(pPager->pWal); |
| 3061 | 3144 |
| 3062 /* If the database size was not available from the WAL sub-system, | 3145 /* If the database size was not available from the WAL sub-system, |
| 3063 ** determine it based on the size of the database file. If the size | 3146 ** determine it based on the size of the database file. If the size |
| 3064 ** of the database file is not an integer multiple of the page-size, | 3147 ** of the database file is not an integer multiple of the page-size, |
| 3065 ** round down to the nearest page. Except, any file larger than 0 | 3148 ** round down to the nearest page. Except, any file larger than 0 |
| 3066 ** bytes in size is considered to contain at least one page. | 3149 ** bytes in size is considered to contain at least one page. |
| 3067 */ | 3150 */ |
| 3068 if( nPage==0 ){ | 3151 if( nPage==0 ){ |
| 3069 i64 n = 0; /* Size of db file in bytes */ | 3152 i64 n = 0; /* Size of db file in bytes */ |
| 3070 assert( isOpen(pPager->fd) || pPager->tempFile ); | 3153 assert( isOpen(pPager->fd) || pPager->tempFile ); |
| 3071 if( isOpen(pPager->fd) ){ | 3154 if( isOpen(pPager->fd) ){ |
| 3072 int rc = sqlite3OsFileSize(pPager->fd, &n); | 3155 int rc = sqlite3OsFileSize(pPager->fd, &n); |
| 3073 if( rc!=SQLITE_OK ){ | 3156 if( rc!=SQLITE_OK ){ |
| 3074 return rc; | 3157 return rc; |
| 3075 } | 3158 } |
| 3076 } | 3159 } |
| 3077 nPage = (Pgno)(n / pPager->pageSize); | 3160 nPage = (Pgno)((n+pPager->pageSize-1) / pPager->pageSize); |
| 3078 if( nPage==0 && n>0 ){ | |
| 3079 nPage = 1; | |
| 3080 } | |
| 3081 } | 3161 } |
| 3082 | 3162 |
| 3083 /* If the current number of pages in the file is greater than the | 3163 /* If the current number of pages in the file is greater than the |
| 3084 ** configured maximum pager number, increase the allowed limit so | 3164 ** configured maximum pager number, increase the allowed limit so |
| 3085 ** that the file can be read. | 3165 ** that the file can be read. |
| 3086 */ | 3166 */ |
| 3087 if( nPage>pPager->mxPgno ){ | 3167 if( nPage>pPager->mxPgno ){ |
| 3088 pPager->mxPgno = (Pgno)nPage; | 3168 pPager->mxPgno = (Pgno)nPage; |
| 3089 } | 3169 } |
| 3090 | 3170 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3107 ** | 3187 ** |
| 3108 ** The caller must hold a SHARED lock on the database file to call this | 3188 ** The caller must hold a SHARED lock on the database file to call this |
| 3109 ** function. Because an EXCLUSIVE lock on the db file is required to delete | 3189 ** function. Because an EXCLUSIVE lock on the db file is required to delete |
| 3110 ** a WAL on a none-empty database, this ensures there is no race condition | 3190 ** a WAL on a none-empty database, this ensures there is no race condition |
| 3111 ** between the xAccess() below and an xDelete() being executed by some | 3191 ** between the xAccess() below and an xDelete() being executed by some |
| 3112 ** other connection. | 3192 ** other connection. |
| 3113 */ | 3193 */ |
| 3114 static int pagerOpenWalIfPresent(Pager *pPager){ | 3194 static int pagerOpenWalIfPresent(Pager *pPager){ |
| 3115 int rc = SQLITE_OK; | 3195 int rc = SQLITE_OK; |
| 3116 assert( pPager->eState==PAGER_OPEN ); | 3196 assert( pPager->eState==PAGER_OPEN ); |
| 3117 assert( pPager->eLock>=SHARED_LOCK || pPager->noReadlock ); | 3197 assert( pPager->eLock>=SHARED_LOCK ); |
| 3118 | 3198 |
| 3119 if( !pPager->tempFile ){ | 3199 if( !pPager->tempFile ){ |
| 3120 int isWal; /* True if WAL file exists */ | 3200 int isWal; /* True if WAL file exists */ |
| 3121 Pgno nPage; /* Size of the database file */ | 3201 Pgno nPage; /* Size of the database file */ |
| 3122 | 3202 |
| 3123 rc = pagerPagecount(pPager, &nPage); | 3203 rc = pagerPagecount(pPager, &nPage); |
| 3124 if( rc ) return rc; | 3204 if( rc ) return rc; |
| 3125 if( nPage==0 ){ | 3205 if( nPage==0 ){ |
| 3126 rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0); | 3206 rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0); |
| 3207 if( rc==SQLITE_IOERR_DELETE_NOENT ) rc = SQLITE_OK; |
| 3127 isWal = 0; | 3208 isWal = 0; |
| 3128 }else{ | 3209 }else{ |
| 3129 rc = sqlite3OsAccess( | 3210 rc = sqlite3OsAccess( |
| 3130 pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &isWal | 3211 pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &isWal |
| 3131 ); | 3212 ); |
| 3132 } | 3213 } |
| 3133 if( rc==SQLITE_OK ){ | 3214 if( rc==SQLITE_OK ){ |
| 3134 if( isWal ){ | 3215 if( isWal ){ |
| 3135 testcase( sqlite3PcachePagecount(pPager->pPCache)==0 ); | 3216 testcase( sqlite3PcachePagecount(pPager->pPCache)==0 ); |
| 3136 rc = sqlite3PagerOpenWal(pPager, 0); | 3217 rc = sqlite3PagerOpenWal(pPager, 0); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3260 assert( rc!=SQLITE_DONE ); | 3341 assert( rc!=SQLITE_DONE ); |
| 3261 } | 3342 } |
| 3262 assert( rc!=SQLITE_OK || pPager->journalOff>=szJ ); | 3343 assert( rc!=SQLITE_OK || pPager->journalOff>=szJ ); |
| 3263 | 3344 |
| 3264 /* Finally, rollback pages from the sub-journal. Page that were | 3345 /* Finally, rollback pages from the sub-journal. Page that were |
| 3265 ** previously rolled back out of the main journal (and are hence in pDone) | 3346 ** previously rolled back out of the main journal (and are hence in pDone) |
| 3266 ** will be skipped. Out-of-range pages are also skipped. | 3347 ** will be skipped. Out-of-range pages are also skipped. |
| 3267 */ | 3348 */ |
| 3268 if( pSavepoint ){ | 3349 if( pSavepoint ){ |
| 3269 u32 ii; /* Loop counter */ | 3350 u32 ii; /* Loop counter */ |
| 3270 i64 offset = pSavepoint->iSubRec*(4+pPager->pageSize); | 3351 i64 offset = (i64)pSavepoint->iSubRec*(4+pPager->pageSize); |
| 3271 | 3352 |
| 3272 if( pagerUseWal(pPager) ){ | 3353 if( pagerUseWal(pPager) ){ |
| 3273 rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData); | 3354 rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData); |
| 3274 } | 3355 } |
| 3275 for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && ii<pPager->nSubRec; ii++){ | 3356 for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && ii<pPager->nSubRec; ii++){ |
| 3276 assert( offset==ii*(4+pPager->pageSize) ); | 3357 assert( offset==(i64)ii*(4+pPager->pageSize) ); |
| 3277 rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1); | 3358 rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1); |
| 3278 } | 3359 } |
| 3279 assert( rc!=SQLITE_DONE ); | 3360 assert( rc!=SQLITE_DONE ); |
| 3280 } | 3361 } |
| 3281 | 3362 |
| 3282 sqlite3BitvecDestroy(pDone); | 3363 sqlite3BitvecDestroy(pDone); |
| 3283 if( rc==SQLITE_OK ){ | 3364 if( rc==SQLITE_OK ){ |
| 3284 pPager->journalOff = szJ; | 3365 pPager->journalOff = szJ; |
| 3285 } | 3366 } |
| 3286 | 3367 |
| 3287 return rc; | 3368 return rc; |
| 3288 } | 3369 } |
| 3289 | 3370 |
| 3290 /* | 3371 /* |
| 3291 ** Change the maximum number of in-memory pages that are allowed. | 3372 ** Change the maximum number of in-memory pages that are allowed. |
| 3292 */ | 3373 */ |
| 3293 void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){ | 3374 void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){ |
| 3294 sqlite3PcacheSetCachesize(pPager->pPCache, mxPage); | 3375 sqlite3PcacheSetCachesize(pPager->pPCache, mxPage); |
| 3295 } | 3376 } |
| 3296 | 3377 |
| 3297 /* | 3378 /* |
| 3298 ** Adjust the robustness of the database to damage due to OS crashes | 3379 ** Invoke SQLITE_FCNTL_MMAP_SIZE based on the current value of szMmap. |
| 3299 ** or power failures by changing the number of syncs()s when writing | 3380 */ |
| 3300 ** the rollback journal. There are three levels: | 3381 static void pagerFixMaplimit(Pager *pPager){ |
| 3382 #if SQLITE_MAX_MMAP_SIZE>0 |
| 3383 sqlite3_file *fd = pPager->fd; |
| 3384 if( isOpen(fd) && fd->pMethods->iVersion>=3 ){ |
| 3385 sqlite3_int64 sz; |
| 3386 sz = pPager->szMmap; |
| 3387 pPager->bUseFetch = (sz>0); |
| 3388 sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_MMAP_SIZE, &sz); |
| 3389 } |
| 3390 #endif |
| 3391 } |
| 3392 |
| 3393 /* |
| 3394 ** Change the maximum size of any memory mapping made of the database file. |
| 3395 */ |
| 3396 void sqlite3PagerSetMmapLimit(Pager *pPager, sqlite3_int64 szMmap){ |
| 3397 pPager->szMmap = szMmap; |
| 3398 pagerFixMaplimit(pPager); |
| 3399 } |
| 3400 |
| 3401 /* |
| 3402 ** Free as much memory as possible from the pager. |
| 3403 */ |
| 3404 void sqlite3PagerShrink(Pager *pPager){ |
| 3405 sqlite3PcacheShrink(pPager->pPCache); |
| 3406 } |
| 3407 |
| 3408 /* |
| 3409 ** Adjust settings of the pager to those specified in the pgFlags parameter. |
| 3410 ** |
| 3411 ** The "level" in pgFlags & PAGER_SYNCHRONOUS_MASK sets the robustness |
| 3412 ** of the database to damage due to OS crashes or power failures by |
| 3413 ** changing the number of syncs()s when writing the journals. |
| 3414 ** There are three levels: |
| 3301 ** | 3415 ** |
| 3302 ** OFF sqlite3OsSync() is never called. This is the default | 3416 ** OFF sqlite3OsSync() is never called. This is the default |
| 3303 ** for temporary and transient files. | 3417 ** for temporary and transient files. |
| 3304 ** | 3418 ** |
| 3305 ** NORMAL The journal is synced once before writes begin on the | 3419 ** NORMAL The journal is synced once before writes begin on the |
| 3306 ** database. This is normally adequate protection, but | 3420 ** database. This is normally adequate protection, but |
| 3307 ** it is theoretically possible, though very unlikely, | 3421 ** it is theoretically possible, though very unlikely, |
| 3308 ** that an inopertune power failure could leave the journal | 3422 ** that an inopertune power failure could leave the journal |
| 3309 ** in a state which would cause damage to the database | 3423 ** in a state which would cause damage to the database |
| 3310 ** when it is rolled back. | 3424 ** when it is rolled back. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 3331 ** using fcntl(F_FULLFSYNC). SQLITE_SYNC_NORMAL means to do an | 3445 ** using fcntl(F_FULLFSYNC). SQLITE_SYNC_NORMAL means to do an |
| 3332 ** ordinary fsync() call. There is no difference between SQLITE_SYNC_FULL | 3446 ** ordinary fsync() call. There is no difference between SQLITE_SYNC_FULL |
| 3333 ** and SQLITE_SYNC_NORMAL on platforms other than MacOSX. But the | 3447 ** and SQLITE_SYNC_NORMAL on platforms other than MacOSX. But the |
| 3334 ** synchronous=FULL versus synchronous=NORMAL setting determines when | 3448 ** synchronous=FULL versus synchronous=NORMAL setting determines when |
| 3335 ** the xSync primitive is called and is relevant to all platforms. | 3449 ** the xSync primitive is called and is relevant to all platforms. |
| 3336 ** | 3450 ** |
| 3337 ** Numeric values associated with these states are OFF==1, NORMAL=2, | 3451 ** Numeric values associated with these states are OFF==1, NORMAL=2, |
| 3338 ** and FULL=3. | 3452 ** and FULL=3. |
| 3339 */ | 3453 */ |
| 3340 #ifndef SQLITE_OMIT_PAGER_PRAGMAS | 3454 #ifndef SQLITE_OMIT_PAGER_PRAGMAS |
| 3341 void sqlite3PagerSetSafetyLevel( | 3455 void sqlite3PagerSetFlags( |
| 3342 Pager *pPager, /* The pager to set safety level for */ | 3456 Pager *pPager, /* The pager to set safety level for */ |
| 3343 int level, /* PRAGMA synchronous. 1=OFF, 2=NORMAL, 3=FULL */ | 3457 unsigned pgFlags /* Various flags */ |
| 3344 int bFullFsync, /* PRAGMA fullfsync */ | |
| 3345 int bCkptFullFsync /* PRAGMA checkpoint_fullfsync */ | |
| 3346 ){ | 3458 ){ |
| 3459 unsigned level = pgFlags & PAGER_SYNCHRONOUS_MASK; |
| 3347 assert( level>=1 && level<=3 ); | 3460 assert( level>=1 && level<=3 ); |
| 3348 pPager->noSync = (level==1 || pPager->tempFile) ?1:0; | 3461 pPager->noSync = (level==1 || pPager->tempFile) ?1:0; |
| 3349 pPager->fullSync = (level==3 && !pPager->tempFile) ?1:0; | 3462 pPager->fullSync = (level==3 && !pPager->tempFile) ?1:0; |
| 3350 if( pPager->noSync ){ | 3463 if( pPager->noSync ){ |
| 3351 pPager->syncFlags = 0; | 3464 pPager->syncFlags = 0; |
| 3352 pPager->ckptSyncFlags = 0; | 3465 pPager->ckptSyncFlags = 0; |
| 3353 }else if( bFullFsync ){ | 3466 }else if( pgFlags & PAGER_FULLFSYNC ){ |
| 3354 pPager->syncFlags = SQLITE_SYNC_FULL; | 3467 pPager->syncFlags = SQLITE_SYNC_FULL; |
| 3355 pPager->ckptSyncFlags = SQLITE_SYNC_FULL; | 3468 pPager->ckptSyncFlags = SQLITE_SYNC_FULL; |
| 3356 }else if( bCkptFullFsync ){ | 3469 }else if( pgFlags & PAGER_CKPT_FULLFSYNC ){ |
| 3357 pPager->syncFlags = SQLITE_SYNC_NORMAL; | 3470 pPager->syncFlags = SQLITE_SYNC_NORMAL; |
| 3358 pPager->ckptSyncFlags = SQLITE_SYNC_FULL; | 3471 pPager->ckptSyncFlags = SQLITE_SYNC_FULL; |
| 3359 }else{ | 3472 }else{ |
| 3360 pPager->syncFlags = SQLITE_SYNC_NORMAL; | 3473 pPager->syncFlags = SQLITE_SYNC_NORMAL; |
| 3361 pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL; | 3474 pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL; |
| 3362 } | 3475 } |
| 3476 pPager->walSyncFlags = pPager->syncFlags; |
| 3477 if( pPager->fullSync ){ |
| 3478 pPager->walSyncFlags |= WAL_SYNC_TRANSACTIONS; |
| 3479 } |
| 3480 if( pgFlags & PAGER_CACHESPILL ){ |
| 3481 pPager->doNotSpill &= ~SPILLFLAG_OFF; |
| 3482 }else{ |
| 3483 pPager->doNotSpill |= SPILLFLAG_OFF; |
| 3484 } |
| 3363 } | 3485 } |
| 3364 #endif | 3486 #endif |
| 3365 | 3487 |
| 3366 /* | 3488 /* |
| 3367 ** The following global variable is incremented whenever the library | 3489 ** The following global variable is incremented whenever the library |
| 3368 ** attempts to open a temporary file. This information is used for | 3490 ** attempts to open a temporary file. This information is used for |
| 3369 ** testing and analysis only. | 3491 ** testing and analysis only. |
| 3370 */ | 3492 */ |
| 3371 #ifdef SQLITE_TEST | 3493 #ifdef SQLITE_TEST |
| 3372 int sqlite3_opentemp_count = 0; | 3494 int sqlite3_opentemp_count = 0; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3423 ** RESERVED_LOCK -> EXCLUSIVE_LOCK | Yes | 3545 ** RESERVED_LOCK -> EXCLUSIVE_LOCK | Yes |
| 3424 ** | 3546 ** |
| 3425 ** If the busy-handler callback returns non-zero, the lock is | 3547 ** If the busy-handler callback returns non-zero, the lock is |
| 3426 ** retried. If it returns zero, then the SQLITE_BUSY error is | 3548 ** retried. If it returns zero, then the SQLITE_BUSY error is |
| 3427 ** returned to the caller of the pager API function. | 3549 ** returned to the caller of the pager API function. |
| 3428 */ | 3550 */ |
| 3429 void sqlite3PagerSetBusyhandler( | 3551 void sqlite3PagerSetBusyhandler( |
| 3430 Pager *pPager, /* Pager object */ | 3552 Pager *pPager, /* Pager object */ |
| 3431 int (*xBusyHandler)(void *), /* Pointer to busy-handler function */ | 3553 int (*xBusyHandler)(void *), /* Pointer to busy-handler function */ |
| 3432 void *pBusyHandlerArg /* Argument to pass to xBusyHandler */ | 3554 void *pBusyHandlerArg /* Argument to pass to xBusyHandler */ |
| 3433 ){ | 3555 ){ |
| 3434 pPager->xBusyHandler = xBusyHandler; | 3556 pPager->xBusyHandler = xBusyHandler; |
| 3435 pPager->pBusyHandlerArg = pBusyHandlerArg; | 3557 pPager->pBusyHandlerArg = pBusyHandlerArg; |
| 3558 |
| 3559 if( isOpen(pPager->fd) ){ |
| 3560 void **ap = (void **)&pPager->xBusyHandler; |
| 3561 assert( ((int(*)(void *))(ap[0]))==xBusyHandler ); |
| 3562 assert( ap[1]==pBusyHandlerArg ); |
| 3563 sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap); |
| 3564 } |
| 3436 } | 3565 } |
| 3437 | 3566 |
| 3438 /* | 3567 /* |
| 3439 ** Change the page size used by the Pager object. The new page size | 3568 ** Change the page size used by the Pager object. The new page size |
| 3440 ** is passed in *pPageSize. | 3569 ** is passed in *pPageSize. |
| 3441 ** | 3570 ** |
| 3442 ** If the pager is in the error state when this function is called, it | 3571 ** If the pager is in the error state when this function is called, it |
| 3443 ** is a no-op. The value returned is the error state error code (i.e. | 3572 ** is a no-op. The value returned is the error state error code (i.e. |
| 3444 ** one of SQLITE_IOERR, an SQLITE_IOERR_xxx sub-code or SQLITE_FULL). | 3573 ** one of SQLITE_IOERR, an SQLITE_IOERR_xxx sub-code or SQLITE_FULL). |
| 3445 ** | 3574 ** |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3490 if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){ | 3619 if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){ |
| 3491 rc = sqlite3OsFileSize(pPager->fd, &nByte); | 3620 rc = sqlite3OsFileSize(pPager->fd, &nByte); |
| 3492 } | 3621 } |
| 3493 if( rc==SQLITE_OK ){ | 3622 if( rc==SQLITE_OK ){ |
| 3494 pNew = (char *)sqlite3PageMalloc(pageSize); | 3623 pNew = (char *)sqlite3PageMalloc(pageSize); |
| 3495 if( !pNew ) rc = SQLITE_NOMEM; | 3624 if( !pNew ) rc = SQLITE_NOMEM; |
| 3496 } | 3625 } |
| 3497 | 3626 |
| 3498 if( rc==SQLITE_OK ){ | 3627 if( rc==SQLITE_OK ){ |
| 3499 pager_reset(pPager); | 3628 pager_reset(pPager); |
| 3500 pPager->dbSize = (Pgno)(nByte/pageSize); | 3629 rc = sqlite3PcacheSetPageSize(pPager->pPCache, pageSize); |
| 3501 pPager->pageSize = pageSize; | 3630 } |
| 3631 if( rc==SQLITE_OK ){ |
| 3502 sqlite3PageFree(pPager->pTmpSpace); | 3632 sqlite3PageFree(pPager->pTmpSpace); |
| 3503 pPager->pTmpSpace = pNew; | 3633 pPager->pTmpSpace = pNew; |
| 3504 sqlite3PcacheSetPageSize(pPager->pPCache, pageSize); | 3634 pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize); |
| 3635 pPager->pageSize = pageSize; |
| 3636 }else{ |
| 3637 sqlite3PageFree(pNew); |
| 3505 } | 3638 } |
| 3506 } | 3639 } |
| 3507 | 3640 |
| 3508 *pPageSize = pPager->pageSize; | 3641 *pPageSize = pPager->pageSize; |
| 3509 if( rc==SQLITE_OK ){ | 3642 if( rc==SQLITE_OK ){ |
| 3510 if( nReserve<0 ) nReserve = pPager->nReserve; | 3643 if( nReserve<0 ) nReserve = pPager->nReserve; |
| 3511 assert( nReserve>=0 && nReserve<1000 ); | 3644 assert( nReserve>=0 && nReserve<1000 ); |
| 3512 pPager->nReserve = (i16)nReserve; | 3645 pPager->nReserve = (i16)nReserve; |
| 3513 pagerReportSize(pPager); | 3646 pagerReportSize(pPager); |
| 3647 pagerFixMaplimit(pPager); |
| 3514 } | 3648 } |
| 3515 return rc; | 3649 return rc; |
| 3516 } | 3650 } |
| 3517 | 3651 |
| 3518 /* | 3652 /* |
| 3519 ** Return a pointer to the "temporary page" buffer held internally | 3653 ** Return a pointer to the "temporary page" buffer held internally |
| 3520 ** by the pager. This is a buffer that is big enough to hold the | 3654 ** by the pager. This is a buffer that is big enough to hold the |
| 3521 ** entire content of a database page. This buffer is used internally | 3655 ** entire content of a database page. This buffer is used internally |
| 3522 ** during rollback and will be overwritten whenever a rollback | 3656 ** during rollback and will be overwritten whenever a rollback |
| 3523 ** occurs. But other modules are free to use it too, as long as | 3657 ** occurs. But other modules are free to use it too, as long as |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3627 ** obtain the lock succeeds. | 3761 ** obtain the lock succeeds. |
| 3628 ** | 3762 ** |
| 3629 ** Return SQLITE_OK on success and an error code if we cannot obtain | 3763 ** Return SQLITE_OK on success and an error code if we cannot obtain |
| 3630 ** the lock. If the lock is obtained successfully, set the Pager.state | 3764 ** the lock. If the lock is obtained successfully, set the Pager.state |
| 3631 ** variable to locktype before returning. | 3765 ** variable to locktype before returning. |
| 3632 */ | 3766 */ |
| 3633 static int pager_wait_on_lock(Pager *pPager, int locktype){ | 3767 static int pager_wait_on_lock(Pager *pPager, int locktype){ |
| 3634 int rc; /* Return code */ | 3768 int rc; /* Return code */ |
| 3635 | 3769 |
| 3636 /* Check that this is either a no-op (because the requested lock is | 3770 /* Check that this is either a no-op (because the requested lock is |
| 3637 ** already held, or one of the transistions that the busy-handler | 3771 ** already held), or one of the transitions that the busy-handler |
| 3638 ** may be invoked during, according to the comment above | 3772 ** may be invoked during, according to the comment above |
| 3639 ** sqlite3PagerSetBusyhandler(). | 3773 ** sqlite3PagerSetBusyhandler(). |
| 3640 */ | 3774 */ |
| 3641 assert( (pPager->eLock>=locktype) | 3775 assert( (pPager->eLock>=locktype) |
| 3642 || (pPager->eLock==NO_LOCK && locktype==SHARED_LOCK) | 3776 || (pPager->eLock==NO_LOCK && locktype==SHARED_LOCK) |
| 3643 || (pPager->eLock==RESERVED_LOCK && locktype==EXCLUSIVE_LOCK) | 3777 || (pPager->eLock==RESERVED_LOCK && locktype==EXCLUSIVE_LOCK) |
| 3644 ); | 3778 ); |
| 3645 | 3779 |
| 3646 do { | 3780 do { |
| 3647 rc = pagerLockDb(pPager, locktype); | 3781 rc = pagerLockDb(pPager, locktype); |
| 3648 }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) ); | 3782 }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) ); |
| 3649 return rc; | 3783 return rc; |
| 3650 } | 3784 } |
| 3651 | 3785 |
| 3652 /* | 3786 /* |
| 3653 ** Function assertTruncateConstraint(pPager) checks that one of the | 3787 ** Function assertTruncateConstraint(pPager) checks that one of the |
| 3654 ** following is true for all dirty pages currently in the page-cache: | 3788 ** following is true for all dirty pages currently in the page-cache: |
| 3655 ** | 3789 ** |
| 3656 ** a) The page number is less than or equal to the size of the | 3790 ** a) The page number is less than or equal to the size of the |
| 3657 ** current database image, in pages, OR | 3791 ** current database image, in pages, OR |
| 3658 ** | 3792 ** |
| 3659 ** b) if the page content were written at this time, it would not | 3793 ** b) if the page content were written at this time, it would not |
| 3660 ** be necessary to write the current content out to the sub-journal | 3794 ** be necessary to write the current content out to the sub-journal |
| 3661 ** (as determined by function subjRequiresPage()). | 3795 ** (as determined by function subjRequiresPage()). |
| 3662 ** | 3796 ** |
| 3663 ** If the condition asserted by this function were not true, and the | 3797 ** If the condition asserted by this function were not true, and the |
| 3664 ** dirty page were to be discarded from the cache via the pagerStress() | 3798 ** dirty page were to be discarded from the cache via the pagerStress() |
| 3665 ** routine, pagerStress() would not write the current page content to | 3799 ** routine, pagerStress() would not write the current page content to |
| 3666 ** the database file. If a savepoint transaction were rolled back after | 3800 ** the database file. If a savepoint transaction were rolled back after |
| 3667 ** this happened, the correct behaviour would be to restore the current | 3801 ** this happened, the correct behavior would be to restore the current |
| 3668 ** content of the page. However, since this content is not present in either | 3802 ** content of the page. However, since this content is not present in either |
| 3669 ** the database file or the portion of the rollback journal and | 3803 ** the database file or the portion of the rollback journal and |
| 3670 ** sub-journal rolled back the content could not be restored and the | 3804 ** sub-journal rolled back the content could not be restored and the |
| 3671 ** database image would become corrupt. It is therefore fortunate that | 3805 ** database image would become corrupt. It is therefore fortunate that |
| 3672 ** this circumstance cannot arise. | 3806 ** this circumstance cannot arise. |
| 3673 */ | 3807 */ |
| 3674 #if defined(SQLITE_DEBUG) | 3808 #if defined(SQLITE_DEBUG) |
| 3675 static void assertTruncateConstraintCb(PgHdr *pPg){ | 3809 static void assertTruncateConstraintCb(PgHdr *pPg){ |
| 3676 assert( pPg->flags&PGHDR_DIRTY ); | 3810 assert( pPg->flags&PGHDR_DIRTY ); |
| 3677 assert( !subjRequiresPage(pPg) || pPg->pgno<=pPg->pPager->dbSize ); | 3811 assert( !subjRequiresPage(pPg) || pPg->pgno<=pPg->pPager->dbSize ); |
| 3678 } | 3812 } |
| 3679 static void assertTruncateConstraint(Pager *pPager){ | 3813 static void assertTruncateConstraint(Pager *pPager){ |
| 3680 sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb); | 3814 sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb); |
| 3681 } | 3815 } |
| 3682 #else | 3816 #else |
| 3683 # define assertTruncateConstraint(pPager) | 3817 # define assertTruncateConstraint(pPager) |
| 3684 #endif | 3818 #endif |
| 3685 | 3819 |
| 3686 /* | 3820 /* |
| 3687 ** Truncate the in-memory database file image to nPage pages. This | 3821 ** Truncate the in-memory database file image to nPage pages. This |
| 3688 ** function does not actually modify the database file on disk. It | 3822 ** function does not actually modify the database file on disk. It |
| 3689 ** just sets the internal state of the pager object so that the | 3823 ** just sets the internal state of the pager object so that the |
| 3690 ** truncation will be done when the current transaction is committed. | 3824 ** truncation will be done when the current transaction is committed. |
| 3825 ** |
| 3826 ** This function is only called right before committing a transaction. |
| 3827 ** Once this function has been called, the transaction must either be |
| 3828 ** rolled back or committed. It is not safe to call this function and |
| 3829 ** then continue writing to the database. |
| 3691 */ | 3830 */ |
| 3692 void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ | 3831 void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){ |
| 3693 assert( pPager->dbSize>=nPage ); | 3832 assert( pPager->dbSize>=nPage ); |
| 3694 assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); | 3833 assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); |
| 3695 pPager->dbSize = nPage; | 3834 pPager->dbSize = nPage; |
| 3696 assertTruncateConstraint(pPager); | 3835 |
| 3836 /* At one point the code here called assertTruncateConstraint() to |
| 3837 ** ensure that all pages being truncated away by this operation are, |
| 3838 ** if one or more savepoints are open, present in the savepoint |
| 3839 ** journal so that they can be restored if the savepoint is rolled |
| 3840 ** back. This is no longer necessary as this function is now only |
| 3841 ** called right before committing a transaction. So although the |
| 3842 ** Pager object may still have open savepoints (Pager.nSavepoint!=0), |
| 3843 ** they cannot be rolled back. So the assertTruncateConstraint() call |
| 3844 ** is no longer correct. */ |
| 3697 } | 3845 } |
| 3698 | 3846 |
| 3699 | 3847 |
| 3700 /* | 3848 /* |
| 3701 ** This function is called before attempting a hot-journal rollback. It | 3849 ** This function is called before attempting a hot-journal rollback. It |
| 3702 ** syncs the journal file to disk, then sets pPager->journalHdr to the | 3850 ** syncs the journal file to disk, then sets pPager->journalHdr to the |
| 3703 ** size of the journal file so that the pager_playback() routine knows | 3851 ** size of the journal file so that the pager_playback() routine knows |
| 3704 ** that the entire journal file has been synced. | 3852 ** that the entire journal file has been synced. |
| 3705 ** | 3853 ** |
| 3706 ** Syncing a hot-journal to disk before attempting to roll it back ensures | 3854 ** Syncing a hot-journal to disk before attempting to roll it back ensures |
| 3707 ** that if a power-failure occurs during the rollback, the process that | 3855 ** that if a power-failure occurs during the rollback, the process that |
| 3708 ** attempts rollback following system recovery sees the same journal | 3856 ** attempts rollback following system recovery sees the same journal |
| 3709 ** content as this process. | 3857 ** content as this process. |
| 3710 ** | 3858 ** |
| 3711 ** If everything goes as planned, SQLITE_OK is returned. Otherwise, | 3859 ** If everything goes as planned, SQLITE_OK is returned. Otherwise, |
| 3712 ** an SQLite error code. | 3860 ** an SQLite error code. |
| 3713 */ | 3861 */ |
| 3714 static int pagerSyncHotJournal(Pager *pPager){ | 3862 static int pagerSyncHotJournal(Pager *pPager){ |
| 3715 int rc = SQLITE_OK; | 3863 int rc = SQLITE_OK; |
| 3716 if( !pPager->noSync ){ | 3864 if( !pPager->noSync ){ |
| 3717 rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_NORMAL); | 3865 rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_NORMAL); |
| 3718 } | 3866 } |
| 3719 if( rc==SQLITE_OK ){ | 3867 if( rc==SQLITE_OK ){ |
| 3720 rc = sqlite3OsFileSize(pPager->jfd, &pPager->journalHdr); | 3868 rc = sqlite3OsFileSize(pPager->jfd, &pPager->journalHdr); |
| 3721 } | 3869 } |
| 3722 return rc; | 3870 return rc; |
| 3723 } | 3871 } |
| 3724 | 3872 |
| 3725 /* | 3873 /* |
| 3874 ** Obtain a reference to a memory mapped page object for page number pgno. |
| 3875 ** The new object will use the pointer pData, obtained from xFetch(). |
| 3876 ** If successful, set *ppPage to point to the new page reference |
| 3877 ** and return SQLITE_OK. Otherwise, return an SQLite error code and set |
| 3878 ** *ppPage to zero. |
| 3879 ** |
| 3880 ** Page references obtained by calling this function should be released |
| 3881 ** by calling pagerReleaseMapPage(). |
| 3882 */ |
| 3883 static int pagerAcquireMapPage( |
| 3884 Pager *pPager, /* Pager object */ |
| 3885 Pgno pgno, /* Page number */ |
| 3886 void *pData, /* xFetch()'d data for this page */ |
| 3887 PgHdr **ppPage /* OUT: Acquired page object */ |
| 3888 ){ |
| 3889 PgHdr *p; /* Memory mapped page to return */ |
| 3890 |
| 3891 if( pPager->pMmapFreelist ){ |
| 3892 *ppPage = p = pPager->pMmapFreelist; |
| 3893 pPager->pMmapFreelist = p->pDirty; |
| 3894 p->pDirty = 0; |
| 3895 memset(p->pExtra, 0, pPager->nExtra); |
| 3896 }else{ |
| 3897 *ppPage = p = (PgHdr *)sqlite3MallocZero(sizeof(PgHdr) + pPager->nExtra); |
| 3898 if( p==0 ){ |
| 3899 sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1) * pPager->pageSize, pData); |
| 3900 return SQLITE_NOMEM; |
| 3901 } |
| 3902 p->pExtra = (void *)&p[1]; |
| 3903 p->flags = PGHDR_MMAP; |
| 3904 p->nRef = 1; |
| 3905 p->pPager = pPager; |
| 3906 } |
| 3907 |
| 3908 assert( p->pExtra==(void *)&p[1] ); |
| 3909 assert( p->pPage==0 ); |
| 3910 assert( p->flags==PGHDR_MMAP ); |
| 3911 assert( p->pPager==pPager ); |
| 3912 assert( p->nRef==1 ); |
| 3913 |
| 3914 p->pgno = pgno; |
| 3915 p->pData = pData; |
| 3916 pPager->nMmapOut++; |
| 3917 |
| 3918 return SQLITE_OK; |
| 3919 } |
| 3920 |
| 3921 /* |
| 3922 ** Release a reference to page pPg. pPg must have been returned by an |
| 3923 ** earlier call to pagerAcquireMapPage(). |
| 3924 */ |
| 3925 static void pagerReleaseMapPage(PgHdr *pPg){ |
| 3926 Pager *pPager = pPg->pPager; |
| 3927 pPager->nMmapOut--; |
| 3928 pPg->pDirty = pPager->pMmapFreelist; |
| 3929 pPager->pMmapFreelist = pPg; |
| 3930 |
| 3931 assert( pPager->fd->pMethods->iVersion>=3 ); |
| 3932 sqlite3OsUnfetch(pPager->fd, (i64)(pPg->pgno-1)*pPager->pageSize, pPg->pData); |
| 3933 } |
| 3934 |
| 3935 /* |
| 3936 ** Free all PgHdr objects stored in the Pager.pMmapFreelist list. |
| 3937 */ |
| 3938 static void pagerFreeMapHdrs(Pager *pPager){ |
| 3939 PgHdr *p; |
| 3940 PgHdr *pNext; |
| 3941 for(p=pPager->pMmapFreelist; p; p=pNext){ |
| 3942 pNext = p->pDirty; |
| 3943 sqlite3_free(p); |
| 3944 } |
| 3945 } |
| 3946 |
| 3947 |
| 3948 /* |
| 3726 ** Shutdown the page cache. Free all memory and close all files. | 3949 ** Shutdown the page cache. Free all memory and close all files. |
| 3727 ** | 3950 ** |
| 3728 ** If a transaction was in progress when this routine is called, that | 3951 ** If a transaction was in progress when this routine is called, that |
| 3729 ** transaction is rolled back. All outstanding pages are invalidated | 3952 ** transaction is rolled back. All outstanding pages are invalidated |
| 3730 ** and their memory is freed. Any attempt to use a page associated | 3953 ** and their memory is freed. Any attempt to use a page associated |
| 3731 ** with this page cache after this function returns will likely | 3954 ** with this page cache after this function returns will likely |
| 3732 ** result in a coredump. | 3955 ** result in a coredump. |
| 3733 ** | 3956 ** |
| 3734 ** This function always succeeds. If a transaction is active an attempt | 3957 ** This function always succeeds. If a transaction is active an attempt |
| 3735 ** is made to roll it back. If an error occurs during the rollback | 3958 ** is made to roll it back. If an error occurs during the rollback |
| 3736 ** a hot journal may be left in the filesystem but no error is returned | 3959 ** a hot journal may be left in the filesystem but no error is returned |
| 3737 ** to the caller. | 3960 ** to the caller. |
| 3738 */ | 3961 */ |
| 3739 int sqlite3PagerClose(Pager *pPager){ | 3962 int sqlite3PagerClose(Pager *pPager){ |
| 3740 u8 *pTmp = (u8 *)pPager->pTmpSpace; | 3963 u8 *pTmp = (u8 *)pPager->pTmpSpace; |
| 3741 | 3964 |
| 3965 assert( assert_pager_state(pPager) ); |
| 3742 disable_simulated_io_errors(); | 3966 disable_simulated_io_errors(); |
| 3743 sqlite3BeginBenignMalloc(); | 3967 sqlite3BeginBenignMalloc(); |
| 3968 pagerFreeMapHdrs(pPager); |
| 3744 /* pPager->errCode = 0; */ | 3969 /* pPager->errCode = 0; */ |
| 3745 pPager->exclusiveMode = 0; | 3970 pPager->exclusiveMode = 0; |
| 3746 #ifndef SQLITE_OMIT_WAL | 3971 #ifndef SQLITE_OMIT_WAL |
| 3747 sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, pPager->pageSize, pTmp); | 3972 sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, pPager->pageSize, pTmp); |
| 3748 pPager->pWal = 0; | 3973 pPager->pWal = 0; |
| 3749 #endif | 3974 #endif |
| 3750 pager_reset(pPager); | 3975 pager_reset(pPager); |
| 3751 if( MEMDB ){ | 3976 if( MEMDB ){ |
| 3752 pager_unlock(pPager); | 3977 pager_unlock(pPager); |
| 3753 }else{ | 3978 }else{ |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3803 sqlite3PcacheRef(pPg); | 4028 sqlite3PcacheRef(pPg); |
| 3804 } | 4029 } |
| 3805 | 4030 |
| 3806 /* | 4031 /* |
| 3807 ** Sync the journal. In other words, make sure all the pages that have | 4032 ** Sync the journal. In other words, make sure all the pages that have |
| 3808 ** been written to the journal have actually reached the surface of the | 4033 ** been written to the journal have actually reached the surface of the |
| 3809 ** disk and can be restored in the event of a hot-journal rollback. | 4034 ** disk and can be restored in the event of a hot-journal rollback. |
| 3810 ** | 4035 ** |
| 3811 ** If the Pager.noSync flag is set, then this function is a no-op. | 4036 ** If the Pager.noSync flag is set, then this function is a no-op. |
| 3812 ** Otherwise, the actions required depend on the journal-mode and the | 4037 ** Otherwise, the actions required depend on the journal-mode and the |
| 3813 ** device characteristics of the the file-system, as follows: | 4038 ** device characteristics of the file-system, as follows: |
| 3814 ** | 4039 ** |
| 3815 ** * If the journal file is an in-memory journal file, no action need | 4040 ** * If the journal file is an in-memory journal file, no action need |
| 3816 ** be taken. | 4041 ** be taken. |
| 3817 ** | 4042 ** |
| 3818 ** * Otherwise, if the device does not support the SAFE_APPEND property, | 4043 ** * Otherwise, if the device does not support the SAFE_APPEND property, |
| 3819 ** then the nRec field of the most recently written journal header | 4044 ** then the nRec field of the most recently written journal header |
| 3820 ** is updated to contain the number of journal records that have | 4045 ** is updated to contain the number of journal records that have |
| 3821 ** been written following it. If the pager is operating in full-sync | 4046 ** been written following it. If the pager is operating in full-sync |
| 3822 ** mode, then the journal file is synced before this field is updated. | 4047 ** mode, then the journal file is synced before this field is updated. |
| 3823 ** | 4048 ** |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3995 */ | 4220 */ |
| 3996 if( !isOpen(pPager->fd) ){ | 4221 if( !isOpen(pPager->fd) ){ |
| 3997 assert( pPager->tempFile && rc==SQLITE_OK ); | 4222 assert( pPager->tempFile && rc==SQLITE_OK ); |
| 3998 rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags); | 4223 rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags); |
| 3999 } | 4224 } |
| 4000 | 4225 |
| 4001 /* Before the first write, give the VFS a hint of what the final | 4226 /* Before the first write, give the VFS a hint of what the final |
| 4002 ** file size will be. | 4227 ** file size will be. |
| 4003 */ | 4228 */ |
| 4004 assert( rc!=SQLITE_OK || isOpen(pPager->fd) ); | 4229 assert( rc!=SQLITE_OK || isOpen(pPager->fd) ); |
| 4005 if( rc==SQLITE_OK && pPager->dbSize>pPager->dbHintSize ){ | 4230 if( rc==SQLITE_OK |
| 4231 && pPager->dbHintSize<pPager->dbSize |
| 4232 && (pList->pDirty || pList->pgno>pPager->dbHintSize) |
| 4233 ){ |
| 4006 sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize; | 4234 sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize; |
| 4007 sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile); | 4235 sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile); |
| 4008 pPager->dbHintSize = pPager->dbSize; | 4236 pPager->dbHintSize = pPager->dbSize; |
| 4009 } | 4237 } |
| 4010 | 4238 |
| 4011 while( rc==SQLITE_OK && pList ){ | 4239 while( rc==SQLITE_OK && pList ){ |
| 4012 Pgno pgno = pList->pgno; | 4240 Pgno pgno = pList->pgno; |
| 4013 | 4241 |
| 4014 /* If there are dirty pages in the page cache with page numbers greater | 4242 /* If there are dirty pages in the page cache with page numbers greater |
| 4015 ** than Pager.dbSize, this means sqlite3PagerTruncateImage() was called to | 4243 ** than Pager.dbSize, this means sqlite3PagerTruncateImage() was called to |
| 4016 ** make the file smaller (presumably by auto-vacuum code). Do not write | 4244 ** make the file smaller (presumably by auto-vacuum code). Do not write |
| 4017 ** any such pages to the file. | 4245 ** any such pages to the file. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4035 /* If page 1 was just written, update Pager.dbFileVers to match | 4263 /* If page 1 was just written, update Pager.dbFileVers to match |
| 4036 ** the value now stored in the database file. If writing this | 4264 ** the value now stored in the database file. If writing this |
| 4037 ** page caused the database file to grow, update dbFileSize. | 4265 ** page caused the database file to grow, update dbFileSize. |
| 4038 */ | 4266 */ |
| 4039 if( pgno==1 ){ | 4267 if( pgno==1 ){ |
| 4040 memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers)); | 4268 memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers)); |
| 4041 } | 4269 } |
| 4042 if( pgno>pPager->dbFileSize ){ | 4270 if( pgno>pPager->dbFileSize ){ |
| 4043 pPager->dbFileSize = pgno; | 4271 pPager->dbFileSize = pgno; |
| 4044 } | 4272 } |
| 4273 pPager->aStat[PAGER_STAT_WRITE]++; |
| 4045 | 4274 |
| 4046 /* Update any backup objects copying the contents of this pager. */ | 4275 /* Update any backup objects copying the contents of this pager. */ |
| 4047 sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)pList->pData); | 4276 sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)pList->pData); |
| 4048 | 4277 |
| 4049 PAGERTRACE(("STORE %d page %d hash(%08x)\n", | 4278 PAGERTRACE(("STORE %d page %d hash(%08x)\n", |
| 4050 PAGERID(pPager), pgno, pager_pagehash(pList))); | 4279 PAGERID(pPager), pgno, pager_pagehash(pList))); |
| 4051 IOTRACE(("PGOUT %p %d\n", pPager, pgno)); | 4280 IOTRACE(("PGOUT %p %d\n", pPager, pgno)); |
| 4052 PAGER_INCR(sqlite3_pager_writedb_count); | 4281 PAGER_INCR(sqlite3_pager_writedb_count); |
| 4053 PAGER_INCR(pPager->nWrite); | |
| 4054 }else{ | 4282 }else{ |
| 4055 PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno)); | 4283 PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno)); |
| 4056 } | 4284 } |
| 4057 pager_set_pagehash(pList); | 4285 pager_set_pagehash(pList); |
| 4058 pList = pList->pDirty; | 4286 pList = pList->pDirty; |
| 4059 } | 4287 } |
| 4060 | 4288 |
| 4061 return rc; | 4289 return rc; |
| 4062 } | 4290 } |
| 4063 | 4291 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4097 static int subjournalPage(PgHdr *pPg){ | 4325 static int subjournalPage(PgHdr *pPg){ |
| 4098 int rc = SQLITE_OK; | 4326 int rc = SQLITE_OK; |
| 4099 Pager *pPager = pPg->pPager; | 4327 Pager *pPager = pPg->pPager; |
| 4100 if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ | 4328 if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ |
| 4101 | 4329 |
| 4102 /* Open the sub-journal, if it has not already been opened */ | 4330 /* Open the sub-journal, if it has not already been opened */ |
| 4103 assert( pPager->useJournal ); | 4331 assert( pPager->useJournal ); |
| 4104 assert( isOpen(pPager->jfd) || pagerUseWal(pPager) ); | 4332 assert( isOpen(pPager->jfd) || pagerUseWal(pPager) ); |
| 4105 assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 ); | 4333 assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 ); |
| 4106 assert( pagerUseWal(pPager) | 4334 assert( pagerUseWal(pPager) |
| 4107 || pageInJournal(pPg) | 4335 || pageInJournal(pPager, pPg) |
| 4108 || pPg->pgno>pPager->dbOrigSize | 4336 || pPg->pgno>pPager->dbOrigSize |
| 4109 ); | 4337 ); |
| 4110 rc = openSubJournal(pPager); | 4338 rc = openSubJournal(pPager); |
| 4111 | 4339 |
| 4112 /* If the sub-journal was opened successfully (or was already open), | 4340 /* If the sub-journal was opened successfully (or was already open), |
| 4113 ** write the journal record into the file. */ | 4341 ** write the journal record into the file. */ |
| 4114 if( rc==SQLITE_OK ){ | 4342 if( rc==SQLITE_OK ){ |
| 4115 void *pData = pPg->pData; | 4343 void *pData = pPg->pData; |
| 4116 i64 offset = pPager->nSubRec*(4+pPager->pageSize); | 4344 i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); |
| 4117 char *pData2; | 4345 char *pData2; |
| 4118 | 4346 |
| 4119 CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); | 4347 CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); |
| 4120 PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); | 4348 PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); |
| 4121 rc = write32bits(pPager->sjfd, offset, pPg->pgno); | 4349 rc = write32bits(pPager->sjfd, offset, pPg->pgno); |
| 4122 if( rc==SQLITE_OK ){ | 4350 if( rc==SQLITE_OK ){ |
| 4123 rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); | 4351 rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4); |
| 4124 } | 4352 } |
| 4125 } | 4353 } |
| 4126 } | 4354 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 4151 ** made clean for some other reason, but no error occurs, then SQLITE_OK | 4379 ** made clean for some other reason, but no error occurs, then SQLITE_OK |
| 4152 ** is returned by sqlite3PcacheMakeClean() is not called. | 4380 ** is returned by sqlite3PcacheMakeClean() is not called. |
| 4153 */ | 4381 */ |
| 4154 static int pagerStress(void *p, PgHdr *pPg){ | 4382 static int pagerStress(void *p, PgHdr *pPg){ |
| 4155 Pager *pPager = (Pager *)p; | 4383 Pager *pPager = (Pager *)p; |
| 4156 int rc = SQLITE_OK; | 4384 int rc = SQLITE_OK; |
| 4157 | 4385 |
| 4158 assert( pPg->pPager==pPager ); | 4386 assert( pPg->pPager==pPager ); |
| 4159 assert( pPg->flags&PGHDR_DIRTY ); | 4387 assert( pPg->flags&PGHDR_DIRTY ); |
| 4160 | 4388 |
| 4161 /* The doNotSyncSpill flag is set during times when doing a sync of | 4389 /* The doNotSpill NOSYNC bit is set during times when doing a sync of |
| 4162 ** journal (and adding a new header) is not allowed. This occurs | 4390 ** journal (and adding a new header) is not allowed. This occurs |
| 4163 ** during calls to sqlite3PagerWrite() while trying to journal multiple | 4391 ** during calls to sqlite3PagerWrite() while trying to journal multiple |
| 4164 ** pages belonging to the same sector. | 4392 ** pages belonging to the same sector. |
| 4165 ** | 4393 ** |
| 4166 ** The doNotSpill flag inhibits all cache spilling regardless of whether | 4394 ** The doNotSpill ROLLBACK and OFF bits inhibits all cache spilling |
| 4167 ** or not a sync is required. This is set during a rollback. | 4395 ** regardless of whether or not a sync is required. This is set during |
| 4396 ** a rollback or by user request, respectively. |
| 4168 ** | 4397 ** |
| 4169 ** Spilling is also prohibited when in an error state since that could | 4398 ** Spilling is also prohibited when in an error state since that could |
| 4170 ** lead to database corruption. In the current implementaton it | 4399 ** lead to database corruption. In the current implementation it |
| 4171 ** is impossible for sqlite3PCacheFetch() to be called with createFlag==1 | 4400 ** is impossible for sqlite3PcacheFetch() to be called with createFlag==3 |
| 4172 ** while in the error state, hence it is impossible for this routine to | 4401 ** while in the error state, hence it is impossible for this routine to |
| 4173 ** be called in the error state. Nevertheless, we include a NEVER() | 4402 ** be called in the error state. Nevertheless, we include a NEVER() |
| 4174 ** test for the error state as a safeguard against future changes. | 4403 ** test for the error state as a safeguard against future changes. |
| 4175 */ | 4404 */ |
| 4176 if( NEVER(pPager->errCode) ) return SQLITE_OK; | 4405 if( NEVER(pPager->errCode) ) return SQLITE_OK; |
| 4177 if( pPager->doNotSpill ) return SQLITE_OK; | 4406 testcase( pPager->doNotSpill & SPILLFLAG_ROLLBACK ); |
| 4178 if( pPager->doNotSyncSpill && (pPg->flags & PGHDR_NEED_SYNC)!=0 ){ | 4407 testcase( pPager->doNotSpill & SPILLFLAG_OFF ); |
| 4408 testcase( pPager->doNotSpill & SPILLFLAG_NOSYNC ); |
| 4409 if( pPager->doNotSpill |
| 4410 && ((pPager->doNotSpill & (SPILLFLAG_ROLLBACK|SPILLFLAG_OFF))!=0 |
| 4411 || (pPg->flags & PGHDR_NEED_SYNC)!=0) |
| 4412 ){ |
| 4179 return SQLITE_OK; | 4413 return SQLITE_OK; |
| 4180 } | 4414 } |
| 4181 | 4415 |
| 4182 pPg->pDirty = 0; | 4416 pPg->pDirty = 0; |
| 4183 if( pagerUseWal(pPager) ){ | 4417 if( pagerUseWal(pPager) ){ |
| 4184 /* Write a single frame for this page to the log. */ | 4418 /* Write a single frame for this page to the log. */ |
| 4185 if( subjRequiresPage(pPg) ){ | 4419 if( subjRequiresPage(pPg) ){ |
| 4186 rc = subjournalPage(pPg); | 4420 rc = subjournalPage(pPg); |
| 4187 } | 4421 } |
| 4188 if( rc==SQLITE_OK ){ | 4422 if( rc==SQLITE_OK ){ |
| 4189 rc = pagerWalFrames(pPager, pPg, 0, 0, 0); | 4423 rc = pagerWalFrames(pPager, pPg, 0, 0); |
| 4190 } | 4424 } |
| 4191 }else{ | 4425 }else{ |
| 4192 | 4426 |
| 4193 /* Sync the journal file if required. */ | 4427 /* Sync the journal file if required. */ |
| 4194 if( pPg->flags&PGHDR_NEED_SYNC | 4428 if( pPg->flags&PGHDR_NEED_SYNC |
| 4195 || pPager->eState==PAGER_WRITER_CACHEMOD | 4429 || pPager->eState==PAGER_WRITER_CACHEMOD |
| 4196 ){ | 4430 ){ |
| 4197 rc = syncJournal(pPager, 1); | 4431 rc = syncJournal(pPager, 1); |
| 4198 } | 4432 } |
| 4199 | 4433 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4258 ** automatically when they are closed. If zFilename is ":memory:" then | 4492 ** automatically when they are closed. If zFilename is ":memory:" then |
| 4259 ** all information is held in cache. It is never written to disk. | 4493 ** all information is held in cache. It is never written to disk. |
| 4260 ** This can be used to implement an in-memory database. | 4494 ** This can be used to implement an in-memory database. |
| 4261 ** | 4495 ** |
| 4262 ** The nExtra parameter specifies the number of bytes of space allocated | 4496 ** The nExtra parameter specifies the number of bytes of space allocated |
| 4263 ** along with each page reference. This space is available to the user | 4497 ** along with each page reference. This space is available to the user |
| 4264 ** via the sqlite3PagerGetExtra() API. | 4498 ** via the sqlite3PagerGetExtra() API. |
| 4265 ** | 4499 ** |
| 4266 ** The flags argument is used to specify properties that affect the | 4500 ** The flags argument is used to specify properties that affect the |
| 4267 ** operation of the pager. It should be passed some bitwise combination | 4501 ** operation of the pager. It should be passed some bitwise combination |
| 4268 ** of the PAGER_OMIT_JOURNAL and PAGER_NO_READLOCK flags. | 4502 ** of the PAGER_* flags. |
| 4269 ** | 4503 ** |
| 4270 ** The vfsFlags parameter is a bitmask to pass to the flags parameter | 4504 ** The vfsFlags parameter is a bitmask to pass to the flags parameter |
| 4271 ** of the xOpen() method of the supplied VFS when opening files. | 4505 ** of the xOpen() method of the supplied VFS when opening files. |
| 4272 ** | 4506 ** |
| 4273 ** If the pager object is allocated and the specified file opened | 4507 ** If the pager object is allocated and the specified file opened |
| 4274 ** successfully, SQLITE_OK is returned and *ppPager set to point to | 4508 ** successfully, SQLITE_OK is returned and *ppPager set to point to |
| 4275 ** the new pager object. If an error occurs, *ppPager is set to NULL | 4509 ** the new pager object. If an error occurs, *ppPager is set to NULL |
| 4276 ** and error code returned. This function may return SQLITE_NOMEM | 4510 ** and error code returned. This function may return SQLITE_NOMEM |
| 4277 ** (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or | 4511 ** (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or |
| 4278 ** various SQLITE_IO_XXX errors. | 4512 ** various SQLITE_IO_XXX errors. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4289 u8 *pPtr; | 4523 u8 *pPtr; |
| 4290 Pager *pPager = 0; /* Pager object to allocate and return */ | 4524 Pager *pPager = 0; /* Pager object to allocate and return */ |
| 4291 int rc = SQLITE_OK; /* Return code */ | 4525 int rc = SQLITE_OK; /* Return code */ |
| 4292 int tempFile = 0; /* True for temp files (incl. in-memory files) */ | 4526 int tempFile = 0; /* True for temp files (incl. in-memory files) */ |
| 4293 int memDb = 0; /* True if this is an in-memory file */ | 4527 int memDb = 0; /* True if this is an in-memory file */ |
| 4294 int readOnly = 0; /* True if this is a read-only file */ | 4528 int readOnly = 0; /* True if this is a read-only file */ |
| 4295 int journalFileSize; /* Bytes to allocate for each journal fd */ | 4529 int journalFileSize; /* Bytes to allocate for each journal fd */ |
| 4296 char *zPathname = 0; /* Full path to database file */ | 4530 char *zPathname = 0; /* Full path to database file */ |
| 4297 int nPathname = 0; /* Number of bytes in zPathname */ | 4531 int nPathname = 0; /* Number of bytes in zPathname */ |
| 4298 int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; /* False to omit journal */ | 4532 int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; /* False to omit journal */ |
| 4299 int noReadlock = (flags & PAGER_NO_READLOCK)!=0; /* True to omit read-lock */ | |
| 4300 int pcacheSize = sqlite3PcacheSize(); /* Bytes to allocate for PCache */ | 4533 int pcacheSize = sqlite3PcacheSize(); /* Bytes to allocate for PCache */ |
| 4301 u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */ | 4534 u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */ |
| 4535 const char *zUri = 0; /* URI args to copy */ |
| 4536 int nUri = 0; /* Number of bytes of URI args at *zUri */ |
| 4302 | 4537 |
| 4303 /* Figure out how much space is required for each journal file-handle | 4538 /* Figure out how much space is required for each journal file-handle |
| 4304 ** (there are two of them, the main journal and the sub-journal). This | 4539 ** (there are two of them, the main journal and the sub-journal). This |
| 4305 ** is the maximum space required for an in-memory journal file handle | 4540 ** is the maximum space required for an in-memory journal file handle |
| 4306 ** and a regular journal file-handle. Note that a "regular journal-handle" | 4541 ** and a regular journal file-handle. Note that a "regular journal-handle" |
| 4307 ** may be a wrapper capable of caching the first portion of the journal | 4542 ** may be a wrapper capable of caching the first portion of the journal |
| 4308 ** file in memory to implement the atomic-write optimization (see | 4543 ** file in memory to implement the atomic-write optimization (see |
| 4309 ** source file journal.c). | 4544 ** source file journal.c). |
| 4310 */ | 4545 */ |
| 4311 if( sqlite3JournalSize(pVfs)>sqlite3MemJournalSize() ){ | 4546 if( sqlite3JournalSize(pVfs)>sqlite3MemJournalSize() ){ |
| 4312 journalFileSize = ROUND8(sqlite3JournalSize(pVfs)); | 4547 journalFileSize = ROUND8(sqlite3JournalSize(pVfs)); |
| 4313 }else{ | 4548 }else{ |
| 4314 journalFileSize = ROUND8(sqlite3MemJournalSize()); | 4549 journalFileSize = ROUND8(sqlite3MemJournalSize()); |
| 4315 } | 4550 } |
| 4316 | 4551 |
| 4317 /* Set the output variable to NULL in case an error occurs. */ | 4552 /* Set the output variable to NULL in case an error occurs. */ |
| 4318 *ppPager = 0; | 4553 *ppPager = 0; |
| 4319 | 4554 |
| 4320 #ifndef SQLITE_OMIT_MEMORYDB | 4555 #ifndef SQLITE_OMIT_MEMORYDB |
| 4321 if( flags & PAGER_MEMORY ){ | 4556 if( flags & PAGER_MEMORY ){ |
| 4322 memDb = 1; | 4557 memDb = 1; |
| 4323 zFilename = 0; | 4558 if( zFilename && zFilename[0] ){ |
| 4559 zPathname = sqlite3DbStrDup(0, zFilename); |
| 4560 if( zPathname==0 ) return SQLITE_NOMEM; |
| 4561 nPathname = sqlite3Strlen30(zPathname); |
| 4562 zFilename = 0; |
| 4563 } |
| 4324 } | 4564 } |
| 4325 #endif | 4565 #endif |
| 4326 | 4566 |
| 4327 /* Compute and store the full pathname in an allocated buffer pointed | 4567 /* Compute and store the full pathname in an allocated buffer pointed |
| 4328 ** to by zPathname, length nPathname. Or, if this is a temporary file, | 4568 ** to by zPathname, length nPathname. Or, if this is a temporary file, |
| 4329 ** leave both nPathname and zPathname set to 0. | 4569 ** leave both nPathname and zPathname set to 0. |
| 4330 */ | 4570 */ |
| 4331 if( zFilename && zFilename[0] ){ | 4571 if( zFilename && zFilename[0] ){ |
| 4572 const char *z; |
| 4332 nPathname = pVfs->mxPathname+1; | 4573 nPathname = pVfs->mxPathname+1; |
| 4333 zPathname = sqlite3Malloc(nPathname*2); | 4574 zPathname = sqlite3DbMallocRaw(0, nPathname*2); |
| 4334 if( zPathname==0 ){ | 4575 if( zPathname==0 ){ |
| 4335 return SQLITE_NOMEM; | 4576 return SQLITE_NOMEM; |
| 4336 } | 4577 } |
| 4337 zPathname[0] = 0; /* Make sure initialized even if FullPathname() fails */ | 4578 zPathname[0] = 0; /* Make sure initialized even if FullPathname() fails */ |
| 4338 rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname); | 4579 rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname); |
| 4339 nPathname = sqlite3Strlen30(zPathname); | 4580 nPathname = sqlite3Strlen30(zPathname); |
| 4581 z = zUri = &zFilename[sqlite3Strlen30(zFilename)+1]; |
| 4582 while( *z ){ |
| 4583 z += sqlite3Strlen30(z)+1; |
| 4584 z += sqlite3Strlen30(z)+1; |
| 4585 } |
| 4586 nUri = (int)(&z[1] - zUri); |
| 4587 assert( nUri>=0 ); |
| 4340 if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){ | 4588 if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){ |
| 4341 /* This branch is taken when the journal path required by | 4589 /* This branch is taken when the journal path required by |
| 4342 ** the database being opened will be more than pVfs->mxPathname | 4590 ** the database being opened will be more than pVfs->mxPathname |
| 4343 ** bytes in length. This means the database cannot be opened, | 4591 ** bytes in length. This means the database cannot be opened, |
| 4344 ** as it will not be possible to open the journal file or even | 4592 ** as it will not be possible to open the journal file or even |
| 4345 ** check for a hot-journal before reading. | 4593 ** check for a hot-journal before reading. |
| 4346 */ | 4594 */ |
| 4347 rc = SQLITE_CANTOPEN_BKPT; | 4595 rc = SQLITE_CANTOPEN_BKPT; |
| 4348 } | 4596 } |
| 4349 if( rc!=SQLITE_OK ){ | 4597 if( rc!=SQLITE_OK ){ |
| 4350 sqlite3_free(zPathname); | 4598 sqlite3DbFree(0, zPathname); |
| 4351 return rc; | 4599 return rc; |
| 4352 } | 4600 } |
| 4353 } | 4601 } |
| 4354 | 4602 |
| 4355 /* Allocate memory for the Pager structure, PCache object, the | 4603 /* Allocate memory for the Pager structure, PCache object, the |
| 4356 ** three file descriptors, the database file name and the journal | 4604 ** three file descriptors, the database file name and the journal |
| 4357 ** file name. The layout in memory is as follows: | 4605 ** file name. The layout in memory is as follows: |
| 4358 ** | 4606 ** |
| 4359 ** Pager object (sizeof(Pager) bytes) | 4607 ** Pager object (sizeof(Pager) bytes) |
| 4360 ** PCache object (sqlite3PcacheSize() bytes) | 4608 ** PCache object (sqlite3PcacheSize() bytes) |
| 4361 ** Database file handle (pVfs->szOsFile bytes) | 4609 ** Database file handle (pVfs->szOsFile bytes) |
| 4362 ** Sub-journal file handle (journalFileSize bytes) | 4610 ** Sub-journal file handle (journalFileSize bytes) |
| 4363 ** Main journal file handle (journalFileSize bytes) | 4611 ** Main journal file handle (journalFileSize bytes) |
| 4364 ** Database file name (nPathname+1 bytes) | 4612 ** Database file name (nPathname+1 bytes) |
| 4365 ** Journal file name (nPathname+8+1 bytes) | 4613 ** Journal file name (nPathname+8+1 bytes) |
| 4366 */ | 4614 */ |
| 4367 pPtr = (u8 *)sqlite3MallocZero( | 4615 pPtr = (u8 *)sqlite3MallocZero( |
| 4368 ROUND8(sizeof(*pPager)) + /* Pager structure */ | 4616 ROUND8(sizeof(*pPager)) + /* Pager structure */ |
| 4369 ROUND8(pcacheSize) + /* PCache object */ | 4617 ROUND8(pcacheSize) + /* PCache object */ |
| 4370 ROUND8(pVfs->szOsFile) + /* The main db file */ | 4618 ROUND8(pVfs->szOsFile) + /* The main db file */ |
| 4371 journalFileSize * 2 + /* The two journal files */ | 4619 journalFileSize * 2 + /* The two journal files */ |
| 4372 nPathname + 1 + /* zFilename */ | 4620 nPathname + 1 + nUri + /* zFilename */ |
| 4373 nPathname + 8 + 1 /* zJournal */ | 4621 nPathname + 8 + 2 /* zJournal */ |
| 4374 #ifndef SQLITE_OMIT_WAL | 4622 #ifndef SQLITE_OMIT_WAL |
| 4375 + nPathname + 4 + 1 /* zWal */ | 4623 + nPathname + 4 + 2 /* zWal */ |
| 4376 #endif | 4624 #endif |
| 4377 ); | 4625 ); |
| 4378 assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); | 4626 assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); |
| 4379 if( !pPtr ){ | 4627 if( !pPtr ){ |
| 4380 sqlite3_free(zPathname); | 4628 sqlite3DbFree(0, zPathname); |
| 4381 return SQLITE_NOMEM; | 4629 return SQLITE_NOMEM; |
| 4382 } | 4630 } |
| 4383 pPager = (Pager*)(pPtr); | 4631 pPager = (Pager*)(pPtr); |
| 4384 pPager->pPCache = (PCache*)(pPtr += ROUND8(sizeof(*pPager))); | 4632 pPager->pPCache = (PCache*)(pPtr += ROUND8(sizeof(*pPager))); |
| 4385 pPager->fd = (sqlite3_file*)(pPtr += ROUND8(pcacheSize)); | 4633 pPager->fd = (sqlite3_file*)(pPtr += ROUND8(pcacheSize)); |
| 4386 pPager->sjfd = (sqlite3_file*)(pPtr += ROUND8(pVfs->szOsFile)); | 4634 pPager->sjfd = (sqlite3_file*)(pPtr += ROUND8(pVfs->szOsFile)); |
| 4387 pPager->jfd = (sqlite3_file*)(pPtr += journalFileSize); | 4635 pPager->jfd = (sqlite3_file*)(pPtr += journalFileSize); |
| 4388 pPager->zFilename = (char*)(pPtr += journalFileSize); | 4636 pPager->zFilename = (char*)(pPtr += journalFileSize); |
| 4389 assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); | 4637 assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); |
| 4390 | 4638 |
| 4391 /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */ | 4639 /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */ |
| 4392 if( zPathname ){ | 4640 if( zPathname ){ |
| 4393 assert( nPathname>0 ); | 4641 assert( nPathname>0 ); |
| 4394 pPager->zJournal = (char*)(pPtr += nPathname + 1); | 4642 pPager->zJournal = (char*)(pPtr += nPathname + 1 + nUri); |
| 4395 memcpy(pPager->zFilename, zPathname, nPathname); | 4643 memcpy(pPager->zFilename, zPathname, nPathname); |
| 4644 if( nUri ) memcpy(&pPager->zFilename[nPathname+1], zUri, nUri); |
| 4396 memcpy(pPager->zJournal, zPathname, nPathname); | 4645 memcpy(pPager->zJournal, zPathname, nPathname); |
| 4397 memcpy(&pPager->zJournal[nPathname], "-journal", 8); | 4646 memcpy(&pPager->zJournal[nPathname], "-journal\000", 8+2); |
| 4647 sqlite3FileSuffix3(pPager->zFilename, pPager->zJournal); |
| 4398 #ifndef SQLITE_OMIT_WAL | 4648 #ifndef SQLITE_OMIT_WAL |
| 4399 pPager->zWal = &pPager->zJournal[nPathname+8+1]; | 4649 pPager->zWal = &pPager->zJournal[nPathname+8+1]; |
| 4400 memcpy(pPager->zWal, zPathname, nPathname); | 4650 memcpy(pPager->zWal, zPathname, nPathname); |
| 4401 memcpy(&pPager->zWal[nPathname], "-wal", 4); | 4651 memcpy(&pPager->zWal[nPathname], "-wal\000", 4+1); |
| 4652 sqlite3FileSuffix3(pPager->zFilename, pPager->zWal); |
| 4402 #endif | 4653 #endif |
| 4403 sqlite3_free(zPathname); | 4654 sqlite3DbFree(0, zPathname); |
| 4404 } | 4655 } |
| 4405 pPager->pVfs = pVfs; | 4656 pPager->pVfs = pVfs; |
| 4406 pPager->vfsFlags = vfsFlags; | 4657 pPager->vfsFlags = vfsFlags; |
| 4407 | 4658 |
| 4408 /* Open the pager file. | 4659 /* Open the pager file. |
| 4409 */ | 4660 */ |
| 4410 if( zFilename && zFilename[0] ){ | 4661 if( zFilename && zFilename[0] ){ |
| 4411 int fout = 0; /* VFS flags returned by xOpen() */ | 4662 int fout = 0; /* VFS flags returned by xOpen() */ |
| 4412 rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); | 4663 rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); |
| 4413 assert( !memDb ); | 4664 assert( !memDb ); |
| 4414 readOnly = (fout&SQLITE_OPEN_READONLY); | 4665 readOnly = (fout&SQLITE_OPEN_READONLY); |
| 4415 | 4666 |
| 4416 /* If the file was successfully opened for read/write access, | 4667 /* If the file was successfully opened for read/write access, |
| 4417 ** choose a default page size in case we have to create the | 4668 ** choose a default page size in case we have to create the |
| 4418 ** database file. The default page size is the maximum of: | 4669 ** database file. The default page size is the maximum of: |
| 4419 ** | 4670 ** |
| 4420 ** + SQLITE_DEFAULT_PAGE_SIZE, | 4671 ** + SQLITE_DEFAULT_PAGE_SIZE, |
| 4421 ** + The value returned by sqlite3OsSectorSize() | 4672 ** + The value returned by sqlite3OsSectorSize() |
| 4422 ** + The largest page size that can be written atomically. | 4673 ** + The largest page size that can be written atomically. |
| 4423 */ | 4674 */ |
| 4424 if( rc==SQLITE_OK && !readOnly ){ | 4675 if( rc==SQLITE_OK ){ |
| 4425 setSectorSize(pPager); | 4676 int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); |
| 4426 assert(SQLITE_DEFAULT_PAGE_SIZE<=SQLITE_MAX_DEFAULT_PAGE_SIZE); | 4677 if( !readOnly ){ |
| 4427 if( szPageDflt<pPager->sectorSize ){ | 4678 setSectorSize(pPager); |
| 4428 if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){ | 4679 assert(SQLITE_DEFAULT_PAGE_SIZE<=SQLITE_MAX_DEFAULT_PAGE_SIZE); |
| 4429 szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE; | 4680 if( szPageDflt<pPager->sectorSize ){ |
| 4430 }else{ | 4681 if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){ |
| 4431 szPageDflt = (u32)pPager->sectorSize; | 4682 szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE; |
| 4432 } | 4683 }else{ |
| 4433 } | 4684 szPageDflt = (u32)pPager->sectorSize; |
| 4434 #ifdef SQLITE_ENABLE_ATOMIC_WRITE | |
| 4435 { | |
| 4436 int iDc = sqlite3OsDeviceCharacteristics(pPager->fd); | |
| 4437 int ii; | |
| 4438 assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); | |
| 4439 assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); | |
| 4440 assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536); | |
| 4441 for(ii=szPageDflt; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){ | |
| 4442 if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ){ | |
| 4443 szPageDflt = ii; | |
| 4444 } | 4685 } |
| 4445 } | 4686 } |
| 4687 #ifdef SQLITE_ENABLE_ATOMIC_WRITE |
| 4688 { |
| 4689 int ii; |
| 4690 assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); |
| 4691 assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); |
| 4692 assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536); |
| 4693 for(ii=szPageDflt; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){ |
| 4694 if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ){ |
| 4695 szPageDflt = ii; |
| 4696 } |
| 4697 } |
| 4698 } |
| 4699 #endif |
| 4446 } | 4700 } |
| 4447 #endif | 4701 pPager->noLock = sqlite3_uri_boolean(zFilename, "nolock", 0); |
| 4702 if( (iDc & SQLITE_IOCAP_IMMUTABLE)!=0 |
| 4703 || sqlite3_uri_boolean(zFilename, "immutable", 0) ){ |
| 4704 vfsFlags |= SQLITE_OPEN_READONLY; |
| 4705 goto act_like_temp_file; |
| 4706 } |
| 4448 } | 4707 } |
| 4449 }else{ | 4708 }else{ |
| 4450 /* If a temporary file is requested, it is not opened immediately. | 4709 /* If a temporary file is requested, it is not opened immediately. |
| 4451 ** In this case we accept the default page size and delay actually | 4710 ** In this case we accept the default page size and delay actually |
| 4452 ** opening the file until the first call to OsWrite(). | 4711 ** opening the file until the first call to OsWrite(). |
| 4453 ** | 4712 ** |
| 4454 ** This branch is also run for an in-memory database. An in-memory | 4713 ** This branch is also run for an in-memory database. An in-memory |
| 4455 ** database is the same as a temp-file that is never written out to | 4714 ** database is the same as a temp-file that is never written out to |
| 4456 ** disk and uses an in-memory rollback journal. | 4715 ** disk and uses an in-memory rollback journal. |
| 4716 ** |
| 4717 ** This branch also runs for files marked as immutable. |
| 4457 */ | 4718 */ |
| 4719 act_like_temp_file: |
| 4458 tempFile = 1; | 4720 tempFile = 1; |
| 4459 pPager->eState = PAGER_READER; | 4721 pPager->eState = PAGER_READER; /* Pretend we already have a lock */ |
| 4460 pPager->eLock = EXCLUSIVE_LOCK; | 4722 pPager->eLock = EXCLUSIVE_LOCK; /* Pretend we are in EXCLUSIVE locking mo
de */ |
| 4723 pPager->noLock = 1; /* Do no locking */ |
| 4461 readOnly = (vfsFlags&SQLITE_OPEN_READONLY); | 4724 readOnly = (vfsFlags&SQLITE_OPEN_READONLY); |
| 4462 } | 4725 } |
| 4463 | 4726 |
| 4464 /* The following call to PagerSetPagesize() serves to set the value of | 4727 /* The following call to PagerSetPagesize() serves to set the value of |
| 4465 ** Pager.pageSize and to allocate the Pager.pTmpSpace buffer. | 4728 ** Pager.pageSize and to allocate the Pager.pTmpSpace buffer. |
| 4466 */ | 4729 */ |
| 4467 if( rc==SQLITE_OK ){ | 4730 if( rc==SQLITE_OK ){ |
| 4468 assert( pPager->memDb==0 ); | 4731 assert( pPager->memDb==0 ); |
| 4469 rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1); | 4732 rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1); |
| 4470 testcase( rc!=SQLITE_OK ); | 4733 testcase( rc!=SQLITE_OK ); |
| 4471 } | 4734 } |
| 4472 | 4735 |
| 4473 /* If an error occurred in either of the blocks above, free the | 4736 /* Initialize the PCache object. */ |
| 4474 ** Pager structure and close the file. | 4737 if( rc==SQLITE_OK ){ |
| 4738 assert( nExtra<1000 ); |
| 4739 nExtra = ROUND8(nExtra); |
| 4740 rc = sqlite3PcacheOpen(szPageDflt, nExtra, !memDb, |
| 4741 !memDb?pagerStress:0, (void *)pPager, pPager->pPCache
); |
| 4742 } |
| 4743 |
| 4744 /* If an error occurred above, free the Pager structure and close the file. |
| 4475 */ | 4745 */ |
| 4476 if( rc!=SQLITE_OK ){ | 4746 if( rc!=SQLITE_OK ){ |
| 4477 assert( !pPager->pTmpSpace ); | |
| 4478 sqlite3OsClose(pPager->fd); | 4747 sqlite3OsClose(pPager->fd); |
| 4748 sqlite3PageFree(pPager->pTmpSpace); |
| 4479 sqlite3_free(pPager); | 4749 sqlite3_free(pPager); |
| 4480 return rc; | 4750 return rc; |
| 4481 } | 4751 } |
| 4482 | 4752 |
| 4483 /* Initialize the PCache object. */ | |
| 4484 assert( nExtra<1000 ); | |
| 4485 nExtra = ROUND8(nExtra); | |
| 4486 sqlite3PcacheOpen(szPageDflt, nExtra, !memDb, | |
| 4487 !memDb?pagerStress:0, (void *)pPager, pPager->pPCache); | |
| 4488 | |
| 4489 PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename)); | 4753 PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename)); |
| 4490 IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename)) | 4754 IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename)) |
| 4491 | 4755 |
| 4492 pPager->useJournal = (u8)useJournal; | 4756 pPager->useJournal = (u8)useJournal; |
| 4493 pPager->noReadlock = (noReadlock && readOnly) ?1:0; | |
| 4494 /* pPager->stmtOpen = 0; */ | 4757 /* pPager->stmtOpen = 0; */ |
| 4495 /* pPager->stmtInUse = 0; */ | 4758 /* pPager->stmtInUse = 0; */ |
| 4496 /* pPager->nRef = 0; */ | 4759 /* pPager->nRef = 0; */ |
| 4497 /* pPager->stmtSize = 0; */ | 4760 /* pPager->stmtSize = 0; */ |
| 4498 /* pPager->stmtJSize = 0; */ | 4761 /* pPager->stmtJSize = 0; */ |
| 4499 /* pPager->nPage = 0; */ | 4762 /* pPager->nPage = 0; */ |
| 4500 pPager->mxPgno = SQLITE_MAX_PAGE_COUNT; | 4763 pPager->mxPgno = SQLITE_MAX_PAGE_COUNT; |
| 4501 /* pPager->state = PAGER_UNLOCK; */ | 4764 /* pPager->state = PAGER_UNLOCK; */ |
| 4502 #if 0 | |
| 4503 assert( pPager->state == (tempFile ? PAGER_EXCLUSIVE : PAGER_UNLOCK) ); | |
| 4504 #endif | |
| 4505 /* pPager->errMask = 0; */ | 4765 /* pPager->errMask = 0; */ |
| 4506 pPager->tempFile = (u8)tempFile; | 4766 pPager->tempFile = (u8)tempFile; |
| 4507 assert( tempFile==PAGER_LOCKINGMODE_NORMAL | 4767 assert( tempFile==PAGER_LOCKINGMODE_NORMAL |
| 4508 || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE ); | 4768 || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE ); |
| 4509 assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 ); | 4769 assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 ); |
| 4510 pPager->exclusiveMode = (u8)tempFile; | 4770 pPager->exclusiveMode = (u8)tempFile; |
| 4511 pPager->changeCountDone = pPager->tempFile; | 4771 pPager->changeCountDone = pPager->tempFile; |
| 4512 pPager->memDb = (u8)memDb; | 4772 pPager->memDb = (u8)memDb; |
| 4513 pPager->readOnly = (u8)readOnly; | 4773 pPager->readOnly = (u8)readOnly; |
| 4514 assert( useJournal || pPager->tempFile ); | 4774 assert( useJournal || pPager->tempFile ); |
| 4515 pPager->noSync = pPager->tempFile; | 4775 pPager->noSync = pPager->tempFile; |
| 4516 pPager->fullSync = pPager->noSync ?0:1; | 4776 if( pPager->noSync ){ |
| 4517 pPager->syncFlags = pPager->noSync ? 0 : SQLITE_SYNC_NORMAL; | 4777 assert( pPager->fullSync==0 ); |
| 4518 pPager->ckptSyncFlags = pPager->syncFlags; | 4778 assert( pPager->syncFlags==0 ); |
| 4779 assert( pPager->walSyncFlags==0 ); |
| 4780 assert( pPager->ckptSyncFlags==0 ); |
| 4781 }else{ |
| 4782 pPager->fullSync = 1; |
| 4783 pPager->syncFlags = SQLITE_SYNC_NORMAL; |
| 4784 pPager->walSyncFlags = SQLITE_SYNC_NORMAL | WAL_SYNC_TRANSACTIONS; |
| 4785 pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL; |
| 4786 } |
| 4519 /* pPager->pFirst = 0; */ | 4787 /* pPager->pFirst = 0; */ |
| 4520 /* pPager->pFirstSynced = 0; */ | 4788 /* pPager->pFirstSynced = 0; */ |
| 4521 /* pPager->pLast = 0; */ | 4789 /* pPager->pLast = 0; */ |
| 4522 pPager->nExtra = (u16)nExtra; | 4790 pPager->nExtra = (u16)nExtra; |
| 4523 pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT; | 4791 pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT; |
| 4524 assert( isOpen(pPager->fd) || tempFile ); | 4792 assert( isOpen(pPager->fd) || tempFile ); |
| 4525 setSectorSize(pPager); | 4793 setSectorSize(pPager); |
| 4526 if( !useJournal ){ | 4794 if( !useJournal ){ |
| 4527 pPager->journalMode = PAGER_JOURNALMODE_OFF; | 4795 pPager->journalMode = PAGER_JOURNALMODE_OFF; |
| 4528 }else if( memDb ){ | 4796 }else if( memDb ){ |
| 4529 pPager->journalMode = PAGER_JOURNALMODE_MEMORY; | 4797 pPager->journalMode = PAGER_JOURNALMODE_MEMORY; |
| 4530 } | 4798 } |
| 4531 /* pPager->xBusyHandler = 0; */ | 4799 /* pPager->xBusyHandler = 0; */ |
| 4532 /* pPager->pBusyHandlerArg = 0; */ | 4800 /* pPager->pBusyHandlerArg = 0; */ |
| 4533 pPager->xReiniter = xReinit; | 4801 pPager->xReiniter = xReinit; |
| 4534 /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ | 4802 /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ |
| 4803 /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */ |
| 4535 | 4804 |
| 4536 *ppPager = pPager; | 4805 *ppPager = pPager; |
| 4537 return SQLITE_OK; | 4806 return SQLITE_OK; |
| 4538 } | 4807 } |
| 4539 | 4808 |
| 4540 | 4809 |
| 4810 /* Verify that the database file has not be deleted or renamed out from |
| 4811 ** under the pager. Return SQLITE_OK if the database is still were it ought |
| 4812 ** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error |
| 4813 ** code from sqlite3OsAccess()) if the database has gone missing. |
| 4814 */ |
| 4815 static int databaseIsUnmoved(Pager *pPager){ |
| 4816 int bHasMoved = 0; |
| 4817 int rc; |
| 4818 |
| 4819 if( pPager->tempFile ) return SQLITE_OK; |
| 4820 if( pPager->dbSize==0 ) return SQLITE_OK; |
| 4821 assert( pPager->zFilename && pPager->zFilename[0] ); |
| 4822 rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved); |
| 4823 if( rc==SQLITE_NOTFOUND ){ |
| 4824 /* If the HAS_MOVED file-control is unimplemented, assume that the file |
| 4825 ** has not been moved. That is the historical behavior of SQLite: prior to |
| 4826 ** version 3.8.3, it never checked */ |
| 4827 rc = SQLITE_OK; |
| 4828 }else if( rc==SQLITE_OK && bHasMoved ){ |
| 4829 rc = SQLITE_READONLY_DBMOVED; |
| 4830 } |
| 4831 return rc; |
| 4832 } |
| 4833 |
| 4541 | 4834 |
| 4542 /* | 4835 /* |
| 4543 ** This function is called after transitioning from PAGER_UNLOCK to | 4836 ** This function is called after transitioning from PAGER_UNLOCK to |
| 4544 ** PAGER_SHARED state. It tests if there is a hot journal present in | 4837 ** PAGER_SHARED state. It tests if there is a hot journal present in |
| 4545 ** the file-system for the given pager. A hot journal is one that | 4838 ** the file-system for the given pager. A hot journal is one that |
| 4546 ** needs to be played back. According to this function, a hot-journal | 4839 ** needs to be played back. According to this function, a hot-journal |
| 4547 ** file exists if the following criteria are met: | 4840 ** file exists if the following criteria are met: |
| 4548 ** | 4841 ** |
| 4549 ** * The journal file exists in the file system, and | 4842 ** * The journal file exists in the file system, and |
| 4550 ** * No process holds a RESERVED or greater lock on the database file, and | 4843 ** * No process holds a RESERVED or greater lock on the database file, and |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4596 ** call above, but then delete the journal and drop the lock before | 4889 ** call above, but then delete the journal and drop the lock before |
| 4597 ** we get to the following sqlite3OsCheckReservedLock() call. If that | 4890 ** we get to the following sqlite3OsCheckReservedLock() call. If that |
| 4598 ** is the case, this routine might think there is a hot journal when | 4891 ** is the case, this routine might think there is a hot journal when |
| 4599 ** in fact there is none. This results in a false-positive which will | 4892 ** in fact there is none. This results in a false-positive which will |
| 4600 ** be dealt with by the playback routine. Ticket #3883. | 4893 ** be dealt with by the playback routine. Ticket #3883. |
| 4601 */ | 4894 */ |
| 4602 rc = sqlite3OsCheckReservedLock(pPager->fd, &locked); | 4895 rc = sqlite3OsCheckReservedLock(pPager->fd, &locked); |
| 4603 if( rc==SQLITE_OK && !locked ){ | 4896 if( rc==SQLITE_OK && !locked ){ |
| 4604 Pgno nPage; /* Number of pages in database file */ | 4897 Pgno nPage; /* Number of pages in database file */ |
| 4605 | 4898 |
| 4606 /* Check the size of the database file. If it consists of 0 pages, | |
| 4607 ** then delete the journal file. See the header comment above for | |
| 4608 ** the reasoning here. Delete the obsolete journal file under | |
| 4609 ** a RESERVED lock to avoid race conditions and to avoid violating | |
| 4610 ** [H33020]. | |
| 4611 */ | |
| 4612 rc = pagerPagecount(pPager, &nPage); | 4899 rc = pagerPagecount(pPager, &nPage); |
| 4613 if( rc==SQLITE_OK ){ | 4900 if( rc==SQLITE_OK ){ |
| 4614 if( nPage==0 ){ | 4901 /* If the database is zero pages in size, that means that either (1) the |
| 4902 ** journal is a remnant from a prior database with the same name where |
| 4903 ** the database file but not the journal was deleted, or (2) the initial |
| 4904 ** transaction that populates a new database is being rolled back. |
| 4905 ** In either case, the journal file can be deleted. However, take care |
| 4906 ** not to delete the journal file if it is already open due to |
| 4907 ** journal_mode=PERSIST. |
| 4908 */ |
| 4909 if( nPage==0 && !jrnlOpen ){ |
| 4615 sqlite3BeginBenignMalloc(); | 4910 sqlite3BeginBenignMalloc(); |
| 4616 if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){ | 4911 if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){ |
| 4617 sqlite3OsDelete(pVfs, pPager->zJournal, 0); | 4912 sqlite3OsDelete(pVfs, pPager->zJournal, 0); |
| 4618 if( !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); | 4913 if( !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); |
| 4619 } | 4914 } |
| 4620 sqlite3EndBenignMalloc(); | 4915 sqlite3EndBenignMalloc(); |
| 4621 }else{ | 4916 }else{ |
| 4622 /* The journal file exists and no other connection has a reserved | 4917 /* The journal file exists and no other connection has a reserved |
| 4623 ** or greater lock on the database file. Now check that there is | 4918 ** or greater lock on the database file. Now check that there is |
| 4624 ** at least one non-zero bytes at the start of the journal file. | 4919 ** at least one non-zero bytes at the start of the journal file. |
| 4625 ** If there is, then we consider this journal to be hot. If not, | 4920 ** If there is, then we consider this journal to be hot. If not, |
| 4626 ** it can be ignored. | 4921 ** it can be ignored. |
| 4627 */ | 4922 */ |
| 4628 if( !jrnlOpen ){ | 4923 if( !jrnlOpen ){ |
| 4629 int f = SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL; | 4924 int f = SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL; |
| 4630 rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f); | 4925 rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f); |
| 4631 } | 4926 } |
| 4632 if( rc==SQLITE_OK ){ | 4927 if( rc==SQLITE_OK ){ |
| 4633 u8 first = 0; | 4928 u8 first = 0; |
| 4634 rc = sqlite3OsRead(pPager->jfd, (void *)&first, 1, 0); | 4929 rc = sqlite3OsRead(pPager->jfd, (void *)&first, 1, 0); |
| 4635 if( rc==SQLITE_IOERR_SHORT_READ ){ | 4930 if( rc==SQLITE_IOERR_SHORT_READ ){ |
| 4636 rc = SQLITE_OK; | 4931 rc = SQLITE_OK; |
| 4637 } | 4932 } |
| 4638 if( !jrnlOpen ){ | 4933 if( !jrnlOpen ){ |
| 4639 sqlite3OsClose(pPager->jfd); | 4934 sqlite3OsClose(pPager->jfd); |
| 4640 } | 4935 } |
| 4641 *pExists = (first!=0); | 4936 *pExists = (first!=0); |
| 4642 }else if( rc==SQLITE_CANTOPEN ){ | 4937 }else if( rc==SQLITE_CANTOPEN ){ |
| 4643 /* If we cannot open the rollback journal file in order to see if | 4938 /* If we cannot open the rollback journal file in order to see if |
| 4644 ** its has a zero header, that might be due to an I/O error, or | 4939 ** it has a zero header, that might be due to an I/O error, or |
| 4645 ** it might be due to the race condition described above and in | 4940 ** it might be due to the race condition described above and in |
| 4646 ** ticket #3883. Either way, assume that the journal is hot. | 4941 ** ticket #3883. Either way, assume that the journal is hot. |
| 4647 ** This might be a false positive. But if it is, then the | 4942 ** This might be a false positive. But if it is, then the |
| 4648 ** automatic journal playback and recovery mechanism will deal | 4943 ** automatic journal playback and recovery mechanism will deal |
| 4649 ** with it under an EXCLUSIVE lock where we do not need to | 4944 ** with it under an EXCLUSIVE lock where we do not need to |
| 4650 ** worry so much with race conditions. | 4945 ** worry so much with race conditions. |
| 4651 */ | 4946 */ |
| 4652 *pExists = 1; | 4947 *pExists = 1; |
| 4653 rc = SQLITE_OK; | 4948 rc = SQLITE_OK; |
| 4654 } | 4949 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4697 */ | 4992 */ |
| 4698 assert( sqlite3PcacheRefCount(pPager->pPCache)==0 ); | 4993 assert( sqlite3PcacheRefCount(pPager->pPCache)==0 ); |
| 4699 assert( assert_pager_state(pPager) ); | 4994 assert( assert_pager_state(pPager) ); |
| 4700 assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); | 4995 assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); |
| 4701 if( NEVER(MEMDB && pPager->errCode) ){ return pPager->errCode; } | 4996 if( NEVER(MEMDB && pPager->errCode) ){ return pPager->errCode; } |
| 4702 | 4997 |
| 4703 if( !pagerUseWal(pPager) && pPager->eState==PAGER_OPEN ){ | 4998 if( !pagerUseWal(pPager) && pPager->eState==PAGER_OPEN ){ |
| 4704 int bHotJournal = 1; /* True if there exists a hot journal-file */ | 4999 int bHotJournal = 1; /* True if there exists a hot journal-file */ |
| 4705 | 5000 |
| 4706 assert( !MEMDB ); | 5001 assert( !MEMDB ); |
| 4707 assert( pPager->noReadlock==0 || pPager->readOnly ); | |
| 4708 | 5002 |
| 4709 if( pPager->noReadlock==0 ){ | 5003 rc = pager_wait_on_lock(pPager, SHARED_LOCK); |
| 4710 rc = pager_wait_on_lock(pPager, SHARED_LOCK); | 5004 if( rc!=SQLITE_OK ){ |
| 4711 if( rc!=SQLITE_OK ){ | 5005 assert( pPager->eLock==NO_LOCK || pPager->eLock==UNKNOWN_LOCK ); |
| 4712 assert( pPager->eLock==NO_LOCK || pPager->eLock==UNKNOWN_LOCK ); | 5006 goto failed; |
| 4713 goto failed; | |
| 4714 } | |
| 4715 } | 5007 } |
| 4716 | 5008 |
| 4717 /* If a journal file exists, and there is no RESERVED lock on the | 5009 /* If a journal file exists, and there is no RESERVED lock on the |
| 4718 ** database file, then it either needs to be played back or deleted. | 5010 ** database file, then it either needs to be played back or deleted. |
| 4719 */ | 5011 */ |
| 4720 if( pPager->eLock<=SHARED_LOCK ){ | 5012 if( pPager->eLock<=SHARED_LOCK ){ |
| 4721 rc = hasHotJournal(pPager, &bHotJournal); | 5013 rc = hasHotJournal(pPager, &bHotJournal); |
| 4722 } | 5014 } |
| 4723 if( rc!=SQLITE_OK ){ | 5015 if( rc!=SQLITE_OK ){ |
| 4724 goto failed; | 5016 goto failed; |
| 4725 } | 5017 } |
| 4726 if( bHotJournal ){ | 5018 if( bHotJournal ){ |
| 5019 if( pPager->readOnly ){ |
| 5020 rc = SQLITE_READONLY_ROLLBACK; |
| 5021 goto failed; |
| 5022 } |
| 5023 |
| 4727 /* Get an EXCLUSIVE lock on the database file. At this point it is | 5024 /* Get an EXCLUSIVE lock on the database file. At this point it is |
| 4728 ** important that a RESERVED lock is not obtained on the way to the | 5025 ** important that a RESERVED lock is not obtained on the way to the |
| 4729 ** EXCLUSIVE lock. If it were, another process might open the | 5026 ** EXCLUSIVE lock. If it were, another process might open the |
| 4730 ** database file, detect the RESERVED lock, and conclude that the | 5027 ** database file, detect the RESERVED lock, and conclude that the |
| 4731 ** database is safe to read while this process is still rolling the | 5028 ** database is safe to read while this process is still rolling the |
| 4732 ** hot-journal back. | 5029 ** hot-journal back. |
| 4733 ** | 5030 ** |
| 4734 ** Because the intermediate RESERVED lock is not requested, any | 5031 ** Because the intermediate RESERVED lock is not requested, any |
| 4735 ** other process attempting to access the database file will get to | 5032 ** other process attempting to access the database file will get to |
| 4736 ** this point in the code and fail to obtain its own EXCLUSIVE lock | 5033 ** this point in the code and fail to obtain its own EXCLUSIVE lock |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4814 pager_error(pPager, rc); | 5111 pager_error(pPager, rc); |
| 4815 goto failed; | 5112 goto failed; |
| 4816 } | 5113 } |
| 4817 | 5114 |
| 4818 assert( pPager->eState==PAGER_OPEN ); | 5115 assert( pPager->eState==PAGER_OPEN ); |
| 4819 assert( (pPager->eLock==SHARED_LOCK) | 5116 assert( (pPager->eLock==SHARED_LOCK) |
| 4820 || (pPager->exclusiveMode && pPager->eLock>SHARED_LOCK) | 5117 || (pPager->exclusiveMode && pPager->eLock>SHARED_LOCK) |
| 4821 ); | 5118 ); |
| 4822 } | 5119 } |
| 4823 | 5120 |
| 4824 if( !pPager->tempFile | 5121 if( !pPager->tempFile && ( |
| 4825 && (pPager->pBackup || sqlite3PcachePagecount(pPager->pPCache)>0) | 5122 pPager->pBackup |
| 4826 ){ | 5123 || sqlite3PcachePagecount(pPager->pPCache)>0 |
| 5124 || USEFETCH(pPager) |
| 5125 )){ |
| 4827 /* The shared-lock has just been acquired on the database file | 5126 /* The shared-lock has just been acquired on the database file |
| 4828 ** and there are already pages in the cache (from a previous | 5127 ** and there are already pages in the cache (from a previous |
| 4829 ** read or write transaction). Check to see if the database | 5128 ** read or write transaction). Check to see if the database |
| 4830 ** has been modified. If the database has changed, flush the | 5129 ** has been modified. If the database has changed, flush the |
| 4831 ** cache. | 5130 ** cache. |
| 4832 ** | 5131 ** |
| 4833 ** Database changes is detected by looking at 15 bytes beginning | 5132 ** Database changes is detected by looking at 15 bytes beginning |
| 4834 ** at offset 24 into the file. The first 4 of these 16 bytes are | 5133 ** at offset 24 into the file. The first 4 of these 16 bytes are |
| 4835 ** a 32-bit counter that is incremented with each change. The | 5134 ** a 32-bit counter that is incremented with each change. The |
| 4836 ** other bytes change randomly with each file change when | 5135 ** other bytes change randomly with each file change when |
| 4837 ** a codec is in use. | 5136 ** a codec is in use. |
| 4838 ** | 5137 ** |
| 4839 ** There is a vanishingly small chance that a change will not be | 5138 ** There is a vanishingly small chance that a change will not be |
| 4840 ** detected. The chance of an undetected change is so small that | 5139 ** detected. The chance of an undetected change is so small that |
| 4841 ** it can be neglected. | 5140 ** it can be neglected. |
| 4842 */ | 5141 */ |
| 4843 Pgno nPage = 0; | 5142 Pgno nPage = 0; |
| 4844 char dbFileVers[sizeof(pPager->dbFileVers)]; | 5143 char dbFileVers[sizeof(pPager->dbFileVers)]; |
| 4845 | 5144 |
| 4846 rc = pagerPagecount(pPager, &nPage); | 5145 rc = pagerPagecount(pPager, &nPage); |
| 4847 if( rc ) goto failed; | 5146 if( rc ) goto failed; |
| 4848 | 5147 |
| 4849 if( nPage>0 ){ | 5148 if( nPage>0 ){ |
| 4850 IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers))); | 5149 IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers))); |
| 4851 rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24); | 5150 rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24); |
| 4852 if( rc!=SQLITE_OK ){ | 5151 if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){ |
| 4853 goto failed; | 5152 goto failed; |
| 4854 } | 5153 } |
| 4855 }else{ | 5154 }else{ |
| 4856 memset(dbFileVers, 0, sizeof(dbFileVers)); | 5155 memset(dbFileVers, 0, sizeof(dbFileVers)); |
| 4857 } | 5156 } |
| 4858 | 5157 |
| 4859 if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){ | 5158 if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){ |
| 4860 pager_reset(pPager); | 5159 pager_reset(pPager); |
| 5160 |
| 5161 /* Unmap the database file. It is possible that external processes |
| 5162 ** may have truncated the database file and then extended it back |
| 5163 ** to its original size while this process was not holding a lock. |
| 5164 ** In this case there may exist a Pager.pMap mapping that appears |
| 5165 ** to be the right size but is not actually valid. Avoid this |
| 5166 ** possibility by unmapping the db here. */ |
| 5167 if( USEFETCH(pPager) ){ |
| 5168 sqlite3OsUnfetch(pPager->fd, 0, 0); |
| 5169 } |
| 4861 } | 5170 } |
| 4862 } | 5171 } |
| 4863 | 5172 |
| 4864 /* If there is a WAL file in the file-system, open this database in WAL | 5173 /* If there is a WAL file in the file-system, open this database in WAL |
| 4865 ** mode. Otherwise, the following function call is a no-op. | 5174 ** mode. Otherwise, the following function call is a no-op. |
| 4866 */ | 5175 */ |
| 4867 rc = pagerOpenWalIfPresent(pPager); | 5176 rc = pagerOpenWalIfPresent(pPager); |
| 4868 #ifndef SQLITE_OMIT_WAL | 5177 #ifndef SQLITE_OMIT_WAL |
| 4869 assert( pPager->pWal==0 || rc==SQLITE_OK ); | 5178 assert( pPager->pWal==0 || rc==SQLITE_OK ); |
| 4870 #endif | 5179 #endif |
| (...skipping 21 matching lines...) Expand all Loading... |
| 4892 | 5201 |
| 4893 /* | 5202 /* |
| 4894 ** If the reference count has reached zero, rollback any active | 5203 ** If the reference count has reached zero, rollback any active |
| 4895 ** transaction and unlock the pager. | 5204 ** transaction and unlock the pager. |
| 4896 ** | 5205 ** |
| 4897 ** Except, in locking_mode=EXCLUSIVE when there is nothing to in | 5206 ** Except, in locking_mode=EXCLUSIVE when there is nothing to in |
| 4898 ** the rollback journal, the unlock is not performed and there is | 5207 ** the rollback journal, the unlock is not performed and there is |
| 4899 ** nothing to rollback, so this routine is a no-op. | 5208 ** nothing to rollback, so this routine is a no-op. |
| 4900 */ | 5209 */ |
| 4901 static void pagerUnlockIfUnused(Pager *pPager){ | 5210 static void pagerUnlockIfUnused(Pager *pPager){ |
| 4902 if( (sqlite3PcacheRefCount(pPager->pPCache)==0) ){ | 5211 if( pPager->nMmapOut==0 && (sqlite3PcacheRefCount(pPager->pPCache)==0) ){ |
| 4903 pagerUnlockAndRollback(pPager); | 5212 pagerUnlockAndRollback(pPager); |
| 4904 } | 5213 } |
| 4905 } | 5214 } |
| 4906 | 5215 |
| 4907 /* | 5216 /* |
| 4908 ** Acquire a reference to page number pgno in pager pPager (a page | 5217 ** Acquire a reference to page number pgno in pager pPager (a page |
| 4909 ** reference has type DbPage*). If the requested reference is | 5218 ** reference has type DbPage*). If the requested reference is |
| 4910 ** successfully obtained, it is copied to *ppPage and SQLITE_OK returned. | 5219 ** successfully obtained, it is copied to *ppPage and SQLITE_OK returned. |
| 4911 ** | 5220 ** |
| 4912 ** If the requested page is already in the cache, it is returned. | 5221 ** If the requested page is already in the cache, it is returned. |
| 4913 ** Otherwise, a new page object is allocated and populated with data | 5222 ** Otherwise, a new page object is allocated and populated with data |
| 4914 ** read from the database file. In some cases, the pcache module may | 5223 ** read from the database file. In some cases, the pcache module may |
| 4915 ** choose not to allocate a new page object and may reuse an existing | 5224 ** choose not to allocate a new page object and may reuse an existing |
| 4916 ** object with no outstanding references. | 5225 ** object with no outstanding references. |
| 4917 ** | 5226 ** |
| 4918 ** The extra data appended to a page is always initialized to zeros the | 5227 ** The extra data appended to a page is always initialized to zeros the |
| 4919 ** first time a page is loaded into memory. If the page requested is | 5228 ** first time a page is loaded into memory. If the page requested is |
| 4920 ** already in the cache when this function is called, then the extra | 5229 ** already in the cache when this function is called, then the extra |
| 4921 ** data is left as it was when the page object was last used. | 5230 ** data is left as it was when the page object was last used. |
| 4922 ** | 5231 ** |
| 4923 ** If the database image is smaller than the requested page or if a | 5232 ** If the database image is smaller than the requested page or if a |
| 4924 ** non-zero value is passed as the noContent parameter and the | 5233 ** non-zero value is passed as the noContent parameter and the |
| 4925 ** requested page is not already stored in the cache, then no | 5234 ** requested page is not already stored in the cache, then no |
| 4926 ** actual disk read occurs. In this case the memory image of the | 5235 ** actual disk read occurs. In this case the memory image of the |
| 4927 ** page is initialized to all zeros. | 5236 ** page is initialized to all zeros. |
| 4928 ** | 5237 ** |
| 4929 ** If noContent is true, it means that we do not care about the contents | 5238 ** If noContent is true, it means that we do not care about the contents |
| 4930 ** of the page. This occurs in two seperate scenarios: | 5239 ** of the page. This occurs in two scenarios: |
| 4931 ** | 5240 ** |
| 4932 ** a) When reading a free-list leaf page from the database, and | 5241 ** a) When reading a free-list leaf page from the database, and |
| 4933 ** | 5242 ** |
| 4934 ** b) When a savepoint is being rolled back and we need to load | 5243 ** b) When a savepoint is being rolled back and we need to load |
| 4935 ** a new page into the cache to be filled with the data read | 5244 ** a new page into the cache to be filled with the data read |
| 4936 ** from the savepoint journal. | 5245 ** from the savepoint journal. |
| 4937 ** | 5246 ** |
| 4938 ** If noContent is true, then the data returned is zeroed instead of | 5247 ** If noContent is true, then the data returned is zeroed instead of |
| 4939 ** being read from the database. Additionally, the bits corresponding | 5248 ** being read from the database. Additionally, the bits corresponding |
| 4940 ** to pgno in Pager.pInJournal (bitvec of pages already written to the | 5249 ** to pgno in Pager.pInJournal (bitvec of pages already written to the |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4951 ** in memory, this routine goes to disk to read it in whereas Lookup() | 5260 ** in memory, this routine goes to disk to read it in whereas Lookup() |
| 4952 ** just returns 0. This routine acquires a read-lock the first time it | 5261 ** just returns 0. This routine acquires a read-lock the first time it |
| 4953 ** has to go to disk, and could also playback an old journal if necessary. | 5262 ** has to go to disk, and could also playback an old journal if necessary. |
| 4954 ** Since Lookup() never goes to disk, it never has to deal with locks | 5263 ** Since Lookup() never goes to disk, it never has to deal with locks |
| 4955 ** or journal files. | 5264 ** or journal files. |
| 4956 */ | 5265 */ |
| 4957 int sqlite3PagerAcquire( | 5266 int sqlite3PagerAcquire( |
| 4958 Pager *pPager, /* The pager open on the database file */ | 5267 Pager *pPager, /* The pager open on the database file */ |
| 4959 Pgno pgno, /* Page number to fetch */ | 5268 Pgno pgno, /* Page number to fetch */ |
| 4960 DbPage **ppPage, /* Write a pointer to the page here */ | 5269 DbPage **ppPage, /* Write a pointer to the page here */ |
| 4961 int noContent /* Do not bother reading content from disk if true */ | 5270 int flags /* PAGER_GET_XXX flags */ |
| 4962 ){ | 5271 ){ |
| 4963 int rc; | 5272 int rc = SQLITE_OK; |
| 4964 PgHdr *pPg; | 5273 PgHdr *pPg = 0; |
| 5274 u32 iFrame = 0; /* Frame to read from WAL file */ |
| 5275 const int noContent = (flags & PAGER_GET_NOCONTENT); |
| 5276 |
| 5277 /* It is acceptable to use a read-only (mmap) page for any page except |
| 5278 ** page 1 if there is no write-transaction open or the ACQUIRE_READONLY |
| 5279 ** flag was specified by the caller. And so long as the db is not a |
| 5280 ** temporary or in-memory database. */ |
| 5281 const int bMmapOk = (pgno!=1 && USEFETCH(pPager) |
| 5282 && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) |
| 5283 #ifdef SQLITE_HAS_CODEC |
| 5284 && pPager->xCodec==0 |
| 5285 #endif |
| 5286 ); |
| 4965 | 5287 |
| 4966 assert( pPager->eState>=PAGER_READER ); | 5288 assert( pPager->eState>=PAGER_READER ); |
| 4967 assert( assert_pager_state(pPager) ); | 5289 assert( assert_pager_state(pPager) ); |
| 5290 assert( noContent==0 || bMmapOk==0 ); |
| 4968 | 5291 |
| 4969 if( pgno==0 ){ | 5292 if( pgno==0 ){ |
| 4970 return SQLITE_CORRUPT_BKPT; | 5293 return SQLITE_CORRUPT_BKPT; |
| 4971 } | 5294 } |
| 4972 | 5295 |
| 4973 /* If the pager is in the error state, return an error immediately. | 5296 /* If the pager is in the error state, return an error immediately. |
| 4974 ** Otherwise, request the page from the PCache layer. */ | 5297 ** Otherwise, request the page from the PCache layer. */ |
| 4975 if( pPager->errCode!=SQLITE_OK ){ | 5298 if( pPager->errCode!=SQLITE_OK ){ |
| 4976 rc = pPager->errCode; | 5299 rc = pPager->errCode; |
| 4977 }else{ | 5300 }else{ |
| 4978 rc = sqlite3PcacheFetch(pPager->pPCache, pgno, 1, ppPage); | 5301 if( bMmapOk && pagerUseWal(pPager) ){ |
| 5302 rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); |
| 5303 if( rc!=SQLITE_OK ) goto pager_acquire_err; |
| 5304 } |
| 5305 |
| 5306 if( bMmapOk && iFrame==0 ){ |
| 5307 void *pData = 0; |
| 5308 |
| 5309 rc = sqlite3OsFetch(pPager->fd, |
| 5310 (i64)(pgno-1) * pPager->pageSize, pPager->pageSize, &pData |
| 5311 ); |
| 5312 |
| 5313 if( rc==SQLITE_OK && pData ){ |
| 5314 if( pPager->eState>PAGER_READER ){ |
| 5315 pPg = sqlite3PagerLookup(pPager, pgno); |
| 5316 } |
| 5317 if( pPg==0 ){ |
| 5318 rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg); |
| 5319 }else{ |
| 5320 sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData); |
| 5321 } |
| 5322 if( pPg ){ |
| 5323 assert( rc==SQLITE_OK ); |
| 5324 *ppPage = pPg; |
| 5325 return SQLITE_OK; |
| 5326 } |
| 5327 } |
| 5328 if( rc!=SQLITE_OK ){ |
| 5329 goto pager_acquire_err; |
| 5330 } |
| 5331 } |
| 5332 |
| 5333 { |
| 5334 sqlite3_pcache_page *pBase; |
| 5335 pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); |
| 5336 if( pBase==0 ){ |
| 5337 rc = sqlite3PcacheFetchStress(pPager->pPCache, pgno, &pBase); |
| 5338 if( rc!=SQLITE_OK ) goto pager_acquire_err; |
| 5339 } |
| 5340 pPg = *ppPage = sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pBase); |
| 5341 if( pPg==0 ) rc = SQLITE_NOMEM; |
| 5342 } |
| 4979 } | 5343 } |
| 4980 | 5344 |
| 4981 if( rc!=SQLITE_OK ){ | 5345 if( rc!=SQLITE_OK ){ |
| 4982 /* Either the call to sqlite3PcacheFetch() returned an error or the | 5346 /* Either the call to sqlite3PcacheFetch() returned an error or the |
| 4983 ** pager was already in the error-state when this function was called. | 5347 ** pager was already in the error-state when this function was called. |
| 4984 ** Set pPg to 0 and jump to the exception handler. */ | 5348 ** Set pPg to 0 and jump to the exception handler. */ |
| 4985 pPg = 0; | 5349 pPg = 0; |
| 4986 goto pager_acquire_err; | 5350 goto pager_acquire_err; |
| 4987 } | 5351 } |
| 4988 assert( (*ppPage)->pgno==pgno ); | 5352 assert( (*ppPage)->pgno==pgno ); |
| 4989 assert( (*ppPage)->pPager==pPager || (*ppPage)->pPager==0 ); | 5353 assert( (*ppPage)->pPager==pPager || (*ppPage)->pPager==0 ); |
| 4990 | 5354 |
| 4991 if( (*ppPage)->pPager && !noContent ){ | 5355 if( (*ppPage)->pPager && !noContent ){ |
| 4992 /* In this case the pcache already contains an initialized copy of | 5356 /* In this case the pcache already contains an initialized copy of |
| 4993 ** the page. Return without further ado. */ | 5357 ** the page. Return without further ado. */ |
| 4994 assert( pgno<=PAGER_MAX_PGNO && pgno!=PAGER_MJ_PGNO(pPager) ); | 5358 assert( pgno<=PAGER_MAX_PGNO && pgno!=PAGER_MJ_PGNO(pPager) ); |
| 4995 PAGER_INCR(pPager->nHit); | 5359 pPager->aStat[PAGER_STAT_HIT]++; |
| 4996 return SQLITE_OK; | 5360 return SQLITE_OK; |
| 4997 | 5361 |
| 4998 }else{ | 5362 }else{ |
| 4999 /* The pager cache has created a new page. Its content needs to | 5363 /* The pager cache has created a new page. Its content needs to |
| 5000 ** be initialized. */ | 5364 ** be initialized. */ |
| 5001 | 5365 |
| 5002 PAGER_INCR(pPager->nMiss); | |
| 5003 pPg = *ppPage; | 5366 pPg = *ppPage; |
| 5004 pPg->pPager = pPager; | 5367 pPg->pPager = pPager; |
| 5005 | 5368 |
| 5006 /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page | 5369 /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page |
| 5007 ** number greater than this, or the unused locking-page, is requested. */ | 5370 ** number greater than this, or the unused locking-page, is requested. */ |
| 5008 if( pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){ | 5371 if( pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){ |
| 5009 rc = SQLITE_CORRUPT_BKPT; | 5372 rc = SQLITE_CORRUPT_BKPT; |
| 5010 goto pager_acquire_err; | 5373 goto pager_acquire_err; |
| 5011 } | 5374 } |
| 5012 | 5375 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 5027 TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno); | 5390 TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno); |
| 5028 testcase( rc==SQLITE_NOMEM ); | 5391 testcase( rc==SQLITE_NOMEM ); |
| 5029 } | 5392 } |
| 5030 TESTONLY( rc = ) addToSavepointBitvecs(pPager, pgno); | 5393 TESTONLY( rc = ) addToSavepointBitvecs(pPager, pgno); |
| 5031 testcase( rc==SQLITE_NOMEM ); | 5394 testcase( rc==SQLITE_NOMEM ); |
| 5032 sqlite3EndBenignMalloc(); | 5395 sqlite3EndBenignMalloc(); |
| 5033 } | 5396 } |
| 5034 memset(pPg->pData, 0, pPager->pageSize); | 5397 memset(pPg->pData, 0, pPager->pageSize); |
| 5035 IOTRACE(("ZERO %p %d\n", pPager, pgno)); | 5398 IOTRACE(("ZERO %p %d\n", pPager, pgno)); |
| 5036 }else{ | 5399 }else{ |
| 5400 if( pagerUseWal(pPager) && bMmapOk==0 ){ |
| 5401 rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); |
| 5402 if( rc!=SQLITE_OK ) goto pager_acquire_err; |
| 5403 } |
| 5037 assert( pPg->pPager==pPager ); | 5404 assert( pPg->pPager==pPager ); |
| 5038 rc = readDbPage(pPg); | 5405 pPager->aStat[PAGER_STAT_MISS]++; |
| 5406 rc = readDbPage(pPg, iFrame); |
| 5039 if( rc!=SQLITE_OK ){ | 5407 if( rc!=SQLITE_OK ){ |
| 5040 goto pager_acquire_err; | 5408 goto pager_acquire_err; |
| 5041 } | 5409 } |
| 5042 } | 5410 } |
| 5043 pager_set_pagehash(pPg); | 5411 pager_set_pagehash(pPg); |
| 5044 } | 5412 } |
| 5045 | 5413 |
| 5046 return SQLITE_OK; | 5414 return SQLITE_OK; |
| 5047 | 5415 |
| 5048 pager_acquire_err: | 5416 pager_acquire_err: |
| (...skipping 12 matching lines...) Expand all Loading... |
| 5061 ** not read the page from disk. Return a pointer to the page, | 5429 ** not read the page from disk. Return a pointer to the page, |
| 5062 ** or 0 if the page is not in cache. | 5430 ** or 0 if the page is not in cache. |
| 5063 ** | 5431 ** |
| 5064 ** See also sqlite3PagerGet(). The difference between this routine | 5432 ** See also sqlite3PagerGet(). The difference between this routine |
| 5065 ** and sqlite3PagerGet() is that _get() will go to the disk and read | 5433 ** and sqlite3PagerGet() is that _get() will go to the disk and read |
| 5066 ** in the page if the page is not already in cache. This routine | 5434 ** in the page if the page is not already in cache. This routine |
| 5067 ** returns NULL if the page is not in cache or if a disk I/O error | 5435 ** returns NULL if the page is not in cache or if a disk I/O error |
| 5068 ** has ever happened. | 5436 ** has ever happened. |
| 5069 */ | 5437 */ |
| 5070 DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ | 5438 DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ |
| 5071 PgHdr *pPg = 0; | 5439 sqlite3_pcache_page *pPage; |
| 5072 assert( pPager!=0 ); | 5440 assert( pPager!=0 ); |
| 5073 assert( pgno!=0 ); | 5441 assert( pgno!=0 ); |
| 5074 assert( pPager->pPCache!=0 ); | 5442 assert( pPager->pPCache!=0 ); |
| 5075 assert( pPager->eState>=PAGER_READER && pPager->eState!=PAGER_ERROR ); | 5443 pPage = sqlite3PcacheFetch(pPager->pPCache, pgno, 0); |
| 5076 sqlite3PcacheFetch(pPager->pPCache, pgno, 0, &pPg); | 5444 return sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pPage); |
| 5077 return pPg; | |
| 5078 } | 5445 } |
| 5079 | 5446 |
| 5080 /* | 5447 /* |
| 5081 ** Release a page reference. | 5448 ** Release a page reference. |
| 5082 ** | 5449 ** |
| 5083 ** If the number of references to the page drop to zero, then the | 5450 ** If the number of references to the page drop to zero, then the |
| 5084 ** page is added to the LRU list. When all references to all pages | 5451 ** page is added to the LRU list. When all references to all pages |
| 5085 ** are released, a rollback occurs and the lock on the database is | 5452 ** are released, a rollback occurs and the lock on the database is |
| 5086 ** removed. | 5453 ** removed. |
| 5087 */ | 5454 */ |
| 5455 void sqlite3PagerUnrefNotNull(DbPage *pPg){ |
| 5456 Pager *pPager; |
| 5457 assert( pPg!=0 ); |
| 5458 pPager = pPg->pPager; |
| 5459 if( pPg->flags & PGHDR_MMAP ){ |
| 5460 pagerReleaseMapPage(pPg); |
| 5461 }else{ |
| 5462 sqlite3PcacheRelease(pPg); |
| 5463 } |
| 5464 pagerUnlockIfUnused(pPager); |
| 5465 } |
| 5088 void sqlite3PagerUnref(DbPage *pPg){ | 5466 void sqlite3PagerUnref(DbPage *pPg){ |
| 5089 if( pPg ){ | 5467 if( pPg ) sqlite3PagerUnrefNotNull(pPg); |
| 5090 Pager *pPager = pPg->pPager; | |
| 5091 sqlite3PcacheRelease(pPg); | |
| 5092 pagerUnlockIfUnused(pPager); | |
| 5093 } | |
| 5094 } | 5468 } |
| 5095 | 5469 |
| 5096 #if defined(__APPLE__) | |
| 5097 /* | |
| 5098 ** Create and return a CFURLRef given a cstring containing the path to a file. | |
| 5099 */ | |
| 5100 static CFURLRef create_cfurl_from_cstring(const char* filePath){ | |
| 5101 CFStringRef urlString = CFStringCreateWithFileSystemRepresentation( | |
| 5102 kCFAllocatorDefault, filePath); | |
| 5103 CFURLRef urlRef = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, | |
| 5104 urlString, kCFURLPOSIXPathStyle, FALSE); | |
| 5105 CFRelease(urlString); | |
| 5106 return urlRef; | |
| 5107 } | |
| 5108 #endif | |
| 5109 | |
| 5110 /* | 5470 /* |
| 5111 ** This function is called at the start of every write transaction. | 5471 ** This function is called at the start of every write transaction. |
| 5112 ** There must already be a RESERVED or EXCLUSIVE lock on the database | 5472 ** There must already be a RESERVED or EXCLUSIVE lock on the database |
| 5113 ** file when this routine is called. | 5473 ** file when this routine is called. |
| 5114 ** | 5474 ** |
| 5115 ** Open the journal file for pager pPager and write a journal header | 5475 ** Open the journal file for pager pPager and write a journal header |
| 5116 ** to the start of it. If there are active savepoints, open the sub-journal | 5476 ** to the start of it. If there are active savepoints, open the sub-journal |
| 5117 ** as well. This function is only used when the journal file is being | 5477 ** as well. This function is only used when the journal file is being |
| 5118 ** opened to write a rollback log for a transaction. It is not used | 5478 ** opened to write a rollback log for a transaction. It is not used |
| 5119 ** when opening a hot journal file to roll it back. | 5479 ** when opening a hot journal file to roll it back. |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5152 if( !isOpen(pPager->jfd) ){ | 5512 if( !isOpen(pPager->jfd) ){ |
| 5153 if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){ | 5513 if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){ |
| 5154 sqlite3MemJournalOpen(pPager->jfd); | 5514 sqlite3MemJournalOpen(pPager->jfd); |
| 5155 }else{ | 5515 }else{ |
| 5156 const int flags = /* VFS flags to open journal file */ | 5516 const int flags = /* VFS flags to open journal file */ |
| 5157 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| | 5517 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| |
| 5158 (pPager->tempFile ? | 5518 (pPager->tempFile ? |
| 5159 (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL): | 5519 (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL): |
| 5160 (SQLITE_OPEN_MAIN_JOURNAL) | 5520 (SQLITE_OPEN_MAIN_JOURNAL) |
| 5161 ); | 5521 ); |
| 5162 #ifdef SQLITE_ENABLE_ATOMIC_WRITE | 5522 |
| 5163 rc = sqlite3JournalOpen( | 5523 /* Verify that the database still has the same name as it did when |
| 5164 pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) | 5524 ** it was originally opened. */ |
| 5165 ); | 5525 rc = databaseIsUnmoved(pPager); |
| 5166 #else | 5526 if( rc==SQLITE_OK ){ |
| 5167 rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); | 5527 #ifdef SQLITE_ENABLE_ATOMIC_WRITE |
| 5168 #endif | 5528 rc = sqlite3JournalOpen( |
| 5169 #if defined(__APPLE__) | 5529 pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) |
| 5170 /* Set the TimeMachine exclusion metadata for the journal if it has | 5530 ); |
| 5171 ** been set for the database. Only do this for unix-type vfs | 5531 #else |
| 5172 ** implementations. */ | 5532 rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); |
| 5173 if( rc==SQLITE_OK && pPager->zFilename!=NULL | 5533 #endif |
| 5174 && strlen(pPager->zFilename)>0 | |
| 5175 && strncmp(pVfs->zName, "unix", 4)==0 | |
| 5176 && ( pVfs->zName[4]=='-' || pVfs->zName[4]=='\0' ) ){ | |
| 5177 CFURLRef database = create_cfurl_from_cstring(pPager->zFilename); | |
| 5178 if( CSBackupIsItemExcluded(database, NULL) ){ | |
| 5179 CFURLRef journal = create_cfurl_from_cstring(pPager->zJournal); | |
| 5180 /* Ignore errors from the following exclusion call. */ | |
| 5181 CSBackupSetItemExcluded(journal, TRUE, FALSE); | |
| 5182 CFRelease(journal); | |
| 5183 } | |
| 5184 CFRelease(database); | |
| 5185 } | 5534 } |
| 5186 #endif | |
| 5187 } | 5535 } |
| 5188 assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); | 5536 assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); |
| 5189 } | 5537 } |
| 5190 | 5538 |
| 5191 | 5539 |
| 5192 /* Write the first journal header to the journal file and open | 5540 /* Write the first journal header to the journal file and open |
| 5193 ** the sub-journal if necessary. | 5541 ** the sub-journal if necessary. |
| 5194 */ | 5542 */ |
| 5195 if( rc==SQLITE_OK ){ | 5543 if( rc==SQLITE_OK ){ |
| 5196 /* TODO: Check if all of these are really required. */ | 5544 /* TODO: Check if all of these are really required. */ |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5297 } | 5645 } |
| 5298 | 5646 |
| 5299 /* | 5647 /* |
| 5300 ** Mark a single data page as writeable. The page is written into the | 5648 ** Mark a single data page as writeable. The page is written into the |
| 5301 ** main journal or sub-journal as required. If the page is written into | 5649 ** main journal or sub-journal as required. If the page is written into |
| 5302 ** one of the journals, the corresponding bit is set in the | 5650 ** one of the journals, the corresponding bit is set in the |
| 5303 ** Pager.pInJournal bitvec and the PagerSavepoint.pInSavepoint bitvecs | 5651 ** Pager.pInJournal bitvec and the PagerSavepoint.pInSavepoint bitvecs |
| 5304 ** of any open savepoints as appropriate. | 5652 ** of any open savepoints as appropriate. |
| 5305 */ | 5653 */ |
| 5306 static int pager_write(PgHdr *pPg){ | 5654 static int pager_write(PgHdr *pPg){ |
| 5307 void *pData = pPg->pData; | |
| 5308 Pager *pPager = pPg->pPager; | 5655 Pager *pPager = pPg->pPager; |
| 5309 int rc = SQLITE_OK; | 5656 int rc = SQLITE_OK; |
| 5657 int inJournal; |
| 5310 | 5658 |
| 5311 /* This routine is not called unless a write-transaction has already | 5659 /* This routine is not called unless a write-transaction has already |
| 5312 ** been started. The journal file may or may not be open at this point. | 5660 ** been started. The journal file may or may not be open at this point. |
| 5313 ** It is never called in the ERROR state. | 5661 ** It is never called in the ERROR state. |
| 5314 */ | 5662 */ |
| 5315 assert( pPager->eState==PAGER_WRITER_LOCKED | 5663 assert( pPager->eState==PAGER_WRITER_LOCKED |
| 5316 || pPager->eState==PAGER_WRITER_CACHEMOD | 5664 || pPager->eState==PAGER_WRITER_CACHEMOD |
| 5317 || pPager->eState==PAGER_WRITER_DBMOD | 5665 || pPager->eState==PAGER_WRITER_DBMOD |
| 5318 ); | 5666 ); |
| 5319 assert( assert_pager_state(pPager) ); | 5667 assert( assert_pager_state(pPager) ); |
| 5320 | 5668 assert( pPager->errCode==0 ); |
| 5321 /* If an error has been previously detected, report the same error | 5669 assert( pPager->readOnly==0 ); |
| 5322 ** again. This should not happen, but the check provides robustness. */ | |
| 5323 if( NEVER(pPager->errCode) ) return pPager->errCode; | |
| 5324 | |
| 5325 /* Higher-level routines never call this function if database is not | |
| 5326 ** writable. But check anyway, just for robustness. */ | |
| 5327 if( NEVER(pPager->readOnly) ) return SQLITE_PERM; | |
| 5328 | 5670 |
| 5329 CHECK_PAGE(pPg); | 5671 CHECK_PAGE(pPg); |
| 5330 | 5672 |
| 5331 /* The journal file needs to be opened. Higher level routines have already | 5673 /* The journal file needs to be opened. Higher level routines have already |
| 5332 ** obtained the necessary locks to begin the write-transaction, but the | 5674 ** obtained the necessary locks to begin the write-transaction, but the |
| 5333 ** rollback journal might not yet be open. Open it now if this is the case. | 5675 ** rollback journal might not yet be open. Open it now if this is the case. |
| 5334 ** | 5676 ** |
| 5335 ** This is done before calling sqlite3PcacheMakeDirty() on the page. | 5677 ** This is done before calling sqlite3PcacheMakeDirty() on the page. |
| 5336 ** Otherwise, if it were done after calling sqlite3PcacheMakeDirty(), then | 5678 ** Otherwise, if it were done after calling sqlite3PcacheMakeDirty(), then |
| 5337 ** an error might occur and the pager would end up in WRITER_LOCKED state | 5679 ** an error might occur and the pager would end up in WRITER_LOCKED state |
| 5338 ** with pages marked as dirty in the cache. | 5680 ** with pages marked as dirty in the cache. |
| 5339 */ | 5681 */ |
| 5340 if( pPager->eState==PAGER_WRITER_LOCKED ){ | 5682 if( pPager->eState==PAGER_WRITER_LOCKED ){ |
| 5341 rc = pager_open_journal(pPager); | 5683 rc = pager_open_journal(pPager); |
| 5342 if( rc!=SQLITE_OK ) return rc; | 5684 if( rc!=SQLITE_OK ) return rc; |
| 5343 } | 5685 } |
| 5344 assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); | 5686 assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); |
| 5345 assert( assert_pager_state(pPager) ); | 5687 assert( assert_pager_state(pPager) ); |
| 5346 | 5688 |
| 5347 /* Mark the page as dirty. If the page has already been written | 5689 /* Mark the page as dirty. If the page has already been written |
| 5348 ** to the journal then we can return right away. | 5690 ** to the journal then we can return right away. |
| 5349 */ | 5691 */ |
| 5350 sqlite3PcacheMakeDirty(pPg); | 5692 sqlite3PcacheMakeDirty(pPg); |
| 5351 if( pageInJournal(pPg) && !subjRequiresPage(pPg) ){ | 5693 inJournal = pageInJournal(pPager, pPg); |
| 5694 if( inJournal && (pPager->nSavepoint==0 || !subjRequiresPage(pPg)) ){ |
| 5352 assert( !pagerUseWal(pPager) ); | 5695 assert( !pagerUseWal(pPager) ); |
| 5353 }else{ | 5696 }else{ |
| 5354 | 5697 |
| 5355 /* The transaction journal now exists and we have a RESERVED or an | 5698 /* The transaction journal now exists and we have a RESERVED or an |
| 5356 ** EXCLUSIVE lock on the main database file. Write the current page to | 5699 ** EXCLUSIVE lock on the main database file. Write the current page to |
| 5357 ** the transaction journal if it is not there already. | 5700 ** the transaction journal if it is not there already. |
| 5358 */ | 5701 */ |
| 5359 if( !pageInJournal(pPg) && !pagerUseWal(pPager) ){ | 5702 if( !inJournal && !pagerUseWal(pPager) ){ |
| 5360 assert( pagerUseWal(pPager)==0 ); | 5703 assert( pagerUseWal(pPager)==0 ); |
| 5361 if( pPg->pgno<=pPager->dbOrigSize && isOpen(pPager->jfd) ){ | 5704 if( pPg->pgno<=pPager->dbOrigSize && isOpen(pPager->jfd) ){ |
| 5362 u32 cksum; | 5705 u32 cksum; |
| 5363 char *pData2; | 5706 char *pData2; |
| 5364 i64 iOff = pPager->journalOff; | 5707 i64 iOff = pPager->journalOff; |
| 5365 | 5708 |
| 5366 /* We should never write to the journal file the page that | 5709 /* We should never write to the journal file the page that |
| 5367 ** contains the database locks. The following assert verifies | 5710 ** contains the database locks. The following assert verifies |
| 5368 ** that we do not. */ | 5711 ** that we do not. */ |
| 5369 assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); | 5712 assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); |
| 5370 | 5713 |
| 5371 assert( pPager->journalHdr<=pPager->journalOff ); | 5714 assert( pPager->journalHdr<=pPager->journalOff ); |
| 5372 CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); | 5715 CODEC2(pPager, pPg->pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); |
| 5373 cksum = pager_cksum(pPager, (u8*)pData2); | 5716 cksum = pager_cksum(pPager, (u8*)pData2); |
| 5374 | 5717 |
| 5375 /* Even if an IO or diskfull error occurs while journalling the | 5718 /* Even if an IO or diskfull error occurs while journalling the |
| 5376 ** page in the block above, set the need-sync flag for the page. | 5719 ** page in the block above, set the need-sync flag for the page. |
| 5377 ** Otherwise, when the transaction is rolled back, the logic in | 5720 ** Otherwise, when the transaction is rolled back, the logic in |
| 5378 ** playback_one_page() will think that the page needs to be restored | 5721 ** playback_one_page() will think that the page needs to be restored |
| 5379 ** in the database file. And if an IO error occurs while doing so, | 5722 ** in the database file. And if an IO error occurs while doing so, |
| 5380 ** then corruption may follow. | 5723 ** then corruption may follow. |
| 5381 */ | 5724 */ |
| 5382 pPg->flags |= PGHDR_NEED_SYNC; | 5725 pPg->flags |= PGHDR_NEED_SYNC; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5414 PAGERID(pPager), pPg->pgno, | 5757 PAGERID(pPager), pPg->pgno, |
| 5415 ((pPg->flags&PGHDR_NEED_SYNC)?1:0))); | 5758 ((pPg->flags&PGHDR_NEED_SYNC)?1:0))); |
| 5416 } | 5759 } |
| 5417 } | 5760 } |
| 5418 | 5761 |
| 5419 /* If the statement journal is open and the page is not in it, | 5762 /* If the statement journal is open and the page is not in it, |
| 5420 ** then write the current page to the statement journal. Note that | 5763 ** then write the current page to the statement journal. Note that |
| 5421 ** the statement journal format differs from the standard journal format | 5764 ** the statement journal format differs from the standard journal format |
| 5422 ** in that it omits the checksums and the header. | 5765 ** in that it omits the checksums and the header. |
| 5423 */ | 5766 */ |
| 5424 if( subjRequiresPage(pPg) ){ | 5767 if( pPager->nSavepoint>0 && subjRequiresPage(pPg) ){ |
| 5425 rc = subjournalPage(pPg); | 5768 rc = subjournalPage(pPg); |
| 5426 } | 5769 } |
| 5427 } | 5770 } |
| 5428 | 5771 |
| 5429 /* Update the database size and return. | 5772 /* Update the database size and return. |
| 5430 */ | 5773 */ |
| 5431 if( pPager->dbSize<pPg->pgno ){ | 5774 if( pPager->dbSize<pPg->pgno ){ |
| 5432 pPager->dbSize = pPg->pgno; | 5775 pPager->dbSize = pPg->pgno; |
| 5433 } | 5776 } |
| 5434 return rc; | 5777 return rc; |
| 5435 } | 5778 } |
| 5436 | 5779 |
| 5437 /* | 5780 /* |
| 5781 ** This is a variant of sqlite3PagerWrite() that runs when the sector size |
| 5782 ** is larger than the page size. SQLite makes the (reasonable) assumption that |
| 5783 ** all bytes of a sector are written together by hardware. Hence, all bytes of |
| 5784 ** a sector need to be journalled in case of a power loss in the middle of |
| 5785 ** a write. |
| 5786 ** |
| 5787 ** Usually, the sector size is less than or equal to the page size, in which |
| 5788 ** case pages can be individually written. This routine only runs in the except
ional |
| 5789 ** case where the page size is smaller than the sector size. |
| 5790 */ |
| 5791 static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ |
| 5792 int rc = SQLITE_OK; /* Return code */ |
| 5793 Pgno nPageCount; /* Total number of pages in database file */ |
| 5794 Pgno pg1; /* First page of the sector pPg is located on.
*/ |
| 5795 int nPage = 0; /* Number of pages starting at pg1 to journal *
/ |
| 5796 int ii; /* Loop counter */ |
| 5797 int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */ |
| 5798 Pager *pPager = pPg->pPager; /* The pager that owns pPg */ |
| 5799 Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); |
| 5800 |
| 5801 /* Set the doNotSpill NOSYNC bit to 1. This is because we cannot allow |
| 5802 ** a journal header to be written between the pages journaled by |
| 5803 ** this function. |
| 5804 */ |
| 5805 assert( !MEMDB ); |
| 5806 assert( (pPager->doNotSpill & SPILLFLAG_NOSYNC)==0 ); |
| 5807 pPager->doNotSpill |= SPILLFLAG_NOSYNC; |
| 5808 |
| 5809 /* This trick assumes that both the page-size and sector-size are |
| 5810 ** an integer power of 2. It sets variable pg1 to the identifier |
| 5811 ** of the first page of the sector pPg is located on. |
| 5812 */ |
| 5813 pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1; |
| 5814 |
| 5815 nPageCount = pPager->dbSize; |
| 5816 if( pPg->pgno>nPageCount ){ |
| 5817 nPage = (pPg->pgno - pg1)+1; |
| 5818 }else if( (pg1+nPagePerSector-1)>nPageCount ){ |
| 5819 nPage = nPageCount+1-pg1; |
| 5820 }else{ |
| 5821 nPage = nPagePerSector; |
| 5822 } |
| 5823 assert(nPage>0); |
| 5824 assert(pg1<=pPg->pgno); |
| 5825 assert((pg1+nPage)>pPg->pgno); |
| 5826 |
| 5827 for(ii=0; ii<nPage && rc==SQLITE_OK; ii++){ |
| 5828 Pgno pg = pg1+ii; |
| 5829 PgHdr *pPage; |
| 5830 if( pg==pPg->pgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){ |
| 5831 if( pg!=PAGER_MJ_PGNO(pPager) ){ |
| 5832 rc = sqlite3PagerGet(pPager, pg, &pPage); |
| 5833 if( rc==SQLITE_OK ){ |
| 5834 rc = pager_write(pPage); |
| 5835 if( pPage->flags&PGHDR_NEED_SYNC ){ |
| 5836 needSync = 1; |
| 5837 } |
| 5838 sqlite3PagerUnrefNotNull(pPage); |
| 5839 } |
| 5840 } |
| 5841 }else if( (pPage = sqlite3PagerLookup(pPager, pg))!=0 ){ |
| 5842 if( pPage->flags&PGHDR_NEED_SYNC ){ |
| 5843 needSync = 1; |
| 5844 } |
| 5845 sqlite3PagerUnrefNotNull(pPage); |
| 5846 } |
| 5847 } |
| 5848 |
| 5849 /* If the PGHDR_NEED_SYNC flag is set for any of the nPage pages |
| 5850 ** starting at pg1, then it needs to be set for all of them. Because |
| 5851 ** writing to any of these nPage pages may damage the others, the |
| 5852 ** journal file must contain sync()ed copies of all of them |
| 5853 ** before any of them can be written out to the database file. |
| 5854 */ |
| 5855 if( rc==SQLITE_OK && needSync ){ |
| 5856 assert( !MEMDB ); |
| 5857 for(ii=0; ii<nPage; ii++){ |
| 5858 PgHdr *pPage = sqlite3PagerLookup(pPager, pg1+ii); |
| 5859 if( pPage ){ |
| 5860 pPage->flags |= PGHDR_NEED_SYNC; |
| 5861 sqlite3PagerUnrefNotNull(pPage); |
| 5862 } |
| 5863 } |
| 5864 } |
| 5865 |
| 5866 assert( (pPager->doNotSpill & SPILLFLAG_NOSYNC)!=0 ); |
| 5867 pPager->doNotSpill &= ~SPILLFLAG_NOSYNC; |
| 5868 return rc; |
| 5869 } |
| 5870 |
| 5871 /* |
| 5438 ** Mark a data page as writeable. This routine must be called before | 5872 ** Mark a data page as writeable. This routine must be called before |
| 5439 ** making changes to a page. The caller must check the return value | 5873 ** making changes to a page. The caller must check the return value |
| 5440 ** of this function and be careful not to change any page data unless | 5874 ** of this function and be careful not to change any page data unless |
| 5441 ** this routine returns SQLITE_OK. | 5875 ** this routine returns SQLITE_OK. |
| 5442 ** | 5876 ** |
| 5443 ** The difference between this function and pager_write() is that this | 5877 ** The difference between this function and pager_write() is that this |
| 5444 ** function also deals with the special case where 2 or more pages | 5878 ** function also deals with the special case where 2 or more pages |
| 5445 ** fit on a single disk sector. In this case all co-resident pages | 5879 ** fit on a single disk sector. In this case all co-resident pages |
| 5446 ** must have been written to the journal file before returning. | 5880 ** must have been written to the journal file before returning. |
| 5447 ** | 5881 ** |
| 5448 ** If an error occurs, SQLITE_NOMEM or an IO error code is returned | 5882 ** If an error occurs, SQLITE_NOMEM or an IO error code is returned |
| 5449 ** as appropriate. Otherwise, SQLITE_OK. | 5883 ** as appropriate. Otherwise, SQLITE_OK. |
| 5450 */ | 5884 */ |
| 5451 int sqlite3PagerWrite(DbPage *pDbPage){ | 5885 int sqlite3PagerWrite(PgHdr *pPg){ |
| 5452 int rc = SQLITE_OK; | 5886 assert( (pPg->flags & PGHDR_MMAP)==0 ); |
| 5453 | 5887 assert( pPg->pPager->eState>=PAGER_WRITER_LOCKED ); |
| 5454 PgHdr *pPg = pDbPage; | 5888 assert( pPg->pPager->eState!=PAGER_ERROR ); |
| 5455 Pager *pPager = pPg->pPager; | 5889 assert( assert_pager_state(pPg->pPager) ); |
| 5456 Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); | 5890 if( pPg->pPager->sectorSize > (u32)pPg->pPager->pageSize ){ |
| 5457 | 5891 return pagerWriteLargeSector(pPg); |
| 5458 assert( pPager->eState>=PAGER_WRITER_LOCKED ); | |
| 5459 assert( pPager->eState!=PAGER_ERROR ); | |
| 5460 assert( assert_pager_state(pPager) ); | |
| 5461 | |
| 5462 if( nPagePerSector>1 ){ | |
| 5463 Pgno nPageCount; /* Total number of pages in database file */ | |
| 5464 Pgno pg1; /* First page of the sector pPg is located on. */ | |
| 5465 int nPage = 0; /* Number of pages starting at pg1 to journal */ | |
| 5466 int ii; /* Loop counter */ | |
| 5467 int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */ | |
| 5468 | |
| 5469 /* Set the doNotSyncSpill flag to 1. This is because we cannot allow | |
| 5470 ** a journal header to be written between the pages journaled by | |
| 5471 ** this function. | |
| 5472 */ | |
| 5473 assert( !MEMDB ); | |
| 5474 assert( pPager->doNotSyncSpill==0 ); | |
| 5475 pPager->doNotSyncSpill++; | |
| 5476 | |
| 5477 /* This trick assumes that both the page-size and sector-size are | |
| 5478 ** an integer power of 2. It sets variable pg1 to the identifier | |
| 5479 ** of the first page of the sector pPg is located on. | |
| 5480 */ | |
| 5481 pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1; | |
| 5482 | |
| 5483 nPageCount = pPager->dbSize; | |
| 5484 if( pPg->pgno>nPageCount ){ | |
| 5485 nPage = (pPg->pgno - pg1)+1; | |
| 5486 }else if( (pg1+nPagePerSector-1)>nPageCount ){ | |
| 5487 nPage = nPageCount+1-pg1; | |
| 5488 }else{ | |
| 5489 nPage = nPagePerSector; | |
| 5490 } | |
| 5491 assert(nPage>0); | |
| 5492 assert(pg1<=pPg->pgno); | |
| 5493 assert((pg1+nPage)>pPg->pgno); | |
| 5494 | |
| 5495 for(ii=0; ii<nPage && rc==SQLITE_OK; ii++){ | |
| 5496 Pgno pg = pg1+ii; | |
| 5497 PgHdr *pPage; | |
| 5498 if( pg==pPg->pgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){ | |
| 5499 if( pg!=PAGER_MJ_PGNO(pPager) ){ | |
| 5500 rc = sqlite3PagerGet(pPager, pg, &pPage); | |
| 5501 if( rc==SQLITE_OK ){ | |
| 5502 rc = pager_write(pPage); | |
| 5503 if( pPage->flags&PGHDR_NEED_SYNC ){ | |
| 5504 needSync = 1; | |
| 5505 } | |
| 5506 sqlite3PagerUnref(pPage); | |
| 5507 } | |
| 5508 } | |
| 5509 }else if( (pPage = pager_lookup(pPager, pg))!=0 ){ | |
| 5510 if( pPage->flags&PGHDR_NEED_SYNC ){ | |
| 5511 needSync = 1; | |
| 5512 } | |
| 5513 sqlite3PagerUnref(pPage); | |
| 5514 } | |
| 5515 } | |
| 5516 | |
| 5517 /* If the PGHDR_NEED_SYNC flag is set for any of the nPage pages | |
| 5518 ** starting at pg1, then it needs to be set for all of them. Because | |
| 5519 ** writing to any of these nPage pages may damage the others, the | |
| 5520 ** journal file must contain sync()ed copies of all of them | |
| 5521 ** before any of them can be written out to the database file. | |
| 5522 */ | |
| 5523 if( rc==SQLITE_OK && needSync ){ | |
| 5524 assert( !MEMDB ); | |
| 5525 for(ii=0; ii<nPage; ii++){ | |
| 5526 PgHdr *pPage = pager_lookup(pPager, pg1+ii); | |
| 5527 if( pPage ){ | |
| 5528 pPage->flags |= PGHDR_NEED_SYNC; | |
| 5529 sqlite3PagerUnref(pPage); | |
| 5530 } | |
| 5531 } | |
| 5532 } | |
| 5533 | |
| 5534 assert( pPager->doNotSyncSpill==1 ); | |
| 5535 pPager->doNotSyncSpill--; | |
| 5536 }else{ | 5892 }else{ |
| 5537 rc = pager_write(pDbPage); | 5893 return pager_write(pPg); |
| 5538 } | 5894 } |
| 5539 return rc; | |
| 5540 } | 5895 } |
| 5541 | 5896 |
| 5542 /* | 5897 /* |
| 5543 ** Return TRUE if the page given in the argument was previously passed | 5898 ** Return TRUE if the page given in the argument was previously passed |
| 5544 ** to sqlite3PagerWrite(). In other words, return TRUE if it is ok | 5899 ** to sqlite3PagerWrite(). In other words, return TRUE if it is ok |
| 5545 ** to change the content of the page. | 5900 ** to change the content of the page. |
| 5546 */ | 5901 */ |
| 5547 #ifndef NDEBUG | 5902 #ifndef NDEBUG |
| 5548 int sqlite3PagerIswriteable(DbPage *pPg){ | 5903 int sqlite3PagerIswriteable(DbPage *pPg){ |
| 5549 return pPg->flags&PGHDR_DIRTY; | 5904 return pPg->flags&PGHDR_DIRTY; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5615 ** "if( isDirect )" condition. | 5970 ** "if( isDirect )" condition. |
| 5616 */ | 5971 */ |
| 5617 #ifndef SQLITE_ENABLE_ATOMIC_WRITE | 5972 #ifndef SQLITE_ENABLE_ATOMIC_WRITE |
| 5618 # define DIRECT_MODE 0 | 5973 # define DIRECT_MODE 0 |
| 5619 assert( isDirectMode==0 ); | 5974 assert( isDirectMode==0 ); |
| 5620 UNUSED_PARAMETER(isDirectMode); | 5975 UNUSED_PARAMETER(isDirectMode); |
| 5621 #else | 5976 #else |
| 5622 # define DIRECT_MODE isDirectMode | 5977 # define DIRECT_MODE isDirectMode |
| 5623 #endif | 5978 #endif |
| 5624 | 5979 |
| 5625 if( !pPager->changeCountDone && pPager->dbSize>0 ){ | 5980 if( !pPager->changeCountDone && ALWAYS(pPager->dbSize>0) ){ |
| 5626 PgHdr *pPgHdr; /* Reference to page 1 */ | 5981 PgHdr *pPgHdr; /* Reference to page 1 */ |
| 5627 | 5982 |
| 5628 assert( !pPager->tempFile && isOpen(pPager->fd) ); | 5983 assert( !pPager->tempFile && isOpen(pPager->fd) ); |
| 5629 | 5984 |
| 5630 /* Open page 1 of the file for writing. */ | 5985 /* Open page 1 of the file for writing. */ |
| 5631 rc = sqlite3PagerGet(pPager, 1, &pPgHdr); | 5986 rc = sqlite3PagerGet(pPager, 1, &pPgHdr); |
| 5632 assert( pPgHdr==0 || rc==SQLITE_OK ); | 5987 assert( pPgHdr==0 || rc==SQLITE_OK ); |
| 5633 | 5988 |
| 5634 /* If page one was fetched successfully, and this function is not | 5989 /* If page one was fetched successfully, and this function is not |
| 5635 ** operating in direct-mode, make page 1 writable. When not in | 5990 ** operating in direct-mode, make page 1 writable. When not in |
| 5636 ** direct mode, page 1 is always held in cache and hence the PagerGet() | 5991 ** direct mode, page 1 is always held in cache and hence the PagerGet() |
| 5637 ** above is always successful - hence the ALWAYS on rc==SQLITE_OK. | 5992 ** above is always successful - hence the ALWAYS on rc==SQLITE_OK. |
| 5638 */ | 5993 */ |
| 5639 if( !DIRECT_MODE && ALWAYS(rc==SQLITE_OK) ){ | 5994 if( !DIRECT_MODE && ALWAYS(rc==SQLITE_OK) ){ |
| 5640 rc = sqlite3PagerWrite(pPgHdr); | 5995 rc = sqlite3PagerWrite(pPgHdr); |
| 5641 } | 5996 } |
| 5642 | 5997 |
| 5643 if( rc==SQLITE_OK ){ | 5998 if( rc==SQLITE_OK ){ |
| 5644 /* Actually do the update of the change counter */ | 5999 /* Actually do the update of the change counter */ |
| 5645 pager_write_changecounter(pPgHdr); | 6000 pager_write_changecounter(pPgHdr); |
| 5646 | 6001 |
| 5647 /* If running in direct mode, write the contents of page 1 to the file. */ | 6002 /* If running in direct mode, write the contents of page 1 to the file. */ |
| 5648 if( DIRECT_MODE ){ | 6003 if( DIRECT_MODE ){ |
| 5649 const void *zBuf; | 6004 const void *zBuf; |
| 5650 assert( pPager->dbFileSize>0 ); | 6005 assert( pPager->dbFileSize>0 ); |
| 5651 CODEC2(pPager, pPgHdr->pData, 1, 6, rc=SQLITE_NOMEM, zBuf); | 6006 CODEC2(pPager, pPgHdr->pData, 1, 6, rc=SQLITE_NOMEM, zBuf); |
| 5652 if( rc==SQLITE_OK ){ | 6007 if( rc==SQLITE_OK ){ |
| 5653 rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); | 6008 rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); |
| 6009 pPager->aStat[PAGER_STAT_WRITE]++; |
| 5654 } | 6010 } |
| 5655 if( rc==SQLITE_OK ){ | 6011 if( rc==SQLITE_OK ){ |
| 6012 /* Update the pager's copy of the change-counter. Otherwise, the |
| 6013 ** next time a read transaction is opened the cache will be |
| 6014 ** flushed (as the change-counter values will not match). */ |
| 6015 const void *pCopy = (const void *)&((const char *)zBuf)[24]; |
| 6016 memcpy(&pPager->dbFileVers, pCopy, sizeof(pPager->dbFileVers)); |
| 5656 pPager->changeCountDone = 1; | 6017 pPager->changeCountDone = 1; |
| 5657 } | 6018 } |
| 5658 }else{ | 6019 }else{ |
| 5659 pPager->changeCountDone = 1; | 6020 pPager->changeCountDone = 1; |
| 5660 } | 6021 } |
| 5661 } | 6022 } |
| 5662 | 6023 |
| 5663 /* Release the page reference. */ | 6024 /* Release the page reference. */ |
| 5664 sqlite3PagerUnref(pPgHdr); | 6025 sqlite3PagerUnref(pPgHdr); |
| 5665 } | 6026 } |
| 5666 return rc; | 6027 return rc; |
| 5667 } | 6028 } |
| 5668 | 6029 |
| 5669 /* | 6030 /* |
| 5670 ** Sync the database file to disk. This is a no-op for in-memory databases | 6031 ** Sync the database file to disk. This is a no-op for in-memory databases |
| 5671 ** or pages with the Pager.noSync flag set. | 6032 ** or pages with the Pager.noSync flag set. |
| 5672 ** | 6033 ** |
| 5673 ** If successful, or if called on a pager for which it is a no-op, this | 6034 ** If successful, or if called on a pager for which it is a no-op, this |
| 5674 ** function returns SQLITE_OK. Otherwise, an IO error code is returned. | 6035 ** function returns SQLITE_OK. Otherwise, an IO error code is returned. |
| 5675 */ | 6036 */ |
| 5676 int sqlite3PagerSync(Pager *pPager){ | 6037 int sqlite3PagerSync(Pager *pPager, const char *zMaster){ |
| 5677 int rc = SQLITE_OK; | 6038 int rc = SQLITE_OK; |
| 5678 if( !pPager->noSync ){ | 6039 |
| 6040 if( isOpen(pPager->fd) ){ |
| 6041 void *pArg = (void*)zMaster; |
| 6042 rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg); |
| 6043 if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; |
| 6044 } |
| 6045 if( rc==SQLITE_OK && !pPager->noSync ){ |
| 5679 assert( !MEMDB ); | 6046 assert( !MEMDB ); |
| 5680 rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); | 6047 rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); |
| 5681 }else if( isOpen(pPager->fd) ){ | |
| 5682 assert( !MEMDB ); | |
| 5683 sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, (void *)&rc); | |
| 5684 } | 6048 } |
| 5685 return rc; | 6049 return rc; |
| 5686 } | 6050 } |
| 5687 | 6051 |
| 5688 /* | 6052 /* |
| 5689 ** This function may only be called while a write-transaction is active in | 6053 ** This function may only be called while a write-transaction is active in |
| 5690 ** rollback. If the connection is in WAL mode, this call is a no-op. | 6054 ** rollback. If the connection is in WAL mode, this call is a no-op. |
| 5691 ** Otherwise, if the connection does not already have an EXCLUSIVE lock on | 6055 ** Otherwise, if the connection does not already have an EXCLUSIVE lock on |
| 5692 ** the database file, an attempt is made to obtain one. | 6056 ** the database file, an attempt is made to obtain one. |
| 5693 ** | 6057 ** |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5768 if( pagerUseWal(pPager) ){ | 6132 if( pagerUseWal(pPager) ){ |
| 5769 PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); | 6133 PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); |
| 5770 PgHdr *pPageOne = 0; | 6134 PgHdr *pPageOne = 0; |
| 5771 if( pList==0 ){ | 6135 if( pList==0 ){ |
| 5772 /* Must have at least one page for the WAL commit flag. | 6136 /* Must have at least one page for the WAL commit flag. |
| 5773 ** Ticket [2d1a5c67dfc2363e44f29d9bbd57f] 2011-05-18 */ | 6137 ** Ticket [2d1a5c67dfc2363e44f29d9bbd57f] 2011-05-18 */ |
| 5774 rc = sqlite3PagerGet(pPager, 1, &pPageOne); | 6138 rc = sqlite3PagerGet(pPager, 1, &pPageOne); |
| 5775 pList = pPageOne; | 6139 pList = pPageOne; |
| 5776 pList->pDirty = 0; | 6140 pList->pDirty = 0; |
| 5777 } | 6141 } |
| 5778 assert( pList!=0 || rc!=SQLITE_OK ); | 6142 assert( rc==SQLITE_OK ); |
| 5779 if( pList ){ | 6143 if( ALWAYS(pList) ){ |
| 5780 rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1, | 6144 rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1); |
| 5781 (pPager->fullSync ? pPager->syncFlags : 0) | |
| 5782 ); | |
| 5783 } | 6145 } |
| 5784 sqlite3PagerUnref(pPageOne); | 6146 sqlite3PagerUnref(pPageOne); |
| 5785 if( rc==SQLITE_OK ){ | 6147 if( rc==SQLITE_OK ){ |
| 5786 sqlite3PcacheCleanAll(pPager->pPCache); | 6148 sqlite3PcacheCleanAll(pPager->pPCache); |
| 5787 } | 6149 } |
| 5788 }else{ | 6150 }else{ |
| 5789 /* The following block updates the change-counter. Exactly how it | 6151 /* The following block updates the change-counter. Exactly how it |
| 5790 ** does this depends on whether or not the atomic-update optimization | 6152 ** does this depends on whether or not the atomic-update optimization |
| 5791 ** was enabled at compile time, and if this transaction meets the | 6153 ** was enabled at compile time, and if this transaction meets the |
| 5792 ** runtime criteria to use the operation: | 6154 ** runtime criteria to use the operation: |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5831 rc = sqlite3JournalCreate(pPager->jfd); | 6193 rc = sqlite3JournalCreate(pPager->jfd); |
| 5832 if( rc==SQLITE_OK ){ | 6194 if( rc==SQLITE_OK ){ |
| 5833 rc = pager_incr_changecounter(pPager, 0); | 6195 rc = pager_incr_changecounter(pPager, 0); |
| 5834 } | 6196 } |
| 5835 } | 6197 } |
| 5836 #else | 6198 #else |
| 5837 rc = pager_incr_changecounter(pPager, 0); | 6199 rc = pager_incr_changecounter(pPager, 0); |
| 5838 #endif | 6200 #endif |
| 5839 if( rc!=SQLITE_OK ) goto commit_phase_one_exit; | 6201 if( rc!=SQLITE_OK ) goto commit_phase_one_exit; |
| 5840 | 6202 |
| 5841 /* If this transaction has made the database smaller, then all pages | |
| 5842 ** being discarded by the truncation must be written to the journal | |
| 5843 ** file. This can only happen in auto-vacuum mode. | |
| 5844 ** | |
| 5845 ** Before reading the pages with page numbers larger than the | |
| 5846 ** current value of Pager.dbSize, set dbSize back to the value | |
| 5847 ** that it took at the start of the transaction. Otherwise, the | |
| 5848 ** calls to sqlite3PagerGet() return zeroed pages instead of | |
| 5849 ** reading data from the database file. | |
| 5850 */ | |
| 5851 #ifndef SQLITE_OMIT_AUTOVACUUM | |
| 5852 if( pPager->dbSize<pPager->dbOrigSize | |
| 5853 && pPager->journalMode!=PAGER_JOURNALMODE_OFF | |
| 5854 ){ | |
| 5855 Pgno i; /* Iterator variable */ | |
| 5856 const Pgno iSkip = PAGER_MJ_PGNO(pPager); /* Pending lock page */ | |
| 5857 const Pgno dbSize = pPager->dbSize; /* Database image size */ | |
| 5858 pPager->dbSize = pPager->dbOrigSize; | |
| 5859 for( i=dbSize+1; i<=pPager->dbOrigSize; i++ ){ | |
| 5860 if( !sqlite3BitvecTest(pPager->pInJournal, i) && i!=iSkip ){ | |
| 5861 PgHdr *pPage; /* Page to journal */ | |
| 5862 rc = sqlite3PagerGet(pPager, i, &pPage); | |
| 5863 if( rc!=SQLITE_OK ) goto commit_phase_one_exit; | |
| 5864 rc = sqlite3PagerWrite(pPage); | |
| 5865 sqlite3PagerUnref(pPage); | |
| 5866 if( rc!=SQLITE_OK ) goto commit_phase_one_exit; | |
| 5867 } | |
| 5868 } | |
| 5869 pPager->dbSize = dbSize; | |
| 5870 } | |
| 5871 #endif | |
| 5872 | |
| 5873 /* Write the master journal name into the journal file. If a master | 6203 /* Write the master journal name into the journal file. If a master |
| 5874 ** journal file name has already been written to the journal file, | 6204 ** journal file name has already been written to the journal file, |
| 5875 ** or if zMaster is NULL (no master journal), then this call is a no-op. | 6205 ** or if zMaster is NULL (no master journal), then this call is a no-op. |
| 5876 */ | 6206 */ |
| 5877 rc = writeMasterJournal(pPager, zMaster); | 6207 rc = writeMasterJournal(pPager, zMaster); |
| 5878 if( rc!=SQLITE_OK ) goto commit_phase_one_exit; | 6208 if( rc!=SQLITE_OK ) goto commit_phase_one_exit; |
| 5879 | 6209 |
| 5880 /* Sync the journal file and write all dirty pages to the database. | 6210 /* Sync the journal file and write all dirty pages to the database. |
| 5881 ** If the atomic-update optimization is being used, this sync will not | 6211 ** If the atomic-update optimization is being used, this sync will not |
| 5882 ** create the journal file or perform any real IO. | 6212 ** create the journal file or perform any real IO. |
| 5883 ** | 6213 ** |
| 5884 ** Because the change-counter page was just modified, unless the | 6214 ** Because the change-counter page was just modified, unless the |
| 5885 ** atomic-update optimization is used it is almost certain that the | 6215 ** atomic-update optimization is used it is almost certain that the |
| 5886 ** journal requires a sync here. However, in locking_mode=exclusive | 6216 ** journal requires a sync here. However, in locking_mode=exclusive |
| 5887 ** on a system under memory pressure it is just possible that this is | 6217 ** on a system under memory pressure it is just possible that this is |
| 5888 ** not the case. In this case it is likely enough that the redundant | 6218 ** not the case. In this case it is likely enough that the redundant |
| 5889 ** xSync() call will be changed to a no-op by the OS anyhow. | 6219 ** xSync() call will be changed to a no-op by the OS anyhow. |
| 5890 */ | 6220 */ |
| 5891 rc = syncJournal(pPager, 0); | 6221 rc = syncJournal(pPager, 0); |
| 5892 if( rc!=SQLITE_OK ) goto commit_phase_one_exit; | 6222 if( rc!=SQLITE_OK ) goto commit_phase_one_exit; |
| 5893 | 6223 |
| 5894 rc = pager_write_pagelist(pPager,sqlite3PcacheDirtyList(pPager->pPCache)); | 6224 rc = pager_write_pagelist(pPager,sqlite3PcacheDirtyList(pPager->pPCache)); |
| 5895 if( rc!=SQLITE_OK ){ | 6225 if( rc!=SQLITE_OK ){ |
| 5896 assert( rc!=SQLITE_IOERR_BLOCKED ); | 6226 assert( rc!=SQLITE_IOERR_BLOCKED ); |
| 5897 goto commit_phase_one_exit; | 6227 goto commit_phase_one_exit; |
| 5898 } | 6228 } |
| 5899 sqlite3PcacheCleanAll(pPager->pPCache); | 6229 sqlite3PcacheCleanAll(pPager->pPCache); |
| 5900 | 6230 |
| 5901 /* If the file on disk is not the same size as the database image, | 6231 /* If the file on disk is smaller than the database image, use |
| 5902 ** then use pager_truncate to grow or shrink the file here. | 6232 ** pager_truncate to grow the file here. This can happen if the database |
| 5903 */ | 6233 ** image was extended as part of the current transaction and then the |
| 5904 if( pPager->dbSize!=pPager->dbFileSize ){ | 6234 ** last page in the db image moved to the free-list. In this case the |
| 6235 ** last page is never written out to disk, leaving the database file |
| 6236 ** undersized. Fix this now if it is the case. */ |
| 6237 if( pPager->dbSize>pPager->dbFileSize ){ |
| 5905 Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager)); | 6238 Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager)); |
| 5906 assert( pPager->eState==PAGER_WRITER_DBMOD ); | 6239 assert( pPager->eState==PAGER_WRITER_DBMOD ); |
| 5907 rc = pager_truncate(pPager, nNew); | 6240 rc = pager_truncate(pPager, nNew); |
| 5908 if( rc!=SQLITE_OK ) goto commit_phase_one_exit; | 6241 if( rc!=SQLITE_OK ) goto commit_phase_one_exit; |
| 5909 } | 6242 } |
| 5910 | 6243 |
| 5911 /* Finally, sync the database file. */ | 6244 /* Finally, sync the database file. */ |
| 5912 if( !noSync ){ | 6245 if( !noSync ){ |
| 5913 rc = sqlite3PagerSync(pPager); | 6246 rc = sqlite3PagerSync(pPager, zMaster); |
| 5914 } | 6247 } |
| 5915 IOTRACE(("DBSYNC %p\n", pPager)) | 6248 IOTRACE(("DBSYNC %p\n", pPager)) |
| 5916 } | 6249 } |
| 5917 } | 6250 } |
| 5918 | 6251 |
| 5919 commit_phase_one_exit: | 6252 commit_phase_one_exit: |
| 5920 if( rc==SQLITE_OK && !pagerUseWal(pPager) ){ | 6253 if( rc==SQLITE_OK && !pagerUseWal(pPager) ){ |
| 5921 pPager->eState = PAGER_WRITER_FINISHED; | 6254 pPager->eState = PAGER_WRITER_FINISHED; |
| 5922 } | 6255 } |
| 5923 return rc; | 6256 return rc; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5967 if( pPager->eState==PAGER_WRITER_LOCKED | 6300 if( pPager->eState==PAGER_WRITER_LOCKED |
| 5968 && pPager->exclusiveMode | 6301 && pPager->exclusiveMode |
| 5969 && pPager->journalMode==PAGER_JOURNALMODE_PERSIST | 6302 && pPager->journalMode==PAGER_JOURNALMODE_PERSIST |
| 5970 ){ | 6303 ){ |
| 5971 assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) || !pPager->journalOff ); | 6304 assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) || !pPager->journalOff ); |
| 5972 pPager->eState = PAGER_READER; | 6305 pPager->eState = PAGER_READER; |
| 5973 return SQLITE_OK; | 6306 return SQLITE_OK; |
| 5974 } | 6307 } |
| 5975 | 6308 |
| 5976 PAGERTRACE(("COMMIT %d\n", PAGERID(pPager))); | 6309 PAGERTRACE(("COMMIT %d\n", PAGERID(pPager))); |
| 5977 rc = pager_end_transaction(pPager, pPager->setMaster); | 6310 rc = pager_end_transaction(pPager, pPager->setMaster, 1); |
| 5978 return pager_error(pPager, rc); | 6311 return pager_error(pPager, rc); |
| 5979 } | 6312 } |
| 5980 | 6313 |
| 5981 /* | 6314 /* |
| 5982 ** If a write transaction is open, then all changes made within the | 6315 ** If a write transaction is open, then all changes made within the |
| 5983 ** transaction are reverted and the current write-transaction is closed. | 6316 ** transaction are reverted and the current write-transaction is closed. |
| 5984 ** The pager falls back to PAGER_READER state if successful, or PAGER_ERROR | 6317 ** The pager falls back to PAGER_READER state if successful, or PAGER_ERROR |
| 5985 ** state if an error occurs. | 6318 ** state if an error occurs. |
| 5986 ** | 6319 ** |
| 5987 ** If the pager is already in PAGER_ERROR state when this function is called, | 6320 ** If the pager is already in PAGER_ERROR state when this function is called, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 6012 ** the pager is already in the ERROR state, the rollback is not | 6345 ** the pager is already in the ERROR state, the rollback is not |
| 6013 ** attempted here. Instead, the error code is returned to the caller. | 6346 ** attempted here. Instead, the error code is returned to the caller. |
| 6014 */ | 6347 */ |
| 6015 assert( assert_pager_state(pPager) ); | 6348 assert( assert_pager_state(pPager) ); |
| 6016 if( pPager->eState==PAGER_ERROR ) return pPager->errCode; | 6349 if( pPager->eState==PAGER_ERROR ) return pPager->errCode; |
| 6017 if( pPager->eState<=PAGER_READER ) return SQLITE_OK; | 6350 if( pPager->eState<=PAGER_READER ) return SQLITE_OK; |
| 6018 | 6351 |
| 6019 if( pagerUseWal(pPager) ){ | 6352 if( pagerUseWal(pPager) ){ |
| 6020 int rc2; | 6353 int rc2; |
| 6021 rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, -1); | 6354 rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, -1); |
| 6022 rc2 = pager_end_transaction(pPager, pPager->setMaster); | 6355 rc2 = pager_end_transaction(pPager, pPager->setMaster, 0); |
| 6023 if( rc==SQLITE_OK ) rc = rc2; | 6356 if( rc==SQLITE_OK ) rc = rc2; |
| 6024 }else if( !isOpen(pPager->jfd) || pPager->eState==PAGER_WRITER_LOCKED ){ | 6357 }else if( !isOpen(pPager->jfd) || pPager->eState==PAGER_WRITER_LOCKED ){ |
| 6025 int eState = pPager->eState; | 6358 int eState = pPager->eState; |
| 6026 rc = pager_end_transaction(pPager, 0); | 6359 rc = pager_end_transaction(pPager, 0, 0); |
| 6027 if( !MEMDB && eState>PAGER_WRITER_LOCKED ){ | 6360 if( !MEMDB && eState>PAGER_WRITER_LOCKED ){ |
| 6028 /* This can happen using journal_mode=off. Move the pager to the error | 6361 /* This can happen using journal_mode=off. Move the pager to the error |
| 6029 ** state to indicate that the contents of the cache may not be trusted. | 6362 ** state to indicate that the contents of the cache may not be trusted. |
| 6030 ** Any active readers will get SQLITE_ABORT. | 6363 ** Any active readers will get SQLITE_ABORT. |
| 6031 */ | 6364 */ |
| 6032 pPager->errCode = SQLITE_ABORT; | 6365 pPager->errCode = SQLITE_ABORT; |
| 6033 pPager->eState = PAGER_ERROR; | 6366 pPager->eState = PAGER_ERROR; |
| 6034 return rc; | 6367 return rc; |
| 6035 } | 6368 } |
| 6036 }else{ | 6369 }else{ |
| 6037 rc = pager_playback(pPager, 0); | 6370 rc = pager_playback(pPager, 0); |
| 6038 } | 6371 } |
| 6039 | 6372 |
| 6040 assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK ); | 6373 assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK ); |
| 6041 assert( rc==SQLITE_OK || rc==SQLITE_FULL || (rc&0xFF)==SQLITE_IOERR ); | 6374 assert( rc==SQLITE_OK || rc==SQLITE_FULL || rc==SQLITE_CORRUPT |
| 6375 || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR |
| 6376 || rc==SQLITE_CANTOPEN |
| 6377 ); |
| 6042 | 6378 |
| 6043 /* If an error occurs during a ROLLBACK, we can no longer trust the pager | 6379 /* If an error occurs during a ROLLBACK, we can no longer trust the pager |
| 6044 ** cache. So call pager_error() on the way out to make any error persistent. | 6380 ** cache. So call pager_error() on the way out to make any error persistent. |
| 6045 */ | 6381 */ |
| 6046 return pager_error(pPager, rc); | 6382 return pager_error(pPager, rc); |
| 6047 } | 6383 } |
| 6048 | 6384 |
| 6049 /* | 6385 /* |
| 6050 ** Return TRUE if the database file is opened read-only. Return FALSE | 6386 ** Return TRUE if the database file is opened read-only. Return FALSE |
| 6051 ** if the database is (in theory) writable. | 6387 ** if the database is (in theory) writable. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6085 ** This routine is used for testing and analysis only. | 6421 ** This routine is used for testing and analysis only. |
| 6086 */ | 6422 */ |
| 6087 int *sqlite3PagerStats(Pager *pPager){ | 6423 int *sqlite3PagerStats(Pager *pPager){ |
| 6088 static int a[11]; | 6424 static int a[11]; |
| 6089 a[0] = sqlite3PcacheRefCount(pPager->pPCache); | 6425 a[0] = sqlite3PcacheRefCount(pPager->pPCache); |
| 6090 a[1] = sqlite3PcachePagecount(pPager->pPCache); | 6426 a[1] = sqlite3PcachePagecount(pPager->pPCache); |
| 6091 a[2] = sqlite3PcacheGetCachesize(pPager->pPCache); | 6427 a[2] = sqlite3PcacheGetCachesize(pPager->pPCache); |
| 6092 a[3] = pPager->eState==PAGER_OPEN ? -1 : (int) pPager->dbSize; | 6428 a[3] = pPager->eState==PAGER_OPEN ? -1 : (int) pPager->dbSize; |
| 6093 a[4] = pPager->eState; | 6429 a[4] = pPager->eState; |
| 6094 a[5] = pPager->errCode; | 6430 a[5] = pPager->errCode; |
| 6095 a[6] = pPager->nHit; | 6431 a[6] = pPager->aStat[PAGER_STAT_HIT]; |
| 6096 a[7] = pPager->nMiss; | 6432 a[7] = pPager->aStat[PAGER_STAT_MISS]; |
| 6097 a[8] = 0; /* Used to be pPager->nOvfl */ | 6433 a[8] = 0; /* Used to be pPager->nOvfl */ |
| 6098 a[9] = pPager->nRead; | 6434 a[9] = pPager->nRead; |
| 6099 a[10] = pPager->nWrite; | 6435 a[10] = pPager->aStat[PAGER_STAT_WRITE]; |
| 6100 return a; | 6436 return a; |
| 6101 } | 6437 } |
| 6102 #endif | 6438 #endif |
| 6103 | 6439 |
| 6104 /* | 6440 /* |
| 6441 ** Parameter eStat must be either SQLITE_DBSTATUS_CACHE_HIT or |
| 6442 ** SQLITE_DBSTATUS_CACHE_MISS. Before returning, *pnVal is incremented by the |
| 6443 ** current cache hit or miss count, according to the value of eStat. If the |
| 6444 ** reset parameter is non-zero, the cache hit or miss count is zeroed before |
| 6445 ** returning. |
| 6446 */ |
| 6447 void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){ |
| 6448 |
| 6449 assert( eStat==SQLITE_DBSTATUS_CACHE_HIT |
| 6450 || eStat==SQLITE_DBSTATUS_CACHE_MISS |
| 6451 || eStat==SQLITE_DBSTATUS_CACHE_WRITE |
| 6452 ); |
| 6453 |
| 6454 assert( SQLITE_DBSTATUS_CACHE_HIT+1==SQLITE_DBSTATUS_CACHE_MISS ); |
| 6455 assert( SQLITE_DBSTATUS_CACHE_HIT+2==SQLITE_DBSTATUS_CACHE_WRITE ); |
| 6456 assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1 && PAGER_STAT_WRITE==2 ); |
| 6457 |
| 6458 *pnVal += pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT]; |
| 6459 if( reset ){ |
| 6460 pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT] = 0; |
| 6461 } |
| 6462 } |
| 6463 |
| 6464 /* |
| 6105 ** Return true if this is an in-memory pager. | 6465 ** Return true if this is an in-memory pager. |
| 6106 */ | 6466 */ |
| 6107 int sqlite3PagerIsMemdb(Pager *pPager){ | 6467 int sqlite3PagerIsMemdb(Pager *pPager){ |
| 6108 return MEMDB; | 6468 return MEMDB; |
| 6109 } | 6469 } |
| 6110 | 6470 |
| 6111 /* | 6471 /* |
| 6112 ** Check that there are at least nSavepoint savepoints open. If there are | 6472 ** Check that there are at least nSavepoint savepoints open. If there are |
| 6113 ** currently less than nSavepoints open, then open one or more savepoints | 6473 ** currently less than nSavepoints open, then open one or more savepoints |
| 6114 ** to make up the difference. If the number of savepoints is already | 6474 ** to make up the difference. If the number of savepoints is already |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6239 rc = pagerPlaybackSavepoint(pPager, pSavepoint); | 6599 rc = pagerPlaybackSavepoint(pPager, pSavepoint); |
| 6240 assert(rc!=SQLITE_DONE); | 6600 assert(rc!=SQLITE_DONE); |
| 6241 } | 6601 } |
| 6242 } | 6602 } |
| 6243 | 6603 |
| 6244 return rc; | 6604 return rc; |
| 6245 } | 6605 } |
| 6246 | 6606 |
| 6247 /* | 6607 /* |
| 6248 ** Return the full pathname of the database file. | 6608 ** Return the full pathname of the database file. |
| 6609 ** |
| 6610 ** Except, if the pager is in-memory only, then return an empty string if |
| 6611 ** nullIfMemDb is true. This routine is called with nullIfMemDb==1 when |
| 6612 ** used to report the filename to the user, for compatibility with legacy |
| 6613 ** behavior. But when the Btree needs to know the filename for matching to |
| 6614 ** shared cache, it uses nullIfMemDb==0 so that in-memory databases can |
| 6615 ** participate in shared-cache. |
| 6249 */ | 6616 */ |
| 6250 const char *sqlite3PagerFilename(Pager *pPager){ | 6617 const char *sqlite3PagerFilename(Pager *pPager, int nullIfMemDb){ |
| 6251 return pPager->zFilename; | 6618 return (nullIfMemDb && pPager->memDb) ? "" : pPager->zFilename; |
| 6252 } | 6619 } |
| 6253 | 6620 |
| 6254 /* | 6621 /* |
| 6255 ** Return the VFS structure for the pager. | 6622 ** Return the VFS structure for the pager. |
| 6256 */ | 6623 */ |
| 6257 const sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ | 6624 const sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ |
| 6258 return pPager->pVfs; | 6625 return pPager->pVfs; |
| 6259 } | 6626 } |
| 6260 | 6627 |
| 6261 /* | 6628 /* |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6296 if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec); | 6663 if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec); |
| 6297 pPager->xCodec = pPager->memDb ? 0 : xCodec; | 6664 pPager->xCodec = pPager->memDb ? 0 : xCodec; |
| 6298 pPager->xCodecSizeChng = xCodecSizeChng; | 6665 pPager->xCodecSizeChng = xCodecSizeChng; |
| 6299 pPager->xCodecFree = xCodecFree; | 6666 pPager->xCodecFree = xCodecFree; |
| 6300 pPager->pCodec = pCodec; | 6667 pPager->pCodec = pCodec; |
| 6301 pagerReportSize(pPager); | 6668 pagerReportSize(pPager); |
| 6302 } | 6669 } |
| 6303 void *sqlite3PagerGetCodec(Pager *pPager){ | 6670 void *sqlite3PagerGetCodec(Pager *pPager){ |
| 6304 return pPager->pCodec; | 6671 return pPager->pCodec; |
| 6305 } | 6672 } |
| 6306 #endif | 6673 |
| 6674 /* |
| 6675 ** This function is called by the wal module when writing page content |
| 6676 ** into the log file. |
| 6677 ** |
| 6678 ** This function returns a pointer to a buffer containing the encrypted |
| 6679 ** page content. If a malloc fails, this function may return NULL. |
| 6680 */ |
| 6681 void *sqlite3PagerCodec(PgHdr *pPg){ |
| 6682 void *aData = 0; |
| 6683 CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData); |
| 6684 return aData; |
| 6685 } |
| 6686 |
| 6687 /* |
| 6688 ** Return the current pager state |
| 6689 */ |
| 6690 int sqlite3PagerState(Pager *pPager){ |
| 6691 return pPager->eState; |
| 6692 } |
| 6693 #endif /* SQLITE_HAS_CODEC */ |
| 6307 | 6694 |
| 6308 #ifndef SQLITE_OMIT_AUTOVACUUM | 6695 #ifndef SQLITE_OMIT_AUTOVACUUM |
| 6309 /* | 6696 /* |
| 6310 ** Move the page pPg to location pgno in the file. | 6697 ** Move the page pPg to location pgno in the file. |
| 6311 ** | 6698 ** |
| 6312 ** There must be no references to the page previously located at | 6699 ** There must be no references to the page previously located at |
| 6313 ** pgno (which we call pPgOld) though that page is allowed to be | 6700 ** pgno (which we call pPgOld) though that page is allowed to be |
| 6314 ** in cache. If the page previously located at pgno is not already | 6701 ** in cache. If the page previously located at pgno is not already |
| 6315 ** in the rollback journal, it is not put there by by this routine. | 6702 ** in the rollback journal, it is not put there by by this routine. |
| 6316 ** | 6703 ** |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6382 | 6769 |
| 6383 /* If the journal needs to be sync()ed before page pPg->pgno can | 6770 /* If the journal needs to be sync()ed before page pPg->pgno can |
| 6384 ** be written to, store pPg->pgno in local variable needSyncPgno. | 6771 ** be written to, store pPg->pgno in local variable needSyncPgno. |
| 6385 ** | 6772 ** |
| 6386 ** If the isCommit flag is set, there is no need to remember that | 6773 ** If the isCommit flag is set, there is no need to remember that |
| 6387 ** the journal needs to be sync()ed before database page pPg->pgno | 6774 ** the journal needs to be sync()ed before database page pPg->pgno |
| 6388 ** can be written to. The caller has already promised not to write to it. | 6775 ** can be written to. The caller has already promised not to write to it. |
| 6389 */ | 6776 */ |
| 6390 if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){ | 6777 if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){ |
| 6391 needSyncPgno = pPg->pgno; | 6778 needSyncPgno = pPg->pgno; |
| 6392 assert( pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize ); | 6779 assert( pPager->journalMode==PAGER_JOURNALMODE_OFF || |
| 6780 pageInJournal(pPager, pPg) || pPg->pgno>pPager->dbOrigSize ); |
| 6393 assert( pPg->flags&PGHDR_DIRTY ); | 6781 assert( pPg->flags&PGHDR_DIRTY ); |
| 6394 } | 6782 } |
| 6395 | 6783 |
| 6396 /* If the cache contains a page with page-number pgno, remove it | 6784 /* If the cache contains a page with page-number pgno, remove it |
| 6397 ** from its hash chain. Also, if the PGHDR_NEED_SYNC flag was set for | 6785 ** from its hash chain. Also, if the PGHDR_NEED_SYNC flag was set for |
| 6398 ** page pgno before the 'move' operation, it needs to be retained | 6786 ** page pgno before the 'move' operation, it needs to be retained |
| 6399 ** for the page moved there. | 6787 ** for the page moved there. |
| 6400 */ | 6788 */ |
| 6401 pPg->flags &= ~PGHDR_NEED_SYNC; | 6789 pPg->flags &= ~PGHDR_NEED_SYNC; |
| 6402 pPgOld = pager_lookup(pPager, pgno); | 6790 pPgOld = sqlite3PagerLookup(pPager, pgno); |
| 6403 assert( !pPgOld || pPgOld->nRef==1 ); | 6791 assert( !pPgOld || pPgOld->nRef==1 ); |
| 6404 if( pPgOld ){ | 6792 if( pPgOld ){ |
| 6405 pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); | 6793 pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); |
| 6406 if( MEMDB ){ | 6794 if( MEMDB ){ |
| 6407 /* Do not discard pages from an in-memory database since we might | 6795 /* Do not discard pages from an in-memory database since we might |
| 6408 ** need to rollback later. Just move the page out of the way. */ | 6796 ** need to rollback later. Just move the page out of the way. */ |
| 6409 sqlite3PcacheMove(pPgOld, pPager->dbSize+1); | 6797 sqlite3PcacheMove(pPgOld, pPager->dbSize+1); |
| 6410 }else{ | 6798 }else{ |
| 6411 sqlite3PcacheDrop(pPgOld); | 6799 sqlite3PcacheDrop(pPgOld); |
| 6412 } | 6800 } |
| 6413 } | 6801 } |
| 6414 | 6802 |
| 6415 origPgno = pPg->pgno; | 6803 origPgno = pPg->pgno; |
| 6416 sqlite3PcacheMove(pPg, pgno); | 6804 sqlite3PcacheMove(pPg, pgno); |
| 6417 sqlite3PcacheMakeDirty(pPg); | 6805 sqlite3PcacheMakeDirty(pPg); |
| 6418 | 6806 |
| 6419 /* For an in-memory database, make sure the original page continues | 6807 /* For an in-memory database, make sure the original page continues |
| 6420 ** to exist, in case the transaction needs to roll back. Use pPgOld | 6808 ** to exist, in case the transaction needs to roll back. Use pPgOld |
| 6421 ** as the original page since it has already been allocated. | 6809 ** as the original page since it has already been allocated. |
| 6422 */ | 6810 */ |
| 6423 if( MEMDB ){ | 6811 if( MEMDB ){ |
| 6424 assert( pPgOld ); | 6812 assert( pPgOld ); |
| 6425 sqlite3PcacheMove(pPgOld, origPgno); | 6813 sqlite3PcacheMove(pPgOld, origPgno); |
| 6426 sqlite3PagerUnref(pPgOld); | 6814 sqlite3PagerUnrefNotNull(pPgOld); |
| 6427 } | 6815 } |
| 6428 | 6816 |
| 6429 if( needSyncPgno ){ | 6817 if( needSyncPgno ){ |
| 6430 /* If needSyncPgno is non-zero, then the journal file needs to be | 6818 /* If needSyncPgno is non-zero, then the journal file needs to be |
| 6431 ** sync()ed before any data is written to database file page needSyncPgno. | 6819 ** sync()ed before any data is written to database file page needSyncPgno. |
| 6432 ** Currently, no such page exists in the page-cache and the | 6820 ** Currently, no such page exists in the page-cache and the |
| 6433 ** "is journaled" bitvec flag has been set. This needs to be remedied by | 6821 ** "is journaled" bitvec flag has been set. This needs to be remedied by |
| 6434 ** loading the page into the pager-cache and setting the PGHDR_NEED_SYNC | 6822 ** loading the page into the pager-cache and setting the PGHDR_NEED_SYNC |
| 6435 ** flag. | 6823 ** flag. |
| 6436 ** | 6824 ** |
| 6437 ** If the attempt to load the page into the page-cache fails, (due | 6825 ** If the attempt to load the page into the page-cache fails, (due |
| 6438 ** to a malloc() or IO failure), clear the bit in the pInJournal[] | 6826 ** to a malloc() or IO failure), clear the bit in the pInJournal[] |
| 6439 ** array. Otherwise, if the page is loaded and written again in | 6827 ** array. Otherwise, if the page is loaded and written again in |
| 6440 ** this transaction, it may be written to the database file before | 6828 ** this transaction, it may be written to the database file before |
| 6441 ** it is synced into the journal file. This way, it may end up in | 6829 ** it is synced into the journal file. This way, it may end up in |
| 6442 ** the journal file twice, but that is not a problem. | 6830 ** the journal file twice, but that is not a problem. |
| 6443 */ | 6831 */ |
| 6444 PgHdr *pPgHdr; | 6832 PgHdr *pPgHdr; |
| 6445 rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr); | 6833 rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr); |
| 6446 if( rc!=SQLITE_OK ){ | 6834 if( rc!=SQLITE_OK ){ |
| 6447 if( needSyncPgno<=pPager->dbOrigSize ){ | 6835 if( needSyncPgno<=pPager->dbOrigSize ){ |
| 6448 assert( pPager->pTmpSpace!=0 ); | 6836 assert( pPager->pTmpSpace!=0 ); |
| 6449 sqlite3BitvecClear(pPager->pInJournal, needSyncPgno, pPager->pTmpSpace); | 6837 sqlite3BitvecClear(pPager->pInJournal, needSyncPgno, pPager->pTmpSpace); |
| 6450 } | 6838 } |
| 6451 return rc; | 6839 return rc; |
| 6452 } | 6840 } |
| 6453 pPgHdr->flags |= PGHDR_NEED_SYNC; | 6841 pPgHdr->flags |= PGHDR_NEED_SYNC; |
| 6454 sqlite3PcacheMakeDirty(pPgHdr); | 6842 sqlite3PcacheMakeDirty(pPgHdr); |
| 6455 sqlite3PagerUnref(pPgHdr); | 6843 sqlite3PagerUnrefNotNull(pPgHdr); |
| 6456 } | 6844 } |
| 6457 | 6845 |
| 6458 return SQLITE_OK; | 6846 return SQLITE_OK; |
| 6459 } | 6847 } |
| 6460 #endif | 6848 #endif |
| 6461 | 6849 |
| 6462 /* | 6850 /* |
| 6463 ** Return a pointer to the data for the specified page. | 6851 ** Return a pointer to the data for the specified page. |
| 6464 */ | 6852 */ |
| 6465 void *sqlite3PagerGetData(DbPage *pPg){ | 6853 void *sqlite3PagerGetData(DbPage *pPg){ |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6632 | 7020 |
| 6633 /* | 7021 /* |
| 6634 ** Get/set the size-limit used for persistent journal files. | 7022 ** Get/set the size-limit used for persistent journal files. |
| 6635 ** | 7023 ** |
| 6636 ** Setting the size limit to -1 means no limit is enforced. | 7024 ** Setting the size limit to -1 means no limit is enforced. |
| 6637 ** An attempt to set a limit smaller than -1 is a no-op. | 7025 ** An attempt to set a limit smaller than -1 is a no-op. |
| 6638 */ | 7026 */ |
| 6639 i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){ | 7027 i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){ |
| 6640 if( iLimit>=-1 ){ | 7028 if( iLimit>=-1 ){ |
| 6641 pPager->journalSizeLimit = iLimit; | 7029 pPager->journalSizeLimit = iLimit; |
| 7030 sqlite3WalLimit(pPager->pWal, iLimit); |
| 6642 } | 7031 } |
| 6643 return pPager->journalSizeLimit; | 7032 return pPager->journalSizeLimit; |
| 6644 } | 7033 } |
| 6645 | 7034 |
| 6646 /* | 7035 /* |
| 6647 ** Return a pointer to the pPager->pBackup variable. The backup module | 7036 ** Return a pointer to the pPager->pBackup variable. The backup module |
| 6648 ** in backup.c maintains the content of this variable. This module | 7037 ** in backup.c maintains the content of this variable. This module |
| 6649 ** uses it opaquely as an argument to sqlite3BackupRestart() and | 7038 ** uses it opaquely as an argument to sqlite3BackupRestart() and |
| 6650 ** sqlite3BackupUpdate() only. | 7039 ** sqlite3BackupUpdate() only. |
| 6651 */ | 7040 */ |
| 6652 sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ | 7041 sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ |
| 6653 return &pPager->pBackup; | 7042 return &pPager->pBackup; |
| 6654 } | 7043 } |
| 6655 | 7044 |
| 7045 #ifndef SQLITE_OMIT_VACUUM |
| 7046 /* |
| 7047 ** Unless this is an in-memory or temporary database, clear the pager cache. |
| 7048 */ |
| 7049 void sqlite3PagerClearCache(Pager *pPager){ |
| 7050 if( !MEMDB && pPager->tempFile==0 ) pager_reset(pPager); |
| 7051 } |
| 7052 #endif |
| 7053 |
| 6656 #ifndef SQLITE_OMIT_WAL | 7054 #ifndef SQLITE_OMIT_WAL |
| 6657 /* | 7055 /* |
| 6658 ** This function is called when the user invokes "PRAGMA wal_checkpoint", | 7056 ** This function is called when the user invokes "PRAGMA wal_checkpoint", |
| 6659 ** "PRAGMA wal_blocking_checkpoint" or calls the sqlite3_wal_checkpoint() | 7057 ** "PRAGMA wal_blocking_checkpoint" or calls the sqlite3_wal_checkpoint() |
| 6660 ** or wal_blocking_checkpoint() API functions. | 7058 ** or wal_blocking_checkpoint() API functions. |
| 6661 ** | 7059 ** |
| 6662 ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. | 7060 ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. |
| 6663 */ | 7061 */ |
| 6664 int sqlite3PagerCheckpoint(Pager *pPager, int eMode, int *pnLog, int *pnCkpt){ | 7062 int sqlite3PagerCheckpoint(Pager *pPager, int eMode, int *pnLog, int *pnCkpt){ |
| 6665 int rc = SQLITE_OK; | 7063 int rc = SQLITE_OK; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6707 /* | 7105 /* |
| 6708 ** Call sqlite3WalOpen() to open the WAL handle. If the pager is in | 7106 ** Call sqlite3WalOpen() to open the WAL handle. If the pager is in |
| 6709 ** exclusive-locking mode when this function is called, take an EXCLUSIVE | 7107 ** exclusive-locking mode when this function is called, take an EXCLUSIVE |
| 6710 ** lock on the database file and use heap-memory to store the wal-index | 7108 ** lock on the database file and use heap-memory to store the wal-index |
| 6711 ** in. Otherwise, use the normal shared-memory. | 7109 ** in. Otherwise, use the normal shared-memory. |
| 6712 */ | 7110 */ |
| 6713 static int pagerOpenWal(Pager *pPager){ | 7111 static int pagerOpenWal(Pager *pPager){ |
| 6714 int rc = SQLITE_OK; | 7112 int rc = SQLITE_OK; |
| 6715 | 7113 |
| 6716 assert( pPager->pWal==0 && pPager->tempFile==0 ); | 7114 assert( pPager->pWal==0 && pPager->tempFile==0 ); |
| 6717 assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK || pPager-
>noReadlock); | 7115 assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); |
| 6718 | 7116 |
| 6719 /* If the pager is already in exclusive-mode, the WAL module will use | 7117 /* If the pager is already in exclusive-mode, the WAL module will use |
| 6720 ** heap-memory for the wal-index instead of the VFS shared-memory | 7118 ** heap-memory for the wal-index instead of the VFS shared-memory |
| 6721 ** implementation. Take the exclusive lock now, before opening the WAL | 7119 ** implementation. Take the exclusive lock now, before opening the WAL |
| 6722 ** file, to make sure this is safe. | 7120 ** file, to make sure this is safe. |
| 6723 */ | 7121 */ |
| 6724 if( pPager->exclusiveMode ){ | 7122 if( pPager->exclusiveMode ){ |
| 6725 rc = pagerExclusiveLock(pPager); | 7123 rc = pagerExclusiveLock(pPager); |
| 6726 } | 7124 } |
| 6727 | 7125 |
| 6728 /* Open the connection to the log file. If this operation fails, | 7126 /* Open the connection to the log file. If this operation fails, |
| 6729 ** (e.g. due to malloc() failure), return an error code. | 7127 ** (e.g. due to malloc() failure), return an error code. |
| 6730 */ | 7128 */ |
| 6731 if( rc==SQLITE_OK ){ | 7129 if( rc==SQLITE_OK ){ |
| 6732 rc = sqlite3WalOpen(pPager->pVfs, | 7130 rc = sqlite3WalOpen(pPager->pVfs, |
| 6733 pPager->fd, pPager->zWal, pPager->exclusiveMode, &pPager->pWal | 7131 pPager->fd, pPager->zWal, pPager->exclusiveMode, |
| 7132 pPager->journalSizeLimit, &pPager->pWal |
| 6734 ); | 7133 ); |
| 6735 } | 7134 } |
| 7135 pagerFixMaplimit(pPager); |
| 6736 | 7136 |
| 6737 return rc; | 7137 return rc; |
| 6738 } | 7138 } |
| 6739 | 7139 |
| 6740 | 7140 |
| 6741 /* | 7141 /* |
| 6742 ** The caller must be holding a SHARED lock on the database file to call | 7142 ** The caller must be holding a SHARED lock on the database file to call |
| 6743 ** this function. | 7143 ** this function. |
| 6744 ** | 7144 ** |
| 6745 ** If the pager passed as the first argument is open on a real database | 7145 ** If the pager passed as the first argument is open on a real database |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6816 | 7216 |
| 6817 /* Checkpoint and close the log. Because an EXCLUSIVE lock is held on | 7217 /* Checkpoint and close the log. Because an EXCLUSIVE lock is held on |
| 6818 ** the database file, the log and log-summary files will be deleted. | 7218 ** the database file, the log and log-summary files will be deleted. |
| 6819 */ | 7219 */ |
| 6820 if( rc==SQLITE_OK && pPager->pWal ){ | 7220 if( rc==SQLITE_OK && pPager->pWal ){ |
| 6821 rc = pagerExclusiveLock(pPager); | 7221 rc = pagerExclusiveLock(pPager); |
| 6822 if( rc==SQLITE_OK ){ | 7222 if( rc==SQLITE_OK ){ |
| 6823 rc = sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, | 7223 rc = sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, |
| 6824 pPager->pageSize, (u8*)pPager->pTmpSpace); | 7224 pPager->pageSize, (u8*)pPager->pTmpSpace); |
| 6825 pPager->pWal = 0; | 7225 pPager->pWal = 0; |
| 7226 pagerFixMaplimit(pPager); |
| 6826 } | 7227 } |
| 6827 } | 7228 } |
| 6828 return rc; | 7229 return rc; |
| 6829 } | 7230 } |
| 6830 | 7231 |
| 6831 #ifdef SQLITE_HAS_CODEC | |
| 6832 /* | |
| 6833 ** This function is called by the wal module when writing page content | |
| 6834 ** into the log file. | |
| 6835 ** | |
| 6836 ** This function returns a pointer to a buffer containing the encrypted | |
| 6837 ** page content. If a malloc fails, this function may return NULL. | |
| 6838 */ | |
| 6839 void *sqlite3PagerCodec(PgHdr *pPg){ | |
| 6840 void *aData = 0; | |
| 6841 CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData); | |
| 6842 return aData; | |
| 6843 } | |
| 6844 #endif /* SQLITE_HAS_CODEC */ | |
| 6845 | |
| 6846 #endif /* !SQLITE_OMIT_WAL */ | 7232 #endif /* !SQLITE_OMIT_WAL */ |
| 6847 | 7233 |
| 7234 #ifdef SQLITE_ENABLE_ZIPVFS |
| 7235 /* |
| 7236 ** A read-lock must be held on the pager when this function is called. If |
| 7237 ** the pager is in WAL mode and the WAL file currently contains one or more |
| 7238 ** frames, return the size in bytes of the page images stored within the |
| 7239 ** WAL frames. Otherwise, if this is not a WAL database or the WAL file |
| 7240 ** is empty, return 0. |
| 7241 */ |
| 7242 int sqlite3PagerWalFramesize(Pager *pPager){ |
| 7243 assert( pPager->eState>=PAGER_READER ); |
| 7244 return sqlite3WalFramesize(pPager->pWal); |
| 7245 } |
| 7246 #endif |
| 7247 |
| 6848 #endif /* SQLITE_OMIT_DISKIO */ | 7248 #endif /* SQLITE_OMIT_DISKIO */ |
| OLD | NEW |