Annotation of embedaddon/sqlite3/src/pager.c, revision 1.1
1.1 ! misho 1: /*
! 2: ** 2001 September 15
! 3: **
! 4: ** The author disclaims copyright to this source code. In place of
! 5: ** a legal notice, here is a blessing:
! 6: **
! 7: ** May you do good and not evil.
! 8: ** May you find forgiveness for yourself and forgive others.
! 9: ** May you share freely, never taking more than you give.
! 10: **
! 11: *************************************************************************
! 12: ** This is the implementation of the page cache subsystem or "pager".
! 13: **
! 14: ** The pager is used to access a database disk file. It implements
! 15: ** atomic commit and rollback through the use of a journal file that
! 16: ** is separate from the database file. The pager also implements file
! 17: ** locking to prevent two processes from writing the same database
! 18: ** file simultaneously, or one process from reading the database while
! 19: ** another is writing.
! 20: */
! 21: #ifndef SQLITE_OMIT_DISKIO
! 22: #include "sqliteInt.h"
! 23: #include "wal.h"
! 24:
! 25:
! 26: /******************* NOTES ON THE DESIGN OF THE PAGER ************************
! 27: **
! 28: ** This comment block describes invariants that hold when using a rollback
! 29: ** journal. These invariants do not apply for journal_mode=WAL,
! 30: ** journal_mode=MEMORY, or journal_mode=OFF.
! 31: **
! 32: ** Within this comment block, a page is deemed to have been synced
! 33: ** automatically as soon as it is written when PRAGMA synchronous=OFF.
! 34: ** Otherwise, the page is not synced until the xSync method of the VFS
! 35: ** is called successfully on the file containing the page.
! 36: **
! 37: ** Definition: A page of the database file is said to be "overwriteable" if
! 38: ** one or more of the following are true about the page:
! 39: **
! 40: ** (a) The original content of the page as it was at the beginning of
! 41: ** the transaction has been written into the rollback journal and
! 42: ** synced.
! 43: **
! 44: ** (b) The page was a freelist leaf page at the start of the transaction.
! 45: **
! 46: ** (c) The page number is greater than the largest page that existed in
! 47: ** the database file at the start of the transaction.
! 48: **
! 49: ** (1) A page of the database file is never overwritten unless one of the
! 50: ** following are true:
! 51: **
! 52: ** (a) The page and all other pages on the same sector are overwriteable.
! 53: **
! 54: ** (b) The atomic page write optimization is enabled, and the entire
! 55: ** transaction other than the update of the transaction sequence
! 56: ** number consists of a single page change.
! 57: **
! 58: ** (2) The content of a page written into the rollback journal exactly matches
! 59: ** both the content in the database when the rollback journal was written
! 60: ** and the content in the database at the beginning of the current
! 61: ** transaction.
! 62: **
! 63: ** (3) Writes to the database file are an integer multiple of the page size
! 64: ** in length and are aligned on a page boundary.
! 65: **
! 66: ** (4) Reads from the database file are either aligned on a page boundary and
! 67: ** an integer multiple of the page size in length or are taken from the
! 68: ** first 100 bytes of the database file.
! 69: **
! 70: ** (5) All writes to the database file are synced prior to the rollback journal
! 71: ** being deleted, truncated, or zeroed.
! 72: **
! 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.
! 75: **
! 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
! 78: ** all queries. Note in particular the the content of freelist leaf
! 79: ** pages can be changed arbitarily without effecting the logical equivalence
! 80: ** of the database.
! 81: **
! 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
! 84: ** journal is rolled back, the resulting database file will be logical
! 85: ** equivalent to the database file at the beginning of the transaction.
! 86: **
! 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
! 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
! 91: ** invoke it.)
! 92: **
! 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
! 95: ** the EXCLUSIVE lock, thus signaling other connections on the same
! 96: ** database to flush their caches.
! 97: **
! 98: ** (10) The pattern of bits in bytes 24 through 39 shall not repeat in less
! 99: ** than one billion transactions.
! 100: **
! 101: ** (11) A database file is well-formed at the beginning and at the conclusion
! 102: ** of every transaction.
! 103: **
! 104: ** (12) An EXCLUSIVE lock is held on the database file when writing to
! 105: ** the database file.
! 106: **
! 107: ** (13) A SHARED lock is held on the database file while reading any
! 108: ** content out of the database file.
! 109: **
! 110: ******************************************************************************/
! 111:
! 112: /*
! 113: ** Macros for troubleshooting. Normally turned off
! 114: */
! 115: #if 0
! 116: int sqlite3PagerTrace=1; /* True to enable tracing */
! 117: #define sqlite3DebugPrintf printf
! 118: #define PAGERTRACE(X) if( sqlite3PagerTrace ){ sqlite3DebugPrintf X; }
! 119: #else
! 120: #define PAGERTRACE(X)
! 121: #endif
! 122:
! 123: /*
! 124: ** The following two macros are used within the PAGERTRACE() macros above
! 125: ** to print out file-descriptors.
! 126: **
! 127: ** PAGERID() takes a pointer to a Pager struct as its argument. The
! 128: ** associated file-descriptor is returned. FILEHANDLEID() takes an sqlite3_file
! 129: ** struct as its argument.
! 130: */
! 131: #define PAGERID(p) ((int)(p->fd))
! 132: #define FILEHANDLEID(fd) ((int)fd)
! 133:
! 134: /*
! 135: ** The Pager.eState variable stores the current 'state' of a pager. A
! 136: ** pager may be in any one of the seven states shown in the following
! 137: ** state diagram.
! 138: **
! 139: ** OPEN <------+------+
! 140: ** | | |
! 141: ** V | |
! 142: ** +---------> READER-------+ |
! 143: ** | | |
! 144: ** | V |
! 145: ** |<-------WRITER_LOCKED------> ERROR
! 146: ** | | ^
! 147: ** | V |
! 148: ** |<------WRITER_CACHEMOD-------->|
! 149: ** | | |
! 150: ** | V |
! 151: ** |<-------WRITER_DBMOD---------->|
! 152: ** | | |
! 153: ** | V |
! 154: ** +<------WRITER_FINISHED-------->+
! 155: **
! 156: **
! 157: ** List of state transitions and the C [function] that performs each:
! 158: **
! 159: ** OPEN -> READER [sqlite3PagerSharedLock]
! 160: ** READER -> OPEN [pager_unlock]
! 161: **
! 162: ** READER -> WRITER_LOCKED [sqlite3PagerBegin]
! 163: ** WRITER_LOCKED -> WRITER_CACHEMOD [pager_open_journal]
! 164: ** WRITER_CACHEMOD -> WRITER_DBMOD [syncJournal]
! 165: ** WRITER_DBMOD -> WRITER_FINISHED [sqlite3PagerCommitPhaseOne]
! 166: ** WRITER_*** -> READER [pager_end_transaction]
! 167: **
! 168: ** WRITER_*** -> ERROR [pager_error]
! 169: ** ERROR -> OPEN [pager_unlock]
! 170: **
! 171: **
! 172: ** OPEN:
! 173: **
! 174: ** The pager starts up in this state. Nothing is guaranteed in this
! 175: ** state - the file may or may not be locked and the database size is
! 176: ** unknown. The database may not be read or written.
! 177: **
! 178: ** * No read or write transaction is active.
! 179: ** * Any lock, or no lock at all, may be held on the database file.
! 180: ** * The dbSize, dbOrigSize and dbFileSize variables may not be trusted.
! 181: **
! 182: ** READER:
! 183: **
! 184: ** In this state all the requirements for reading the database in
! 185: ** rollback (non-WAL) mode are met. Unless the pager is (or recently
! 186: ** was) in exclusive-locking mode, a user-level read transaction is
! 187: ** open. The database size is known in this state.
! 188: **
! 189: ** A connection running with locking_mode=normal enters this state when
! 190: ** it opens a read-transaction on the database and returns to state
! 191: ** OPEN after the read-transaction is completed. However a connection
! 192: ** running in locking_mode=exclusive (including temp databases) remains in
! 193: ** this state even after the read-transaction is closed. The only way
! 194: ** a locking_mode=exclusive connection can transition from READER to OPEN
! 195: ** is via the ERROR state (see below).
! 196: **
! 197: ** * A read transaction may be active (but a write-transaction cannot).
! 198: ** * A SHARED or greater lock is held on the database file.
! 199: ** * The dbSize variable may be trusted (even if a user-level read
! 200: ** transaction is not active). The dbOrigSize and dbFileSize variables
! 201: ** may not be trusted at this point.
! 202: ** * If the database is a WAL database, then the WAL connection is open.
! 203: ** * Even if a read-transaction is not open, it is guaranteed that
! 204: ** there is no hot-journal in the file-system.
! 205: **
! 206: ** WRITER_LOCKED:
! 207: **
! 208: ** The pager moves to this state from READER when a write-transaction
! 209: ** is first opened on the database. In WRITER_LOCKED state, all locks
! 210: ** required to start a write-transaction are held, but no actual
! 211: ** modifications to the cache or database have taken place.
! 212: **
! 213: ** In rollback mode, a RESERVED or (if the transaction was opened with
! 214: ** BEGIN EXCLUSIVE) EXCLUSIVE lock is obtained on the database file when
! 215: ** moving to this state, but the journal file is not written to or opened
! 216: ** to in this state. If the transaction is committed or rolled back while
! 217: ** in WRITER_LOCKED state, all that is required is to unlock the database
! 218: ** file.
! 219: **
! 220: ** IN WAL mode, WalBeginWriteTransaction() is called to lock the log file.
! 221: ** If the connection is running with locking_mode=exclusive, an attempt
! 222: ** is made to obtain an EXCLUSIVE lock on the database file.
! 223: **
! 224: ** * A write transaction is active.
! 225: ** * If the connection is open in rollback-mode, a RESERVED or greater
! 226: ** lock is held on the database file.
! 227: ** * If the connection is open in WAL-mode, a WAL write transaction
! 228: ** is open (i.e. sqlite3WalBeginWriteTransaction() has been successfully
! 229: ** called).
! 230: ** * The dbSize, dbOrigSize and dbFileSize variables are all valid.
! 231: ** * The contents of the pager cache have not been modified.
! 232: ** * The journal file may or may not be open.
! 233: ** * Nothing (not even the first header) has been written to the journal.
! 234: **
! 235: ** WRITER_CACHEMOD:
! 236: **
! 237: ** A pager moves from WRITER_LOCKED state to this state when a page is
! 238: ** first modified by the upper layer. In rollback mode the journal file
! 239: ** is opened (if it is not already open) and a header written to the
! 240: ** start of it. The database file on disk has not been modified.
! 241: **
! 242: ** * A write transaction is active.
! 243: ** * A RESERVED or greater lock is held on the database file.
! 244: ** * The journal file is open and the first header has been written
! 245: ** to it, but the header has not been synced to disk.
! 246: ** * The contents of the page cache have been modified.
! 247: **
! 248: ** WRITER_DBMOD:
! 249: **
! 250: ** The pager transitions from WRITER_CACHEMOD into WRITER_DBMOD state
! 251: ** when it modifies the contents of the database file. WAL connections
! 252: ** never enter this state (since they do not modify the database file,
! 253: ** just the log file).
! 254: **
! 255: ** * A write transaction is active.
! 256: ** * An EXCLUSIVE or greater lock is held on the database file.
! 257: ** * The journal file is open and the first header has been written
! 258: ** and synced to disk.
! 259: ** * The contents of the page cache have been modified (and possibly
! 260: ** written to disk).
! 261: **
! 262: ** WRITER_FINISHED:
! 263: **
! 264: ** It is not possible for a WAL connection to enter this state.
! 265: **
! 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
! 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
! 270: ** not possible to modify the database further. At this point, the upper
! 271: ** layer must either commit or rollback the transaction.
! 272: **
! 273: ** * A write transaction is active.
! 274: ** * An EXCLUSIVE or greater lock is held on the database file.
! 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
! 277: ** commit the transaction. If an error did occur, the caller will need
! 278: ** to rollback the transaction.
! 279: **
! 280: ** ERROR:
! 281: **
! 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
! 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.
! 286: **
! 287: ** Temporary pager files may enter the ERROR state, but in-memory pagers
! 288: ** cannot.
! 289: **
! 290: ** For example, if an IO error occurs while performing a rollback,
! 291: ** the contents of the page-cache may be left in an inconsistent state.
! 292: ** At this point it would be dangerous to change back to READER state
! 293: ** (as usually happens after a rollback). Any subsequent readers might
! 294: ** report database corruption (due to the inconsistent cache), and if
! 295: ** they upgrade to writers, they may inadvertently corrupt the database
! 296: ** file. To avoid this hazard, the pager switches into the ERROR state
! 297: ** instead of READER following such an error.
! 298: **
! 299: ** Once it has entered the ERROR state, any attempt to use the pager
! 300: ** to read or write data returns an error. Eventually, once all
! 301: ** outstanding transactions have been abandoned, the pager is able to
! 302: ** transition back to OPEN state, discarding the contents of the
! 303: ** page-cache and any other in-memory state at the same time. Everything
! 304: ** is reloaded from disk (and, if necessary, hot-journal rollback peformed)
! 305: ** when a read-transaction is next opened on the pager (transitioning
! 306: ** the pager into READER state). At that point the system has recovered
! 307: ** from the error.
! 308: **
! 309: ** Specifically, the pager jumps into the ERROR state if:
! 310: **
! 311: ** 1. An error occurs while attempting a rollback. This happens in
! 312: ** function sqlite3PagerRollback().
! 313: **
! 314: ** 2. An error occurs while attempting to finalize a journal file
! 315: ** following a commit in function sqlite3PagerCommitPhaseTwo().
! 316: **
! 317: ** 3. An error occurs while attempting to write to the journal or
! 318: ** database file in function pagerStress() in order to free up
! 319: ** memory.
! 320: **
! 321: ** In other cases, the error is returned to the b-tree layer. The b-tree
! 322: ** layer then attempts a rollback operation. If the error condition
! 323: ** persists, the pager enters the ERROR state via condition (1) above.
! 324: **
! 325: ** Condition (3) is necessary because it can be triggered by a read-only
! 326: ** statement executed within a transaction. In this case, if the error
! 327: ** code were simply returned to the user, the b-tree layer would not
! 328: ** automatically attempt a rollback, as it assumes that an error in a
! 329: ** read-only statement cannot leave the pager in an internally inconsistent
! 330: ** state.
! 331: **
! 332: ** * The Pager.errCode variable is set to something other than SQLITE_OK.
! 333: ** * There are one or more outstanding references to pages (after the
! 334: ** last reference is dropped the pager should move back to OPEN state).
! 335: ** * The pager is not an in-memory pager.
! 336: **
! 337: **
! 338: ** Notes:
! 339: **
! 340: ** * A pager is never in WRITER_DBMOD or WRITER_FINISHED state if the
! 341: ** connection is open in WAL mode. A WAL connection is always in one
! 342: ** of the first four states.
! 343: **
! 344: ** * Normally, a connection open in exclusive mode is never in PAGER_OPEN
! 345: ** state. There are two exceptions: immediately after exclusive-mode has
! 346: ** been turned on (and before any read or write transactions are
! 347: ** executed), and when the pager is leaving the "error state".
! 348: **
! 349: ** * See also: assert_pager_state().
! 350: */
! 351: #define PAGER_OPEN 0
! 352: #define PAGER_READER 1
! 353: #define PAGER_WRITER_LOCKED 2
! 354: #define PAGER_WRITER_CACHEMOD 3
! 355: #define PAGER_WRITER_DBMOD 4
! 356: #define PAGER_WRITER_FINISHED 5
! 357: #define PAGER_ERROR 6
! 358:
! 359: /*
! 360: ** The Pager.eLock variable is almost always set to one of the
! 361: ** following locking-states, according to the lock currently held on
! 362: ** the database file: NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK.
! 363: ** This variable is kept up to date as locks are taken and released by
! 364: ** the pagerLockDb() and pagerUnlockDb() wrappers.
! 365: **
! 366: ** If the VFS xLock() or xUnlock() returns an error other than SQLITE_BUSY
! 367: ** (i.e. one of the SQLITE_IOERR subtypes), it is not clear whether or not
! 368: ** the operation was successful. In these circumstances pagerLockDb() and
! 369: ** pagerUnlockDb() take a conservative approach - eLock is always updated
! 370: ** when unlocking the file, and only updated when locking the file if the
! 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
! 373: ** at the system level, but it is never set to a more exclusive value.
! 374: **
! 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
! 377: ** required, but nothing really goes wrong.
! 378: **
! 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
! 381: ** in the file-system that needs to be rolled back (as part of a OPEN->SHARED
! 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
! 384: ** can confuse the call to xCheckReservedLock() call made later as part
! 385: ** of hot-journal detection.
! 386: **
! 387: ** xCheckReservedLock() is defined as returning true "if there is a RESERVED
! 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
! 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
! 392: ** transaction in another process, causing SQLite to read from the database
! 393: ** without rolling it back.
! 394: **
! 395: ** To work around this, if a call to xUnlock() fails when unlocking the
! 396: ** database in the ERROR state, Pager.eLock is set to UNKNOWN_LOCK. It
! 397: ** is only changed back to a real locking state after a successful call
! 398: ** to xLock(EXCLUSIVE). Also, the code to do the OPEN->SHARED state transition
! 399: ** omits the check for a hot-journal if Pager.eLock is set to UNKNOWN_LOCK
! 400: ** lock. Instead, it assumes a hot-journal exists and obtains an EXCLUSIVE
! 401: ** lock on the database file before attempting to roll it back. See function
! 402: ** PagerSharedLock() for more detail.
! 403: **
! 404: ** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in
! 405: ** PAGER_OPEN state.
! 406: */
! 407: #define UNKNOWN_LOCK (EXCLUSIVE_LOCK+1)
! 408:
! 409: /*
! 410: ** A macro used for invoking the codec if there is one
! 411: */
! 412: #ifdef SQLITE_HAS_CODEC
! 413: # define CODEC1(P,D,N,X,E) \
! 414: if( P->xCodec && P->xCodec(P->pCodec,D,N,X)==0 ){ E; }
! 415: # define CODEC2(P,D,N,X,E,O) \
! 416: if( P->xCodec==0 ){ O=(char*)D; }else \
! 417: if( (O=(char*)(P->xCodec(P->pCodec,D,N,X)))==0 ){ E; }
! 418: #else
! 419: # define CODEC1(P,D,N,X,E) /* NO-OP */
! 420: # define CODEC2(P,D,N,X,E,O) O=(char*)D
! 421: #endif
! 422:
! 423: /*
! 424: ** The maximum allowed sector size. 64KiB. If the xSectorsize() method
! 425: ** returns a value larger than this, then MAX_SECTOR_SIZE is used instead.
! 426: ** This could conceivably cause corruption following a power failure on
! 427: ** such a system. This is currently an undocumented limit.
! 428: */
! 429: #define MAX_SECTOR_SIZE 0x10000
! 430:
! 431: /*
! 432: ** An instance of the following structure is allocated for each active
! 433: ** savepoint and statement transaction in the system. All such structures
! 434: ** are stored in the Pager.aSavepoint[] array, which is allocated and
! 435: ** resized using sqlite3Realloc().
! 436: **
! 437: ** When a savepoint is created, the PagerSavepoint.iHdrOffset field is
! 438: ** set to 0. If a journal-header is written into the main journal while
! 439: ** the savepoint is active, then iHdrOffset is set to the byte offset
! 440: ** immediately following the last journal record written into the main
! 441: ** journal before the journal-header. This is required during savepoint
! 442: ** rollback (see pagerPlaybackSavepoint()).
! 443: */
! 444: typedef struct PagerSavepoint PagerSavepoint;
! 445: struct PagerSavepoint {
! 446: i64 iOffset; /* Starting offset in main journal */
! 447: i64 iHdrOffset; /* See above */
! 448: Bitvec *pInSavepoint; /* Set of pages in this savepoint */
! 449: Pgno nOrig; /* Original number of pages in file */
! 450: Pgno iSubRec; /* Index of first record in sub-journal */
! 451: #ifndef SQLITE_OMIT_WAL
! 452: u32 aWalData[WAL_SAVEPOINT_NDATA]; /* WAL savepoint context */
! 453: #endif
! 454: };
! 455:
! 456: /*
! 457: ** A open page cache is an instance of struct Pager. A description of
! 458: ** some of the more important member variables follows:
! 459: **
! 460: ** eState
! 461: **
! 462: ** The current 'state' of the pager object. See the comment and state
! 463: ** diagram above for a description of the pager state.
! 464: **
! 465: ** eLock
! 466: **
! 467: ** For a real on-disk database, the current lock held on the database file -
! 468: ** NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK.
! 469: **
! 470: ** For a temporary or in-memory database (neither of which require any
! 471: ** locks), this variable is always set to EXCLUSIVE_LOCK. Since such
! 472: ** databases always have Pager.exclusiveMode==1, this tricks the pager
! 473: ** logic into thinking that it already has all the locks it will ever
! 474: ** need (and no reason to release them).
! 475: **
! 476: ** In some (obscure) circumstances, this variable may also be set to
! 477: ** UNKNOWN_LOCK. See the comment above the #define of UNKNOWN_LOCK for
! 478: ** details.
! 479: **
! 480: ** changeCountDone
! 481: **
! 482: ** This boolean variable is used to make sure that the change-counter
! 483: ** (the 4-byte header field at byte offset 24 of the database file) is
! 484: ** not updated more often than necessary.
! 485: **
! 486: ** It is set to true when the change-counter field is updated, which
! 487: ** can only happen if an exclusive lock is held on the database file.
! 488: ** It is cleared (set to false) whenever an exclusive lock is
! 489: ** relinquished on the database file. Each time a transaction is committed,
! 490: ** The changeCountDone flag is inspected. If it is true, the work of
! 491: ** updating the change-counter is omitted for the current transaction.
! 492: **
! 493: ** This mechanism means that when running in exclusive mode, a connection
! 494: ** need only update the change-counter once, for the first transaction
! 495: ** committed.
! 496: **
! 497: ** setMaster
! 498: **
! 499: ** When PagerCommitPhaseOne() is called to commit a transaction, it may
! 500: ** (or may not) specify a master-journal name to be written into the
! 501: ** journal file before it is synced to disk.
! 502: **
! 503: ** Whether or not a journal file contains a master-journal pointer affects
! 504: ** the way in which the journal file is finalized after the transaction is
! 505: ** committed or rolled back when running in "journal_mode=PERSIST" mode.
! 506: ** If a journal file does not contain a master-journal pointer, it is
! 507: ** finalized by overwriting the first journal header with zeroes. If
! 508: ** it does contain a master-journal pointer the journal file is finalized
! 509: ** by truncating it to zero bytes, just as if the connection were
! 510: ** running in "journal_mode=truncate" mode.
! 511: **
! 512: ** Journal files that contain master journal pointers cannot be finalized
! 513: ** simply by overwriting the first journal-header with zeroes, as the
! 514: ** master journal pointer could interfere with hot-journal rollback of any
! 515: ** subsequently interrupted transaction that reuses the journal file.
! 516: **
! 517: ** The flag is cleared as soon as the journal file is finalized (either
! 518: ** by PagerCommitPhaseTwo or PagerRollback). If an IO error prevents the
! 519: ** journal file from being successfully finalized, the setMaster flag
! 520: ** is cleared anyway (and the pager will move to ERROR state).
! 521: **
! 522: ** doNotSpill, doNotSyncSpill
! 523: **
! 524: ** These two boolean variables control the behaviour of cache-spills
! 525: ** (calls made by the pcache module to the pagerStress() routine to
! 526: ** write cached data to the file-system in order to free up memory).
! 527: **
! 528: ** When doNotSpill is non-zero, writing to the database from pagerStress()
! 529: ** is disabled altogether. This is done in a very obscure case that
! 530: ** comes up during savepoint rollback that requires the pcache module
! 531: ** to allocate a new page to prevent the journal file from being written
! 532: ** while it is being traversed by code in pager_playback().
! 533: **
! 534: ** If doNotSyncSpill is non-zero, writing to the database from pagerStress()
! 535: ** 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
! 537: ** 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.
! 539: **
! 540: ** subjInMemory
! 541: **
! 542: ** 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
! 544: ** sub-journals are only used for in-memory pager files.
! 545: **
! 546: ** This variable is updated by the upper layer each time a new
! 547: ** write-transaction is opened.
! 548: **
! 549: ** dbSize, dbOrigSize, dbFileSize
! 550: **
! 551: ** Variable dbSize is set to the number of pages in the database file.
! 552: ** It is valid in PAGER_READER and higher states (all states except for
! 553: ** OPEN and ERROR).
! 554: **
! 555: ** dbSize is set based on the size of the database file, which may be
! 556: ** larger than the size of the database (the value stored at offset
! 557: ** 28 of the database header by the btree). If the size of the file
! 558: ** is not an integer multiple of the page-size, the value stored in
! 559: ** dbSize is rounded down (i.e. a 5KB file with 2K page-size has dbSize==2).
! 560: ** Except, any file that is greater than 0 bytes in size is considered
! 561: ** to have at least one page. (i.e. a 1KB file with 2K page-size leads
! 562: ** to dbSize==1).
! 563: **
! 564: ** During a write-transaction, if pages with page-numbers greater than
! 565: ** dbSize are modified in the cache, dbSize is updated accordingly.
! 566: ** Similarly, if the database is truncated using PagerTruncateImage(),
! 567: ** dbSize is updated.
! 568: **
! 569: ** Variables dbOrigSize and dbFileSize are valid in states
! 570: ** PAGER_WRITER_LOCKED and higher. dbOrigSize is a copy of the dbSize
! 571: ** variable at the start of the transaction. It is used during rollback,
! 572: ** and to determine whether or not pages need to be journalled before
! 573: ** being modified.
! 574: **
! 575: ** Throughout a write-transaction, dbFileSize contains the size of
! 576: ** the file on disk in pages. It is set to a copy of dbSize when the
! 577: ** write-transaction is first opened, and updated when VFS calls are made
! 578: ** to write or truncate the database file on disk.
! 579: **
! 580: ** The only reason the dbFileSize variable is required is to suppress
! 581: ** unnecessary calls to xTruncate() after committing a transaction. If,
! 582: ** when a transaction is committed, the dbFileSize variable indicates
! 583: ** that the database file is larger than the database image (Pager.dbSize),
! 584: ** pager_truncate() is called. The pager_truncate() call uses xFilesize()
! 585: ** to measure the database file on disk, and then truncates it if required.
! 586: ** dbFileSize is not used when rolling back a transaction. In this case
! 587: ** pager_truncate() is called unconditionally (which means there may be
! 588: ** a call to xFilesize() that is not strictly required). In either case,
! 589: ** pager_truncate() may cause the file to become smaller or larger.
! 590: **
! 591: ** dbHintSize
! 592: **
! 593: ** The dbHintSize variable is used to limit the number of calls made to
! 594: ** the VFS xFileControl(FCNTL_SIZE_HINT) method.
! 595: **
! 596: ** dbHintSize is set to a copy of the dbSize variable when a
! 597: ** write-transaction is opened (at the same time as dbFileSize and
! 598: ** dbOrigSize). If the xFileControl(FCNTL_SIZE_HINT) method is called,
! 599: ** dbHintSize is increased to the number of pages that correspond to the
! 600: ** size-hint passed to the method call. See pager_write_pagelist() for
! 601: ** details.
! 602: **
! 603: ** errCode
! 604: **
! 605: ** 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
! 607: ** is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX
! 608: ** sub-codes.
! 609: */
! 610: struct Pager {
! 611: sqlite3_vfs *pVfs; /* OS functions to use for IO */
! 612: u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */
! 613: u8 journalMode; /* One of the PAGER_JOURNALMODE_* values */
! 614: 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 */
! 617: u8 fullSync; /* Do extra syncs of the journal for robustness */
! 618: u8 ckptSyncFlags; /* SYNC_NORMAL or SYNC_FULL for checkpoint */
! 619: u8 walSyncFlags; /* SYNC_NORMAL or SYNC_FULL for wal writes */
! 620: u8 syncFlags; /* SYNC_NORMAL or SYNC_FULL otherwise */
! 621: u8 tempFile; /* zFilename is a temporary file */
! 622: u8 readOnly; /* True for a read-only database */
! 623: u8 memDb; /* True to inhibit all file I/O */
! 624:
! 625: /**************************************************************************
! 626: ** The following block contains those class members that change during
! 627: ** routine opertion. Class members not in this block are either fixed
! 628: ** when the pager is first created or else only change when there is a
! 629: ** significant mode change (such as changing the page_size, locking_mode,
! 630: ** or the journal_mode). From another view, these class members describe
! 631: ** the "state" of the pager, while other class members describe the
! 632: ** "configuration" of the pager.
! 633: */
! 634: u8 eState; /* Pager state (OPEN, READER, WRITER_LOCKED..) */
! 635: u8 eLock; /* Current lock held on database file */
! 636: u8 changeCountDone; /* Set after incrementing the change-counter */
! 637: u8 setMaster; /* True if a m-j name has been written to jrnl */
! 638: u8 doNotSpill; /* Do not spill the cache when non-zero */
! 639: u8 doNotSyncSpill; /* Do not do a spill that requires jrnl sync */
! 640: u8 subjInMemory; /* True to use in-memory sub-journals */
! 641: Pgno dbSize; /* Number of pages in the database */
! 642: Pgno dbOrigSize; /* dbSize before the current transaction */
! 643: Pgno dbFileSize; /* Number of pages in the database file */
! 644: Pgno dbHintSize; /* Value passed to FCNTL_SIZE_HINT call */
! 645: int errCode; /* One of several kinds of errors */
! 646: int nRec; /* Pages journalled since last j-header written */
! 647: u32 cksumInit; /* Quasi-random value added to every checksum */
! 648: u32 nSubRec; /* Number of records written to sub-journal */
! 649: Bitvec *pInJournal; /* One bit for each page in the database file */
! 650: sqlite3_file *fd; /* File descriptor for database */
! 651: sqlite3_file *jfd; /* File descriptor for main journal */
! 652: sqlite3_file *sjfd; /* File descriptor for sub-journal */
! 653: i64 journalOff; /* Current write offset in the journal file */
! 654: i64 journalHdr; /* Byte offset to previous journal header */
! 655: sqlite3_backup *pBackup; /* Pointer to list of ongoing backup processes */
! 656: PagerSavepoint *aSavepoint; /* Array of active savepoints */
! 657: int nSavepoint; /* Number of elements in aSavepoint[] */
! 658: char dbFileVers[16]; /* Changes whenever database file changes */
! 659: /*
! 660: ** End of the routinely-changing class members
! 661: ***************************************************************************/
! 662:
! 663: u16 nExtra; /* Add this many bytes to each in-memory page */
! 664: i16 nReserve; /* Number of unused bytes at end of each page */
! 665: u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */
! 666: u32 sectorSize; /* Assumed sector size during rollback */
! 667: int pageSize; /* Number of bytes in a page */
! 668: Pgno mxPgno; /* Maximum allowed size of the database */
! 669: i64 journalSizeLimit; /* Size limit for persistent journal files */
! 670: char *zFilename; /* Name of the database file */
! 671: char *zJournal; /* Name of the journal file */
! 672: int (*xBusyHandler)(void*); /* Function to call when busy */
! 673: void *pBusyHandlerArg; /* Context argument for xBusyHandler */
! 674: int nHit, nMiss; /* Total cache hits and misses */
! 675: #ifdef SQLITE_TEST
! 676: int nRead, nWrite; /* Database pages read/written */
! 677: #endif
! 678: void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */
! 679: #ifdef SQLITE_HAS_CODEC
! 680: void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */
! 681: void (*xCodecSizeChng)(void*,int,int); /* Notify of page size changes */
! 682: void (*xCodecFree)(void*); /* Destructor for the codec */
! 683: void *pCodec; /* First argument to xCodec... methods */
! 684: #endif
! 685: char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */
! 686: PCache *pPCache; /* Pointer to page cache object */
! 687: #ifndef SQLITE_OMIT_WAL
! 688: Wal *pWal; /* Write-ahead log used by "journal_mode=wal" */
! 689: char *zWal; /* File name for write-ahead log */
! 690: #endif
! 691: };
! 692:
! 693: /*
! 694: ** The following global variables hold counters used for
! 695: ** testing purposes only. These variables do not exist in
! 696: ** a non-testing build. These variables are not thread-safe.
! 697: */
! 698: #ifdef SQLITE_TEST
! 699: int sqlite3_pager_readdb_count = 0; /* Number of full pages read from DB */
! 700: int sqlite3_pager_writedb_count = 0; /* Number of full pages written to DB */
! 701: int sqlite3_pager_writej_count = 0; /* Number of pages written to journal */
! 702: # define PAGER_INCR(v) v++
! 703: #else
! 704: # define PAGER_INCR(v)
! 705: #endif
! 706:
! 707:
! 708:
! 709: /*
! 710: ** Journal files begin with the following magic string. The data
! 711: ** was obtained from /dev/random. It is used only as a sanity check.
! 712: **
! 713: ** Since version 2.8.0, the journal format contains additional sanity
! 714: ** checking information. If the power fails while the journal is being
! 715: ** written, semi-random garbage data might appear in the journal
! 716: ** file after power is restored. If an attempt is then made
! 717: ** to roll the journal back, the database could be corrupted. The additional
! 718: ** sanity checking data is an attempt to discover the garbage in the
! 719: ** journal and ignore it.
! 720: **
! 721: ** The sanity checking information for the new journal format consists
! 722: ** of a 32-bit checksum on each page of data. The checksum covers both
! 723: ** the page number and the pPager->pageSize bytes of data for the page.
! 724: ** This cksum is initialized to a 32-bit random value that appears in the
! 725: ** journal file right after the header. The random initializer is important,
! 726: ** because garbage data that appears at the end of a journal is likely
! 727: ** data that was once in other files that have now been deleted. If the
! 728: ** garbage data came from an obsolete journal file, the checksums might
! 729: ** be correct. But by initializing the checksum to random value which
! 730: ** is different for every journal, we minimize that risk.
! 731: */
! 732: static const unsigned char aJournalMagic[] = {
! 733: 0xd9, 0xd5, 0x05, 0xf9, 0x20, 0xa1, 0x63, 0xd7,
! 734: };
! 735:
! 736: /*
! 737: ** The size of the of each page record in the journal is given by
! 738: ** the following macro.
! 739: */
! 740: #define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8)
! 741:
! 742: /*
! 743: ** The journal header size for this pager. This is usually the same
! 744: ** size as a single disk sector. See also setSectorSize().
! 745: */
! 746: #define JOURNAL_HDR_SZ(pPager) (pPager->sectorSize)
! 747:
! 748: /*
! 749: ** The macro MEMDB is true if we are dealing with an in-memory database.
! 750: ** We do this as a macro so that if the SQLITE_OMIT_MEMORYDB macro is set,
! 751: ** the value of MEMDB will be a constant and the compiler will optimize
! 752: ** out code that would never execute.
! 753: */
! 754: #ifdef SQLITE_OMIT_MEMORYDB
! 755: # define MEMDB 0
! 756: #else
! 757: # define MEMDB pPager->memDb
! 758: #endif
! 759:
! 760: /*
! 761: ** The maximum legal page number is (2^31 - 1).
! 762: */
! 763: #define PAGER_MAX_PGNO 2147483647
! 764:
! 765: /*
! 766: ** The argument to this macro is a file descriptor (type sqlite3_file*).
! 767: ** Return 0 if it is not open, or non-zero (but not 1) if it is.
! 768: **
! 769: ** This is so that expressions can be written as:
! 770: **
! 771: ** if( isOpen(pPager->jfd) ){ ...
! 772: **
! 773: ** instead of
! 774: **
! 775: ** if( pPager->jfd->pMethods ){ ...
! 776: */
! 777: #define isOpen(pFd) ((pFd)->pMethods)
! 778:
! 779: /*
! 780: ** Return true if this pager uses a write-ahead log instead of the usual
! 781: ** rollback journal. Otherwise false.
! 782: */
! 783: #ifndef SQLITE_OMIT_WAL
! 784: static int pagerUseWal(Pager *pPager){
! 785: return (pPager->pWal!=0);
! 786: }
! 787: #else
! 788: # define pagerUseWal(x) 0
! 789: # define pagerRollbackWal(x) 0
! 790: # define pagerWalFrames(v,w,x,y) 0
! 791: # define pagerOpenWalIfPresent(z) SQLITE_OK
! 792: # define pagerBeginReadTransaction(z) SQLITE_OK
! 793: #endif
! 794:
! 795: #ifndef NDEBUG
! 796: /*
! 797: ** Usage:
! 798: **
! 799: ** assert( assert_pager_state(pPager) );
! 800: **
! 801: ** This function runs many asserts to try to find inconsistencies in
! 802: ** the internal state of the Pager object.
! 803: */
! 804: static int assert_pager_state(Pager *p){
! 805: Pager *pPager = p;
! 806:
! 807: /* State must be valid. */
! 808: assert( p->eState==PAGER_OPEN
! 809: || p->eState==PAGER_READER
! 810: || p->eState==PAGER_WRITER_LOCKED
! 811: || p->eState==PAGER_WRITER_CACHEMOD
! 812: || p->eState==PAGER_WRITER_DBMOD
! 813: || p->eState==PAGER_WRITER_FINISHED
! 814: || p->eState==PAGER_ERROR
! 815: );
! 816:
! 817: /* Regardless of the current state, a temp-file connection always behaves
! 818: ** as if it has an exclusive lock on the database file. It never updates
! 819: ** the change-counter field, so the changeCountDone flag is always set.
! 820: */
! 821: assert( p->tempFile==0 || p->eLock==EXCLUSIVE_LOCK );
! 822: assert( p->tempFile==0 || pPager->changeCountDone );
! 823:
! 824: /* If the useJournal flag is clear, the journal-mode must be "OFF".
! 825: ** And if the journal-mode is "OFF", the journal file must not be open.
! 826: */
! 827: assert( p->journalMode==PAGER_JOURNALMODE_OFF || p->useJournal );
! 828: assert( p->journalMode!=PAGER_JOURNALMODE_OFF || !isOpen(p->jfd) );
! 829:
! 830: /* Check that MEMDB implies noSync. And an in-memory journal. Since
! 831: ** this means an in-memory pager performs no IO at all, it cannot encounter
! 832: ** either SQLITE_IOERR or SQLITE_FULL during rollback or while finalizing
! 833: ** a journal file. (although the in-memory journal implementation may
! 834: ** return SQLITE_IOERR_NOMEM while the journal file is being written). It
! 835: ** is therefore not possible for an in-memory pager to enter the ERROR
! 836: ** state.
! 837: */
! 838: if( MEMDB ){
! 839: assert( p->noSync );
! 840: assert( p->journalMode==PAGER_JOURNALMODE_OFF
! 841: || p->journalMode==PAGER_JOURNALMODE_MEMORY
! 842: );
! 843: assert( p->eState!=PAGER_ERROR && p->eState!=PAGER_OPEN );
! 844: assert( pagerUseWal(p)==0 );
! 845: }
! 846:
! 847: /* If changeCountDone is set, a RESERVED lock or greater must be held
! 848: ** on the file.
! 849: */
! 850: assert( pPager->changeCountDone==0 || pPager->eLock>=RESERVED_LOCK );
! 851: assert( p->eLock!=PENDING_LOCK );
! 852:
! 853: switch( p->eState ){
! 854: case PAGER_OPEN:
! 855: assert( !MEMDB );
! 856: assert( pPager->errCode==SQLITE_OK );
! 857: assert( sqlite3PcacheRefCount(pPager->pPCache)==0 || pPager->tempFile );
! 858: break;
! 859:
! 860: case PAGER_READER:
! 861: assert( pPager->errCode==SQLITE_OK );
! 862: assert( p->eLock!=UNKNOWN_LOCK );
! 863: assert( p->eLock>=SHARED_LOCK || p->noReadlock );
! 864: break;
! 865:
! 866: case PAGER_WRITER_LOCKED:
! 867: assert( p->eLock!=UNKNOWN_LOCK );
! 868: assert( pPager->errCode==SQLITE_OK );
! 869: if( !pagerUseWal(pPager) ){
! 870: assert( p->eLock>=RESERVED_LOCK );
! 871: }
! 872: assert( pPager->dbSize==pPager->dbOrigSize );
! 873: assert( pPager->dbOrigSize==pPager->dbFileSize );
! 874: assert( pPager->dbOrigSize==pPager->dbHintSize );
! 875: assert( pPager->setMaster==0 );
! 876: break;
! 877:
! 878: case PAGER_WRITER_CACHEMOD:
! 879: assert( p->eLock!=UNKNOWN_LOCK );
! 880: assert( pPager->errCode==SQLITE_OK );
! 881: if( !pagerUseWal(pPager) ){
! 882: /* It is possible that if journal_mode=wal here that neither the
! 883: ** journal file nor the WAL file are open. This happens during
! 884: ** a rollback transaction that switches from journal_mode=off
! 885: ** to journal_mode=wal.
! 886: */
! 887: assert( p->eLock>=RESERVED_LOCK );
! 888: assert( isOpen(p->jfd)
! 889: || p->journalMode==PAGER_JOURNALMODE_OFF
! 890: || p->journalMode==PAGER_JOURNALMODE_WAL
! 891: );
! 892: }
! 893: assert( pPager->dbOrigSize==pPager->dbFileSize );
! 894: assert( pPager->dbOrigSize==pPager->dbHintSize );
! 895: break;
! 896:
! 897: case PAGER_WRITER_DBMOD:
! 898: assert( p->eLock==EXCLUSIVE_LOCK );
! 899: assert( pPager->errCode==SQLITE_OK );
! 900: assert( !pagerUseWal(pPager) );
! 901: assert( p->eLock>=EXCLUSIVE_LOCK );
! 902: assert( isOpen(p->jfd)
! 903: || p->journalMode==PAGER_JOURNALMODE_OFF
! 904: || p->journalMode==PAGER_JOURNALMODE_WAL
! 905: );
! 906: assert( pPager->dbOrigSize<=pPager->dbHintSize );
! 907: break;
! 908:
! 909: case PAGER_WRITER_FINISHED:
! 910: assert( p->eLock==EXCLUSIVE_LOCK );
! 911: assert( pPager->errCode==SQLITE_OK );
! 912: assert( !pagerUseWal(pPager) );
! 913: assert( isOpen(p->jfd)
! 914: || p->journalMode==PAGER_JOURNALMODE_OFF
! 915: || p->journalMode==PAGER_JOURNALMODE_WAL
! 916: );
! 917: break;
! 918:
! 919: case PAGER_ERROR:
! 920: /* There must be at least one outstanding reference to the pager if
! 921: ** in ERROR state. Otherwise the pager should have already dropped
! 922: ** back to OPEN state.
! 923: */
! 924: assert( pPager->errCode!=SQLITE_OK );
! 925: assert( sqlite3PcacheRefCount(pPager->pPCache)>0 );
! 926: break;
! 927: }
! 928:
! 929: return 1;
! 930: }
! 931: #endif /* ifndef NDEBUG */
! 932:
! 933: #ifdef SQLITE_DEBUG
! 934: /*
! 935: ** Return a pointer to a human readable string in a static buffer
! 936: ** containing the state of the Pager object passed as an argument. This
! 937: ** is intended to be used within debuggers. For example, as an alternative
! 938: ** to "print *pPager" in gdb:
! 939: **
! 940: ** (gdb) printf "%s", print_pager_state(pPager)
! 941: */
! 942: static char *print_pager_state(Pager *p){
! 943: static char zRet[1024];
! 944:
! 945: sqlite3_snprintf(1024, zRet,
! 946: "Filename: %s\n"
! 947: "State: %s errCode=%d\n"
! 948: "Lock: %s\n"
! 949: "Locking mode: locking_mode=%s\n"
! 950: "Journal mode: journal_mode=%s\n"
! 951: "Backing store: tempFile=%d memDb=%d useJournal=%d\n"
! 952: "Journal: journalOff=%lld journalHdr=%lld\n"
! 953: "Size: dbsize=%d dbOrigSize=%d dbFileSize=%d\n"
! 954: , p->zFilename
! 955: , p->eState==PAGER_OPEN ? "OPEN" :
! 956: p->eState==PAGER_READER ? "READER" :
! 957: p->eState==PAGER_WRITER_LOCKED ? "WRITER_LOCKED" :
! 958: p->eState==PAGER_WRITER_CACHEMOD ? "WRITER_CACHEMOD" :
! 959: p->eState==PAGER_WRITER_DBMOD ? "WRITER_DBMOD" :
! 960: p->eState==PAGER_WRITER_FINISHED ? "WRITER_FINISHED" :
! 961: p->eState==PAGER_ERROR ? "ERROR" : "?error?"
! 962: , (int)p->errCode
! 963: , p->eLock==NO_LOCK ? "NO_LOCK" :
! 964: p->eLock==RESERVED_LOCK ? "RESERVED" :
! 965: p->eLock==EXCLUSIVE_LOCK ? "EXCLUSIVE" :
! 966: p->eLock==SHARED_LOCK ? "SHARED" :
! 967: p->eLock==UNKNOWN_LOCK ? "UNKNOWN" : "?error?"
! 968: , p->exclusiveMode ? "exclusive" : "normal"
! 969: , p->journalMode==PAGER_JOURNALMODE_MEMORY ? "memory" :
! 970: p->journalMode==PAGER_JOURNALMODE_OFF ? "off" :
! 971: p->journalMode==PAGER_JOURNALMODE_DELETE ? "delete" :
! 972: p->journalMode==PAGER_JOURNALMODE_PERSIST ? "persist" :
! 973: p->journalMode==PAGER_JOURNALMODE_TRUNCATE ? "truncate" :
! 974: p->journalMode==PAGER_JOURNALMODE_WAL ? "wal" : "?error?"
! 975: , (int)p->tempFile, (int)p->memDb, (int)p->useJournal
! 976: , p->journalOff, p->journalHdr
! 977: , (int)p->dbSize, (int)p->dbOrigSize, (int)p->dbFileSize
! 978: );
! 979:
! 980: return zRet;
! 981: }
! 982: #endif
! 983:
! 984: /*
! 985: ** Return true if it is necessary to write page *pPg into the sub-journal.
! 986: ** A page needs to be written into the sub-journal if there exists one
! 987: ** or more open savepoints for which:
! 988: **
! 989: ** * The page-number is less than or equal to PagerSavepoint.nOrig, and
! 990: ** * The bit corresponding to the page-number is not set in
! 991: ** PagerSavepoint.pInSavepoint.
! 992: */
! 993: static int subjRequiresPage(PgHdr *pPg){
! 994: Pgno pgno = pPg->pgno;
! 995: Pager *pPager = pPg->pPager;
! 996: int i;
! 997: for(i=0; i<pPager->nSavepoint; i++){
! 998: PagerSavepoint *p = &pPager->aSavepoint[i];
! 999: if( p->nOrig>=pgno && 0==sqlite3BitvecTest(p->pInSavepoint, pgno) ){
! 1000: return 1;
! 1001: }
! 1002: }
! 1003: return 0;
! 1004: }
! 1005:
! 1006: /*
! 1007: ** Return true if the page is already in the journal file.
! 1008: */
! 1009: static int pageInJournal(PgHdr *pPg){
! 1010: return sqlite3BitvecTest(pPg->pPager->pInJournal, pPg->pgno);
! 1011: }
! 1012:
! 1013: /*
! 1014: ** Read a 32-bit integer from the given file descriptor. Store the integer
! 1015: ** that is read in *pRes. Return SQLITE_OK if everything worked, or an
! 1016: ** error code is something goes wrong.
! 1017: **
! 1018: ** All values are stored on disk as big-endian.
! 1019: */
! 1020: static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){
! 1021: unsigned char ac[4];
! 1022: int rc = sqlite3OsRead(fd, ac, sizeof(ac), offset);
! 1023: if( rc==SQLITE_OK ){
! 1024: *pRes = sqlite3Get4byte(ac);
! 1025: }
! 1026: return rc;
! 1027: }
! 1028:
! 1029: /*
! 1030: ** Write a 32-bit integer into a string buffer in big-endian byte order.
! 1031: */
! 1032: #define put32bits(A,B) sqlite3Put4byte((u8*)A,B)
! 1033:
! 1034:
! 1035: /*
! 1036: ** Write a 32-bit integer into the given file descriptor. Return SQLITE_OK
! 1037: ** on success or an error code is something goes wrong.
! 1038: */
! 1039: static int write32bits(sqlite3_file *fd, i64 offset, u32 val){
! 1040: char ac[4];
! 1041: put32bits(ac, val);
! 1042: return sqlite3OsWrite(fd, ac, 4, offset);
! 1043: }
! 1044:
! 1045: /*
! 1046: ** Unlock the database file to level eLock, which must be either NO_LOCK
! 1047: ** or SHARED_LOCK. Regardless of whether or not the call to xUnlock()
! 1048: ** succeeds, set the Pager.eLock variable to match the (attempted) new lock.
! 1049: **
! 1050: ** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is
! 1051: ** called, do not modify it. See the comment above the #define of
! 1052: ** UNKNOWN_LOCK for an explanation of this.
! 1053: */
! 1054: static int pagerUnlockDb(Pager *pPager, int eLock){
! 1055: int rc = SQLITE_OK;
! 1056:
! 1057: assert( !pPager->exclusiveMode || pPager->eLock==eLock );
! 1058: assert( eLock==NO_LOCK || eLock==SHARED_LOCK );
! 1059: assert( eLock!=NO_LOCK || pagerUseWal(pPager)==0 );
! 1060: if( isOpen(pPager->fd) ){
! 1061: assert( pPager->eLock>=eLock );
! 1062: rc = sqlite3OsUnlock(pPager->fd, eLock);
! 1063: if( pPager->eLock!=UNKNOWN_LOCK ){
! 1064: pPager->eLock = (u8)eLock;
! 1065: }
! 1066: IOTRACE(("UNLOCK %p %d\n", pPager, eLock))
! 1067: }
! 1068: return rc;
! 1069: }
! 1070:
! 1071: /*
! 1072: ** Lock the database file to level eLock, which must be either SHARED_LOCK,
! 1073: ** RESERVED_LOCK or EXCLUSIVE_LOCK. If the caller is successful, set the
! 1074: ** Pager.eLock variable to the new locking state.
! 1075: **
! 1076: ** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is
! 1077: ** called, do not modify it unless the new locking state is EXCLUSIVE_LOCK.
! 1078: ** See the comment above the #define of UNKNOWN_LOCK for an explanation
! 1079: ** of this.
! 1080: */
! 1081: static int pagerLockDb(Pager *pPager, int eLock){
! 1082: int rc = SQLITE_OK;
! 1083:
! 1084: assert( eLock==SHARED_LOCK || eLock==RESERVED_LOCK || eLock==EXCLUSIVE_LOCK );
! 1085: if( pPager->eLock<eLock || pPager->eLock==UNKNOWN_LOCK ){
! 1086: rc = sqlite3OsLock(pPager->fd, eLock);
! 1087: if( rc==SQLITE_OK && (pPager->eLock!=UNKNOWN_LOCK||eLock==EXCLUSIVE_LOCK) ){
! 1088: pPager->eLock = (u8)eLock;
! 1089: IOTRACE(("LOCK %p %d\n", pPager, eLock))
! 1090: }
! 1091: }
! 1092: return rc;
! 1093: }
! 1094:
! 1095: /*
! 1096: ** This function determines whether or not the atomic-write optimization
! 1097: ** can be used with this pager. The optimization can be used if:
! 1098: **
! 1099: ** (a) the value returned by OsDeviceCharacteristics() indicates that
! 1100: ** a database page may be written atomically, and
! 1101: ** (b) the value returned by OsSectorSize() is less than or equal
! 1102: ** to the page size.
! 1103: **
! 1104: ** The optimization is also always enabled for temporary files. It is
! 1105: ** an error to call this function if pPager is opened on an in-memory
! 1106: ** database.
! 1107: **
! 1108: ** If the optimization cannot be used, 0 is returned. If it can be used,
! 1109: ** then the value returned is the size of the journal file when it
! 1110: ** contains rollback data for exactly one page.
! 1111: */
! 1112: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
! 1113: static int jrnlBufferSize(Pager *pPager){
! 1114: assert( !MEMDB );
! 1115: if( !pPager->tempFile ){
! 1116: int dc; /* Device characteristics */
! 1117: int nSector; /* Sector size */
! 1118: int szPage; /* Page size */
! 1119:
! 1120: assert( isOpen(pPager->fd) );
! 1121: dc = sqlite3OsDeviceCharacteristics(pPager->fd);
! 1122: nSector = pPager->sectorSize;
! 1123: szPage = pPager->pageSize;
! 1124:
! 1125: assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
! 1126: assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
! 1127: if( 0==(dc&(SQLITE_IOCAP_ATOMIC|(szPage>>8)) || nSector>szPage) ){
! 1128: return 0;
! 1129: }
! 1130: }
! 1131:
! 1132: return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager);
! 1133: }
! 1134: #endif
! 1135:
! 1136: /*
! 1137: ** If SQLITE_CHECK_PAGES is defined then we do some sanity checking
! 1138: ** on the cache using a hash function. This is used for testing
! 1139: ** and debugging only.
! 1140: */
! 1141: #ifdef SQLITE_CHECK_PAGES
! 1142: /*
! 1143: ** Return a 32-bit hash of the page data for pPage.
! 1144: */
! 1145: static u32 pager_datahash(int nByte, unsigned char *pData){
! 1146: u32 hash = 0;
! 1147: int i;
! 1148: for(i=0; i<nByte; i++){
! 1149: hash = (hash*1039) + pData[i];
! 1150: }
! 1151: return hash;
! 1152: }
! 1153: static u32 pager_pagehash(PgHdr *pPage){
! 1154: return pager_datahash(pPage->pPager->pageSize, (unsigned char *)pPage->pData);
! 1155: }
! 1156: static void pager_set_pagehash(PgHdr *pPage){
! 1157: pPage->pageHash = pager_pagehash(pPage);
! 1158: }
! 1159:
! 1160: /*
! 1161: ** The CHECK_PAGE macro takes a PgHdr* as an argument. If SQLITE_CHECK_PAGES
! 1162: ** is defined, and NDEBUG is not defined, an assert() statement checks
! 1163: ** that the page is either dirty or still matches the calculated page-hash.
! 1164: */
! 1165: #define CHECK_PAGE(x) checkPage(x)
! 1166: static void checkPage(PgHdr *pPg){
! 1167: Pager *pPager = pPg->pPager;
! 1168: assert( pPager->eState!=PAGER_ERROR );
! 1169: assert( (pPg->flags&PGHDR_DIRTY) || pPg->pageHash==pager_pagehash(pPg) );
! 1170: }
! 1171:
! 1172: #else
! 1173: #define pager_datahash(X,Y) 0
! 1174: #define pager_pagehash(X) 0
! 1175: #define pager_set_pagehash(X)
! 1176: #define CHECK_PAGE(x)
! 1177: #endif /* SQLITE_CHECK_PAGES */
! 1178:
! 1179: /*
! 1180: ** When this is called the journal file for pager pPager must be open.
! 1181: ** This function attempts to read a master journal file name from the
! 1182: ** end of the file and, if successful, copies it into memory supplied
! 1183: ** by the caller. See comments above writeMasterJournal() for the format
! 1184: ** used to store a master journal file name at the end of a journal file.
! 1185: **
! 1186: ** zMaster must point to a buffer of at least nMaster bytes allocated by
! 1187: ** the caller. This should be sqlite3_vfs.mxPathname+1 (to ensure there is
! 1188: ** enough space to write the master journal name). If the master journal
! 1189: ** name in the journal is longer than nMaster bytes (including a
! 1190: ** nul-terminator), then this is handled as if no master journal name
! 1191: ** were present in the journal.
! 1192: **
! 1193: ** If a master journal file name is present at the end of the journal
! 1194: ** file, then it is copied into the buffer pointed to by zMaster. A
! 1195: ** nul-terminator byte is appended to the buffer following the master
! 1196: ** journal file name.
! 1197: **
! 1198: ** If it is determined that no master journal file name is present
! 1199: ** zMaster[0] is set to 0 and SQLITE_OK returned.
! 1200: **
! 1201: ** If an error occurs while reading from the journal file, an SQLite
! 1202: ** error code is returned.
! 1203: */
! 1204: static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){
! 1205: int rc; /* Return code */
! 1206: u32 len; /* Length in bytes of master journal name */
! 1207: i64 szJ; /* Total size in bytes of journal file pJrnl */
! 1208: u32 cksum; /* MJ checksum value read from journal */
! 1209: u32 u; /* Unsigned loop counter */
! 1210: unsigned char aMagic[8]; /* A buffer to hold the magic header */
! 1211: zMaster[0] = '\0';
! 1212:
! 1213: if( SQLITE_OK!=(rc = sqlite3OsFileSize(pJrnl, &szJ))
! 1214: || szJ<16
! 1215: || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len))
! 1216: || len>=nMaster
! 1217: || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum))
! 1218: || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8))
! 1219: || memcmp(aMagic, aJournalMagic, 8)
! 1220: || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, zMaster, len, szJ-16-len))
! 1221: ){
! 1222: return rc;
! 1223: }
! 1224:
! 1225: /* See if the checksum matches the master journal name */
! 1226: for(u=0; u<len; u++){
! 1227: cksum -= zMaster[u];
! 1228: }
! 1229: if( cksum ){
! 1230: /* If the checksum doesn't add up, then one or more of the disk sectors
! 1231: ** containing the master journal filename is corrupted. This means
! 1232: ** definitely roll back, so just return SQLITE_OK and report a (nul)
! 1233: ** master-journal filename.
! 1234: */
! 1235: len = 0;
! 1236: }
! 1237: zMaster[len] = '\0';
! 1238:
! 1239: return SQLITE_OK;
! 1240: }
! 1241:
! 1242: /*
! 1243: ** Return the offset of the sector boundary at or immediately
! 1244: ** following the value in pPager->journalOff, assuming a sector
! 1245: ** size of pPager->sectorSize bytes.
! 1246: **
! 1247: ** i.e for a sector size of 512:
! 1248: **
! 1249: ** Pager.journalOff Return value
! 1250: ** ---------------------------------------
! 1251: ** 0 0
! 1252: ** 512 512
! 1253: ** 100 512
! 1254: ** 2000 2048
! 1255: **
! 1256: */
! 1257: static i64 journalHdrOffset(Pager *pPager){
! 1258: i64 offset = 0;
! 1259: i64 c = pPager->journalOff;
! 1260: if( c ){
! 1261: offset = ((c-1)/JOURNAL_HDR_SZ(pPager) + 1) * JOURNAL_HDR_SZ(pPager);
! 1262: }
! 1263: assert( offset%JOURNAL_HDR_SZ(pPager)==0 );
! 1264: assert( offset>=c );
! 1265: assert( (offset-c)<JOURNAL_HDR_SZ(pPager) );
! 1266: return offset;
! 1267: }
! 1268:
! 1269: /*
! 1270: ** The journal file must be open when this function is called.
! 1271: **
! 1272: ** This function is a no-op if the journal file has not been written to
! 1273: ** within the current transaction (i.e. if Pager.journalOff==0).
! 1274: **
! 1275: ** If doTruncate is non-zero or the Pager.journalSizeLimit variable is
! 1276: ** set to 0, then truncate the journal file to zero bytes in size. Otherwise,
! 1277: ** zero the 28-byte header at the start of the journal file. In either case,
! 1278: ** if the pager is not in no-sync mode, sync the journal file immediately
! 1279: ** after writing or truncating it.
! 1280: **
! 1281: ** If Pager.journalSizeLimit is set to a positive, non-zero value, and
! 1282: ** following the truncation or zeroing described above the size of the
! 1283: ** journal file in bytes is larger than this value, then truncate the
! 1284: ** journal file to Pager.journalSizeLimit bytes. The journal file does
! 1285: ** not need to be synced following this operation.
! 1286: **
! 1287: ** If an IO error occurs, abandon processing and return the IO error code.
! 1288: ** Otherwise, return SQLITE_OK.
! 1289: */
! 1290: static int zeroJournalHdr(Pager *pPager, int doTruncate){
! 1291: int rc = SQLITE_OK; /* Return code */
! 1292: assert( isOpen(pPager->jfd) );
! 1293: if( pPager->journalOff ){
! 1294: const i64 iLimit = pPager->journalSizeLimit; /* Local cache of jsl */
! 1295:
! 1296: IOTRACE(("JZEROHDR %p\n", pPager))
! 1297: if( doTruncate || iLimit==0 ){
! 1298: rc = sqlite3OsTruncate(pPager->jfd, 0);
! 1299: }else{
! 1300: static const char zeroHdr[28] = {0};
! 1301: rc = sqlite3OsWrite(pPager->jfd, zeroHdr, sizeof(zeroHdr), 0);
! 1302: }
! 1303: if( rc==SQLITE_OK && !pPager->noSync ){
! 1304: rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_DATAONLY|pPager->syncFlags);
! 1305: }
! 1306:
! 1307: /* At this point the transaction is committed but the write lock
! 1308: ** is still held on the file. If there is a size limit configured for
! 1309: ** the persistent journal and the journal file currently consumes more
! 1310: ** space than that limit allows for, truncate it now. There is no need
! 1311: ** to sync the file following this operation.
! 1312: */
! 1313: if( rc==SQLITE_OK && iLimit>0 ){
! 1314: i64 sz;
! 1315: rc = sqlite3OsFileSize(pPager->jfd, &sz);
! 1316: if( rc==SQLITE_OK && sz>iLimit ){
! 1317: rc = sqlite3OsTruncate(pPager->jfd, iLimit);
! 1318: }
! 1319: }
! 1320: }
! 1321: return rc;
! 1322: }
! 1323:
! 1324: /*
! 1325: ** The journal file must be open when this routine is called. A journal
! 1326: ** header (JOURNAL_HDR_SZ bytes) is written into the journal file at the
! 1327: ** current location.
! 1328: **
! 1329: ** The format for the journal header is as follows:
! 1330: ** - 8 bytes: Magic identifying journal format.
! 1331: ** - 4 bytes: Number of records in journal, or -1 no-sync mode is on.
! 1332: ** - 4 bytes: Random number used for page hash.
! 1333: ** - 4 bytes: Initial database page count.
! 1334: ** - 4 bytes: Sector size used by the process that wrote this journal.
! 1335: ** - 4 bytes: Database page size.
! 1336: **
! 1337: ** Followed by (JOURNAL_HDR_SZ - 28) bytes of unused space.
! 1338: */
! 1339: static int writeJournalHdr(Pager *pPager){
! 1340: int rc = SQLITE_OK; /* Return code */
! 1341: char *zHeader = pPager->pTmpSpace; /* Temporary space used to build header */
! 1342: u32 nHeader = (u32)pPager->pageSize;/* Size of buffer pointed to by zHeader */
! 1343: u32 nWrite; /* Bytes of header sector written */
! 1344: int ii; /* Loop counter */
! 1345:
! 1346: assert( isOpen(pPager->jfd) ); /* Journal file must be open. */
! 1347:
! 1348: if( nHeader>JOURNAL_HDR_SZ(pPager) ){
! 1349: nHeader = JOURNAL_HDR_SZ(pPager);
! 1350: }
! 1351:
! 1352: /* If there are active savepoints and any of them were created
! 1353: ** since the most recent journal header was written, update the
! 1354: ** PagerSavepoint.iHdrOffset fields now.
! 1355: */
! 1356: for(ii=0; ii<pPager->nSavepoint; ii++){
! 1357: if( pPager->aSavepoint[ii].iHdrOffset==0 ){
! 1358: pPager->aSavepoint[ii].iHdrOffset = pPager->journalOff;
! 1359: }
! 1360: }
! 1361:
! 1362: pPager->journalHdr = pPager->journalOff = journalHdrOffset(pPager);
! 1363:
! 1364: /*
! 1365: ** Write the nRec Field - the number of page records that follow this
! 1366: ** journal header. Normally, zero is written to this value at this time.
! 1367: ** After the records are added to the journal (and the journal synced,
! 1368: ** if in full-sync mode), the zero is overwritten with the true number
! 1369: ** of records (see syncJournal()).
! 1370: **
! 1371: ** A faster alternative is to write 0xFFFFFFFF to the nRec field. When
! 1372: ** reading the journal this value tells SQLite to assume that the
! 1373: ** rest of the journal file contains valid page records. This assumption
! 1374: ** is dangerous, as if a failure occurred whilst writing to the journal
! 1375: ** file it may contain some garbage data. There are two scenarios
! 1376: ** where this risk can be ignored:
! 1377: **
! 1378: ** * When the pager is in no-sync mode. Corruption can follow a
! 1379: ** power failure in this case anyway.
! 1380: **
! 1381: ** * When the SQLITE_IOCAP_SAFE_APPEND flag is set. This guarantees
! 1382: ** that garbage data is never appended to the journal file.
! 1383: */
! 1384: assert( isOpen(pPager->fd) || pPager->noSync );
! 1385: if( pPager->noSync || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY)
! 1386: || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND)
! 1387: ){
! 1388: memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic));
! 1389: put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff);
! 1390: }else{
! 1391: memset(zHeader, 0, sizeof(aJournalMagic)+4);
! 1392: }
! 1393:
! 1394: /* The random check-hash initialiser */
! 1395: sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit);
! 1396: put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit);
! 1397: /* The initial database size */
! 1398: put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize);
! 1399: /* The assumed sector size for this process */
! 1400: put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize);
! 1401:
! 1402: /* The page size */
! 1403: put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize);
! 1404:
! 1405: /* Initializing the tail of the buffer is not necessary. Everything
! 1406: ** works find if the following memset() is omitted. But initializing
! 1407: ** the memory prevents valgrind from complaining, so we are willing to
! 1408: ** take the performance hit.
! 1409: */
! 1410: memset(&zHeader[sizeof(aJournalMagic)+20], 0,
! 1411: nHeader-(sizeof(aJournalMagic)+20));
! 1412:
! 1413: /* In theory, it is only necessary to write the 28 bytes that the
! 1414: ** journal header consumes to the journal file here. Then increment the
! 1415: ** Pager.journalOff variable by JOURNAL_HDR_SZ so that the next
! 1416: ** record is written to the following sector (leaving a gap in the file
! 1417: ** that will be implicitly filled in by the OS).
! 1418: **
! 1419: ** However it has been discovered that on some systems this pattern can
! 1420: ** be significantly slower than contiguously writing data to the file,
! 1421: ** even if that means explicitly writing data to the block of
! 1422: ** (JOURNAL_HDR_SZ - 28) bytes that will not be used. So that is what
! 1423: ** is done.
! 1424: **
! 1425: ** The loop is required here in case the sector-size is larger than the
! 1426: ** database page size. Since the zHeader buffer is only Pager.pageSize
! 1427: ** bytes in size, more than one call to sqlite3OsWrite() may be required
! 1428: ** to populate the entire journal header sector.
! 1429: */
! 1430: for(nWrite=0; rc==SQLITE_OK&&nWrite<JOURNAL_HDR_SZ(pPager); nWrite+=nHeader){
! 1431: IOTRACE(("JHDR %p %lld %d\n", pPager, pPager->journalHdr, nHeader))
! 1432: rc = sqlite3OsWrite(pPager->jfd, zHeader, nHeader, pPager->journalOff);
! 1433: assert( pPager->journalHdr <= pPager->journalOff );
! 1434: pPager->journalOff += nHeader;
! 1435: }
! 1436:
! 1437: return rc;
! 1438: }
! 1439:
! 1440: /*
! 1441: ** The journal file must be open when this is called. A journal header file
! 1442: ** (JOURNAL_HDR_SZ bytes) is read from the current location in the journal
! 1443: ** file. The current location in the journal file is given by
! 1444: ** pPager->journalOff. See comments above function writeJournalHdr() for
! 1445: ** a description of the journal header format.
! 1446: **
! 1447: ** If the header is read successfully, *pNRec is set to the number of
! 1448: ** page records following this header and *pDbSize is set to the size of the
! 1449: ** database before the transaction began, in pages. Also, pPager->cksumInit
! 1450: ** is set to the value read from the journal header. SQLITE_OK is returned
! 1451: ** in this case.
! 1452: **
! 1453: ** If the journal header file appears to be corrupted, SQLITE_DONE is
! 1454: ** returned and *pNRec and *PDbSize are undefined. If JOURNAL_HDR_SZ bytes
! 1455: ** cannot be read from the journal file an error code is returned.
! 1456: */
! 1457: static int readJournalHdr(
! 1458: Pager *pPager, /* Pager object */
! 1459: int isHot,
! 1460: i64 journalSize, /* Size of the open journal file in bytes */
! 1461: u32 *pNRec, /* OUT: Value read from the nRec field */
! 1462: u32 *pDbSize /* OUT: Value of original database size field */
! 1463: ){
! 1464: int rc; /* Return code */
! 1465: unsigned char aMagic[8]; /* A buffer to hold the magic header */
! 1466: i64 iHdrOff; /* Offset of journal header being read */
! 1467:
! 1468: assert( isOpen(pPager->jfd) ); /* Journal file must be open. */
! 1469:
! 1470: /* Advance Pager.journalOff to the start of the next sector. If the
! 1471: ** journal file is too small for there to be a header stored at this
! 1472: ** point, return SQLITE_DONE.
! 1473: */
! 1474: pPager->journalOff = journalHdrOffset(pPager);
! 1475: if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){
! 1476: return SQLITE_DONE;
! 1477: }
! 1478: iHdrOff = pPager->journalOff;
! 1479:
! 1480: /* Read in the first 8 bytes of the journal header. If they do not match
! 1481: ** the magic string found at the start of each journal header, return
! 1482: ** SQLITE_DONE. If an IO error occurs, return an error code. Otherwise,
! 1483: ** proceed.
! 1484: */
! 1485: if( isHot || iHdrOff!=pPager->journalHdr ){
! 1486: rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), iHdrOff);
! 1487: if( rc ){
! 1488: return rc;
! 1489: }
! 1490: if( memcmp(aMagic, aJournalMagic, sizeof(aMagic))!=0 ){
! 1491: return SQLITE_DONE;
! 1492: }
! 1493: }
! 1494:
! 1495: /* Read the first three 32-bit fields of the journal header: The nRec
! 1496: ** field, the checksum-initializer and the database size at the start
! 1497: ** of the transaction. Return an error code if anything goes wrong.
! 1498: */
! 1499: if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+8, pNRec))
! 1500: || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+12, &pPager->cksumInit))
! 1501: || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+16, pDbSize))
! 1502: ){
! 1503: return rc;
! 1504: }
! 1505:
! 1506: if( pPager->journalOff==0 ){
! 1507: u32 iPageSize; /* Page-size field of journal header */
! 1508: u32 iSectorSize; /* Sector-size field of journal header */
! 1509:
! 1510: /* Read the page-size and sector-size journal header fields. */
! 1511: if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+20, &iSectorSize))
! 1512: || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+24, &iPageSize))
! 1513: ){
! 1514: return rc;
! 1515: }
! 1516:
! 1517: /* Versions of SQLite prior to 3.5.8 set the page-size field of the
! 1518: ** journal header to zero. In this case, assume that the Pager.pageSize
! 1519: ** variable is already set to the correct page size.
! 1520: */
! 1521: if( iPageSize==0 ){
! 1522: iPageSize = pPager->pageSize;
! 1523: }
! 1524:
! 1525: /* Check that the values read from the page-size and sector-size fields
! 1526: ** are within range. To be 'in range', both values need to be a power
! 1527: ** of two greater than or equal to 512 or 32, and not greater than their
! 1528: ** respective compile time maximum limits.
! 1529: */
! 1530: if( iPageSize<512 || iSectorSize<32
! 1531: || iPageSize>SQLITE_MAX_PAGE_SIZE || iSectorSize>MAX_SECTOR_SIZE
! 1532: || ((iPageSize-1)&iPageSize)!=0 || ((iSectorSize-1)&iSectorSize)!=0
! 1533: ){
! 1534: /* If the either the page-size or sector-size in the journal-header is
! 1535: ** invalid, then the process that wrote the journal-header must have
! 1536: ** crashed before the header was synced. In this case stop reading
! 1537: ** the journal file here.
! 1538: */
! 1539: return SQLITE_DONE;
! 1540: }
! 1541:
! 1542: /* Update the page-size to match the value read from the journal.
! 1543: ** Use a testcase() macro to make sure that malloc failure within
! 1544: ** PagerSetPagesize() is tested.
! 1545: */
! 1546: rc = sqlite3PagerSetPagesize(pPager, &iPageSize, -1);
! 1547: testcase( rc!=SQLITE_OK );
! 1548:
! 1549: /* Update the assumed sector-size to match the value used by
! 1550: ** the process that created this journal. If this journal was
! 1551: ** created by a process other than this one, then this routine
! 1552: ** is being called from within pager_playback(). The local value
! 1553: ** of Pager.sectorSize is restored at the end of that routine.
! 1554: */
! 1555: pPager->sectorSize = iSectorSize;
! 1556: }
! 1557:
! 1558: pPager->journalOff += JOURNAL_HDR_SZ(pPager);
! 1559: return rc;
! 1560: }
! 1561:
! 1562:
! 1563: /*
! 1564: ** Write the supplied master journal name into the journal file for pager
! 1565: ** pPager at the current location. The master journal name must be the last
! 1566: ** thing written to a journal file. If the pager is in full-sync mode, the
! 1567: ** journal file descriptor is advanced to the next sector boundary before
! 1568: ** anything is written. The format is:
! 1569: **
! 1570: ** + 4 bytes: PAGER_MJ_PGNO.
! 1571: ** + N bytes: Master journal filename in utf-8.
! 1572: ** + 4 bytes: N (length of master journal name in bytes, no nul-terminator).
! 1573: ** + 4 bytes: Master journal name checksum.
! 1574: ** + 8 bytes: aJournalMagic[].
! 1575: **
! 1576: ** The master journal page checksum is the sum of the bytes in the master
! 1577: ** journal name, where each byte is interpreted as a signed 8-bit integer.
! 1578: **
! 1579: ** If zMaster is a NULL pointer (occurs for a single database transaction),
! 1580: ** this call is a no-op.
! 1581: */
! 1582: static int writeMasterJournal(Pager *pPager, const char *zMaster){
! 1583: int rc; /* Return code */
! 1584: int nMaster; /* Length of string zMaster */
! 1585: i64 iHdrOff; /* Offset of header in journal file */
! 1586: i64 jrnlSize; /* Size of journal file on disk */
! 1587: u32 cksum = 0; /* Checksum of string zMaster */
! 1588:
! 1589: assert( pPager->setMaster==0 );
! 1590: assert( !pagerUseWal(pPager) );
! 1591:
! 1592: if( !zMaster
! 1593: || pPager->journalMode==PAGER_JOURNALMODE_MEMORY
! 1594: || pPager->journalMode==PAGER_JOURNALMODE_OFF
! 1595: ){
! 1596: return SQLITE_OK;
! 1597: }
! 1598: pPager->setMaster = 1;
! 1599: assert( isOpen(pPager->jfd) );
! 1600: assert( pPager->journalHdr <= pPager->journalOff );
! 1601:
! 1602: /* Calculate the length in bytes and the checksum of zMaster */
! 1603: for(nMaster=0; zMaster[nMaster]; nMaster++){
! 1604: cksum += zMaster[nMaster];
! 1605: }
! 1606:
! 1607: /* If in full-sync mode, advance to the next disk sector before writing
! 1608: ** the master journal name. This is in case the previous page written to
! 1609: ** the journal has already been synced.
! 1610: */
! 1611: if( pPager->fullSync ){
! 1612: pPager->journalOff = journalHdrOffset(pPager);
! 1613: }
! 1614: iHdrOff = pPager->journalOff;
! 1615:
! 1616: /* Write the master journal data to the end of the journal file. If
! 1617: ** an error occurs, return the error code to the caller.
! 1618: */
! 1619: if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_MJ_PGNO(pPager))))
! 1620: || (0 != (rc = sqlite3OsWrite(pPager->jfd, zMaster, nMaster, iHdrOff+4)))
! 1621: || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster, nMaster)))
! 1622: || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster+4, cksum)))
! 1623: || (0 != (rc = sqlite3OsWrite(pPager->jfd, aJournalMagic, 8, iHdrOff+4+nMaster+8)))
! 1624: ){
! 1625: return rc;
! 1626: }
! 1627: pPager->journalOff += (nMaster+20);
! 1628:
! 1629: /* If the pager is in peristent-journal mode, then the physical
! 1630: ** journal-file may extend past the end of the master-journal name
! 1631: ** and 8 bytes of magic data just written to the file. This is
! 1632: ** dangerous because the code to rollback a hot-journal file
! 1633: ** will not be able to find the master-journal name to determine
! 1634: ** whether or not the journal is hot.
! 1635: **
! 1636: ** Easiest thing to do in this scenario is to truncate the journal
! 1637: ** file to the required size.
! 1638: */
! 1639: if( SQLITE_OK==(rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize))
! 1640: && jrnlSize>pPager->journalOff
! 1641: ){
! 1642: rc = sqlite3OsTruncate(pPager->jfd, pPager->journalOff);
! 1643: }
! 1644: return rc;
! 1645: }
! 1646:
! 1647: /*
! 1648: ** Find a page in the hash table given its page number. Return
! 1649: ** a pointer to the page or NULL if the requested page is not
! 1650: ** already in memory.
! 1651: */
! 1652: static PgHdr *pager_lookup(Pager *pPager, Pgno pgno){
! 1653: PgHdr *p; /* Return value */
! 1654:
! 1655: /* It is not possible for a call to PcacheFetch() with createFlag==0 to
! 1656: ** fail, since no attempt to allocate dynamic memory will be made.
! 1657: */
! 1658: (void)sqlite3PcacheFetch(pPager->pPCache, pgno, 0, &p);
! 1659: return p;
! 1660: }
! 1661:
! 1662: /*
! 1663: ** Discard the entire contents of the in-memory page-cache.
! 1664: */
! 1665: static void pager_reset(Pager *pPager){
! 1666: sqlite3BackupRestart(pPager->pBackup);
! 1667: sqlite3PcacheClear(pPager->pPCache);
! 1668: }
! 1669:
! 1670: /*
! 1671: ** Free all structures in the Pager.aSavepoint[] array and set both
! 1672: ** Pager.aSavepoint and Pager.nSavepoint to zero. Close the sub-journal
! 1673: ** if it is open and the pager is not in exclusive mode.
! 1674: */
! 1675: static void releaseAllSavepoints(Pager *pPager){
! 1676: int ii; /* Iterator for looping through Pager.aSavepoint */
! 1677: for(ii=0; ii<pPager->nSavepoint; ii++){
! 1678: sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint);
! 1679: }
! 1680: if( !pPager->exclusiveMode || sqlite3IsMemJournal(pPager->sjfd) ){
! 1681: sqlite3OsClose(pPager->sjfd);
! 1682: }
! 1683: sqlite3_free(pPager->aSavepoint);
! 1684: pPager->aSavepoint = 0;
! 1685: pPager->nSavepoint = 0;
! 1686: pPager->nSubRec = 0;
! 1687: }
! 1688:
! 1689: /*
! 1690: ** Set the bit number pgno in the PagerSavepoint.pInSavepoint
! 1691: ** bitvecs of all open savepoints. Return SQLITE_OK if successful
! 1692: ** or SQLITE_NOMEM if a malloc failure occurs.
! 1693: */
! 1694: static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){
! 1695: int ii; /* Loop counter */
! 1696: int rc = SQLITE_OK; /* Result code */
! 1697:
! 1698: for(ii=0; ii<pPager->nSavepoint; ii++){
! 1699: PagerSavepoint *p = &pPager->aSavepoint[ii];
! 1700: if( pgno<=p->nOrig ){
! 1701: rc |= sqlite3BitvecSet(p->pInSavepoint, pgno);
! 1702: testcase( rc==SQLITE_NOMEM );
! 1703: assert( rc==SQLITE_OK || rc==SQLITE_NOMEM );
! 1704: }
! 1705: }
! 1706: return rc;
! 1707: }
! 1708:
! 1709: /*
! 1710: ** This function is a no-op if the pager is in exclusive mode and not
! 1711: ** in the ERROR state. Otherwise, it switches the pager to PAGER_OPEN
! 1712: ** state.
! 1713: **
! 1714: ** If the pager is not in exclusive-access mode, the database file is
! 1715: ** completely unlocked. If the file is unlocked and the file-system does
! 1716: ** not exhibit the UNDELETABLE_WHEN_OPEN property, the journal file is
! 1717: ** closed (if it is open).
! 1718: **
! 1719: ** If the pager is in ERROR state when this function is called, the
! 1720: ** contents of the pager cache are discarded before switching back to
! 1721: ** the OPEN state. Regardless of whether the pager is in exclusive-mode
! 1722: ** or not, any journal file left in the file-system will be treated
! 1723: ** as a hot-journal and rolled back the next time a read-transaction
! 1724: ** is opened (by this or by any other connection).
! 1725: */
! 1726: static void pager_unlock(Pager *pPager){
! 1727:
! 1728: assert( pPager->eState==PAGER_READER
! 1729: || pPager->eState==PAGER_OPEN
! 1730: || pPager->eState==PAGER_ERROR
! 1731: );
! 1732:
! 1733: sqlite3BitvecDestroy(pPager->pInJournal);
! 1734: pPager->pInJournal = 0;
! 1735: releaseAllSavepoints(pPager);
! 1736:
! 1737: if( pagerUseWal(pPager) ){
! 1738: assert( !isOpen(pPager->jfd) );
! 1739: sqlite3WalEndReadTransaction(pPager->pWal);
! 1740: pPager->eState = PAGER_OPEN;
! 1741: }else if( !pPager->exclusiveMode ){
! 1742: int rc; /* Error code returned by pagerUnlockDb() */
! 1743: int iDc = isOpen(pPager->fd)?sqlite3OsDeviceCharacteristics(pPager->fd):0;
! 1744:
! 1745: /* If the operating system support deletion of open files, then
! 1746: ** close the journal file when dropping the database lock. Otherwise
! 1747: ** another connection with journal_mode=delete might delete the file
! 1748: ** out from under us.
! 1749: */
! 1750: assert( (PAGER_JOURNALMODE_MEMORY & 5)!=1 );
! 1751: assert( (PAGER_JOURNALMODE_OFF & 5)!=1 );
! 1752: assert( (PAGER_JOURNALMODE_WAL & 5)!=1 );
! 1753: assert( (PAGER_JOURNALMODE_DELETE & 5)!=1 );
! 1754: assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 );
! 1755: assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 );
! 1756: if( 0==(iDc & SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN)
! 1757: || 1!=(pPager->journalMode & 5)
! 1758: ){
! 1759: sqlite3OsClose(pPager->jfd);
! 1760: }
! 1761:
! 1762: /* If the pager is in the ERROR state and the call to unlock the database
! 1763: ** file fails, set the current lock to UNKNOWN_LOCK. See the comment
! 1764: ** above the #define for UNKNOWN_LOCK for an explanation of why this
! 1765: ** is necessary.
! 1766: */
! 1767: rc = pagerUnlockDb(pPager, NO_LOCK);
! 1768: if( rc!=SQLITE_OK && pPager->eState==PAGER_ERROR ){
! 1769: pPager->eLock = UNKNOWN_LOCK;
! 1770: }
! 1771:
! 1772: /* The pager state may be changed from PAGER_ERROR to PAGER_OPEN here
! 1773: ** without clearing the error code. This is intentional - the error
! 1774: ** code is cleared and the cache reset in the block below.
! 1775: */
! 1776: assert( pPager->errCode || pPager->eState!=PAGER_ERROR );
! 1777: pPager->changeCountDone = 0;
! 1778: pPager->eState = PAGER_OPEN;
! 1779: }
! 1780:
! 1781: /* If Pager.errCode is set, the contents of the pager cache cannot be
! 1782: ** trusted. Now that there are no outstanding references to the pager,
! 1783: ** it can safely move back to PAGER_OPEN state. This happens in both
! 1784: ** normal and exclusive-locking mode.
! 1785: */
! 1786: if( pPager->errCode ){
! 1787: assert( !MEMDB );
! 1788: pager_reset(pPager);
! 1789: pPager->changeCountDone = pPager->tempFile;
! 1790: pPager->eState = PAGER_OPEN;
! 1791: pPager->errCode = SQLITE_OK;
! 1792: }
! 1793:
! 1794: pPager->journalOff = 0;
! 1795: pPager->journalHdr = 0;
! 1796: pPager->setMaster = 0;
! 1797: }
! 1798:
! 1799: /*
! 1800: ** This function is called whenever an IOERR or FULL error that requires
! 1801: ** the pager to transition into the ERROR state may ahve occurred.
! 1802: ** The first argument is a pointer to the pager structure, the second
! 1803: ** the error-code about to be returned by a pager API function. The
! 1804: ** value returned is a copy of the second argument to this function.
! 1805: **
! 1806: ** If the second argument is SQLITE_FULL, SQLITE_IOERR or one of the
! 1807: ** IOERR sub-codes, the pager enters the ERROR state and the error code
! 1808: ** is stored in Pager.errCode. While the pager remains in the ERROR state,
! 1809: ** all major API calls on the Pager will immediately return Pager.errCode.
! 1810: **
! 1811: ** The ERROR state indicates that the contents of the pager-cache
! 1812: ** cannot be trusted. This state can be cleared by completely discarding
! 1813: ** the contents of the pager-cache. If a transaction was active when
! 1814: ** the persistent error occurred, then the rollback journal may need
! 1815: ** to be replayed to restore the contents of the database file (as if
! 1816: ** it were a hot-journal).
! 1817: */
! 1818: static int pager_error(Pager *pPager, int rc){
! 1819: int rc2 = rc & 0xff;
! 1820: assert( rc==SQLITE_OK || !MEMDB );
! 1821: assert(
! 1822: pPager->errCode==SQLITE_FULL ||
! 1823: pPager->errCode==SQLITE_OK ||
! 1824: (pPager->errCode & 0xff)==SQLITE_IOERR
! 1825: );
! 1826: if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){
! 1827: pPager->errCode = rc;
! 1828: pPager->eState = PAGER_ERROR;
! 1829: }
! 1830: return rc;
! 1831: }
! 1832:
! 1833: /*
! 1834: ** This routine ends a transaction. A transaction is usually ended by
! 1835: ** either a COMMIT or a ROLLBACK operation. This routine may be called
! 1836: ** after rollback of a hot-journal, or if an error occurs while opening
! 1837: ** the journal file or writing the very first journal-header of a
! 1838: ** database transaction.
! 1839: **
! 1840: ** This routine is never called in PAGER_ERROR state. If it is called
! 1841: ** in PAGER_NONE or PAGER_SHARED state and the lock held is less
! 1842: ** exclusive than a RESERVED lock, it is a no-op.
! 1843: **
! 1844: ** Otherwise, any active savepoints are released.
! 1845: **
! 1846: ** If the journal file is open, then it is "finalized". Once a journal
! 1847: ** file has been finalized it is not possible to use it to roll back a
! 1848: ** transaction. Nor will it be considered to be a hot-journal by this
! 1849: ** or any other database connection. Exactly how a journal is finalized
! 1850: ** depends on whether or not the pager is running in exclusive mode and
! 1851: ** the current journal-mode (Pager.journalMode value), as follows:
! 1852: **
! 1853: ** journalMode==MEMORY
! 1854: ** Journal file descriptor is simply closed. This destroys an
! 1855: ** in-memory journal.
! 1856: **
! 1857: ** journalMode==TRUNCATE
! 1858: ** Journal file is truncated to zero bytes in size.
! 1859: **
! 1860: ** journalMode==PERSIST
! 1861: ** The first 28 bytes of the journal file are zeroed. This invalidates
! 1862: ** the first journal header in the file, and hence the entire journal
! 1863: ** file. An invalid journal file cannot be rolled back.
! 1864: **
! 1865: ** journalMode==DELETE
! 1866: ** The journal file is closed and deleted using sqlite3OsDelete().
! 1867: **
! 1868: ** If the pager is running in exclusive mode, this method of finalizing
! 1869: ** the journal file is never used. Instead, if the journalMode is
! 1870: ** DELETE and the pager is in exclusive mode, the method described under
! 1871: ** journalMode==PERSIST is used instead.
! 1872: **
! 1873: ** After the journal is finalized, the pager moves to PAGER_READER state.
! 1874: ** If running in non-exclusive rollback mode, the lock on the file is
! 1875: ** downgraded to a SHARED_LOCK.
! 1876: **
! 1877: ** SQLITE_OK is returned if no error occurs. If an error occurs during
! 1878: ** any of the IO operations to finalize the journal file or unlock the
! 1879: ** database then the IO error code is returned to the user. If the
! 1880: ** operation to finalize the journal file fails, then the code still
! 1881: ** tries to unlock the database file if not in exclusive mode. If the
! 1882: ** unlock operation fails as well, then the first error code related
! 1883: ** to the first error encountered (the journal finalization one) is
! 1884: ** returned.
! 1885: */
! 1886: static int pager_end_transaction(Pager *pPager, int hasMaster){
! 1887: int rc = SQLITE_OK; /* Error code from journal finalization operation */
! 1888: int rc2 = SQLITE_OK; /* Error code from db file unlock operation */
! 1889:
! 1890: /* Do nothing if the pager does not have an open write transaction
! 1891: ** or at least a RESERVED lock. This function may be called when there
! 1892: ** is no write-transaction active but a RESERVED or greater lock is
! 1893: ** held under two circumstances:
! 1894: **
! 1895: ** 1. After a successful hot-journal rollback, it is called with
! 1896: ** eState==PAGER_NONE and eLock==EXCLUSIVE_LOCK.
! 1897: **
! 1898: ** 2. If a connection with locking_mode=exclusive holding an EXCLUSIVE
! 1899: ** lock switches back to locking_mode=normal and then executes a
! 1900: ** read-transaction, this function is called with eState==PAGER_READER
! 1901: ** and eLock==EXCLUSIVE_LOCK when the read-transaction is closed.
! 1902: */
! 1903: assert( assert_pager_state(pPager) );
! 1904: assert( pPager->eState!=PAGER_ERROR );
! 1905: if( pPager->eState<PAGER_WRITER_LOCKED && pPager->eLock<RESERVED_LOCK ){
! 1906: return SQLITE_OK;
! 1907: }
! 1908:
! 1909: releaseAllSavepoints(pPager);
! 1910: assert( isOpen(pPager->jfd) || pPager->pInJournal==0 );
! 1911: if( isOpen(pPager->jfd) ){
! 1912: assert( !pagerUseWal(pPager) );
! 1913:
! 1914: /* Finalize the journal file. */
! 1915: if( sqlite3IsMemJournal(pPager->jfd) ){
! 1916: assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY );
! 1917: sqlite3OsClose(pPager->jfd);
! 1918: }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){
! 1919: if( pPager->journalOff==0 ){
! 1920: rc = SQLITE_OK;
! 1921: }else{
! 1922: rc = sqlite3OsTruncate(pPager->jfd, 0);
! 1923: }
! 1924: pPager->journalOff = 0;
! 1925: }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST
! 1926: || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL)
! 1927: ){
! 1928: rc = zeroJournalHdr(pPager, hasMaster);
! 1929: pPager->journalOff = 0;
! 1930: }else{
! 1931: /* This branch may be executed with Pager.journalMode==MEMORY if
! 1932: ** a hot-journal was just rolled back. In this case the journal
! 1933: ** file should be closed and deleted. If this connection writes to
! 1934: ** the database file, it will do so using an in-memory journal.
! 1935: */
! 1936: assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE
! 1937: || pPager->journalMode==PAGER_JOURNALMODE_MEMORY
! 1938: || pPager->journalMode==PAGER_JOURNALMODE_WAL
! 1939: );
! 1940: sqlite3OsClose(pPager->jfd);
! 1941: if( !pPager->tempFile ){
! 1942: rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
! 1943: }
! 1944: }
! 1945: }
! 1946:
! 1947: #ifdef SQLITE_CHECK_PAGES
! 1948: sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash);
! 1949: if( pPager->dbSize==0 && sqlite3PcacheRefCount(pPager->pPCache)>0 ){
! 1950: PgHdr *p = pager_lookup(pPager, 1);
! 1951: if( p ){
! 1952: p->pageHash = 0;
! 1953: sqlite3PagerUnref(p);
! 1954: }
! 1955: }
! 1956: #endif
! 1957:
! 1958: sqlite3BitvecDestroy(pPager->pInJournal);
! 1959: pPager->pInJournal = 0;
! 1960: pPager->nRec = 0;
! 1961: sqlite3PcacheCleanAll(pPager->pPCache);
! 1962: sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize);
! 1963:
! 1964: if( pagerUseWal(pPager) ){
! 1965: /* Drop the WAL write-lock, if any. Also, if the connection was in
! 1966: ** locking_mode=exclusive mode but is no longer, drop the EXCLUSIVE
! 1967: ** lock held on the database file.
! 1968: */
! 1969: rc2 = sqlite3WalEndWriteTransaction(pPager->pWal);
! 1970: assert( rc2==SQLITE_OK );
! 1971: }
! 1972: if( !pPager->exclusiveMode
! 1973: && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0))
! 1974: ){
! 1975: rc2 = pagerUnlockDb(pPager, SHARED_LOCK);
! 1976: pPager->changeCountDone = 0;
! 1977: }
! 1978: pPager->eState = PAGER_READER;
! 1979: pPager->setMaster = 0;
! 1980:
! 1981: return (rc==SQLITE_OK?rc2:rc);
! 1982: }
! 1983:
! 1984: /*
! 1985: ** Execute a rollback if a transaction is active and unlock the
! 1986: ** database file.
! 1987: **
! 1988: ** If the pager has already entered the ERROR state, do not attempt
! 1989: ** the rollback at this time. Instead, pager_unlock() is called. The
! 1990: ** call to pager_unlock() will discard all in-memory pages, unlock
! 1991: ** the database file and move the pager back to OPEN state. If this
! 1992: ** means that there is a hot-journal left in the file-system, the next
! 1993: ** connection to obtain a shared lock on the pager (which may be this one)
! 1994: ** will roll it back.
! 1995: **
! 1996: ** If the pager has not already entered the ERROR state, but an IO or
! 1997: ** malloc error occurs during a rollback, then this will itself cause
! 1998: ** the pager to enter the ERROR state. Which will be cleared by the
! 1999: ** call to pager_unlock(), as described above.
! 2000: */
! 2001: static void pagerUnlockAndRollback(Pager *pPager){
! 2002: if( pPager->eState!=PAGER_ERROR && pPager->eState!=PAGER_OPEN ){
! 2003: assert( assert_pager_state(pPager) );
! 2004: if( pPager->eState>=PAGER_WRITER_LOCKED ){
! 2005: sqlite3BeginBenignMalloc();
! 2006: sqlite3PagerRollback(pPager);
! 2007: sqlite3EndBenignMalloc();
! 2008: }else if( !pPager->exclusiveMode ){
! 2009: assert( pPager->eState==PAGER_READER );
! 2010: pager_end_transaction(pPager, 0);
! 2011: }
! 2012: }
! 2013: pager_unlock(pPager);
! 2014: }
! 2015:
! 2016: /*
! 2017: ** Parameter aData must point to a buffer of pPager->pageSize bytes
! 2018: ** of data. Compute and return a checksum based ont the contents of the
! 2019: ** page of data and the current value of pPager->cksumInit.
! 2020: **
! 2021: ** This is not a real checksum. It is really just the sum of the
! 2022: ** random initial value (pPager->cksumInit) and every 200th byte
! 2023: ** of the page data, starting with byte offset (pPager->pageSize%200).
! 2024: ** Each byte is interpreted as an 8-bit unsigned integer.
! 2025: **
! 2026: ** Changing the formula used to compute this checksum results in an
! 2027: ** incompatible journal file format.
! 2028: **
! 2029: ** If journal corruption occurs due to a power failure, the most likely
! 2030: ** scenario is that one end or the other of the record will be changed.
! 2031: ** It is much less likely that the two ends of the journal record will be
! 2032: ** correct and the middle be corrupt. Thus, this "checksum" scheme,
! 2033: ** though fast and simple, catches the mostly likely kind of corruption.
! 2034: */
! 2035: static u32 pager_cksum(Pager *pPager, const u8 *aData){
! 2036: u32 cksum = pPager->cksumInit; /* Checksum value to return */
! 2037: int i = pPager->pageSize-200; /* Loop counter */
! 2038: while( i>0 ){
! 2039: cksum += aData[i];
! 2040: i -= 200;
! 2041: }
! 2042: return cksum;
! 2043: }
! 2044:
! 2045: /*
! 2046: ** Report the current page size and number of reserved bytes back
! 2047: ** to the codec.
! 2048: */
! 2049: #ifdef SQLITE_HAS_CODEC
! 2050: static void pagerReportSize(Pager *pPager){
! 2051: if( pPager->xCodecSizeChng ){
! 2052: pPager->xCodecSizeChng(pPager->pCodec, pPager->pageSize,
! 2053: (int)pPager->nReserve);
! 2054: }
! 2055: }
! 2056: #else
! 2057: # define pagerReportSize(X) /* No-op if we do not support a codec */
! 2058: #endif
! 2059:
! 2060: /*
! 2061: ** Read a single page from either the journal file (if isMainJrnl==1) or
! 2062: ** from the sub-journal (if isMainJrnl==0) and playback that page.
! 2063: ** The page begins at offset *pOffset into the file. The *pOffset
! 2064: ** value is increased to the start of the next page in the journal.
! 2065: **
! 2066: ** The main rollback journal uses checksums - the statement journal does
! 2067: ** not.
! 2068: **
! 2069: ** If the page number of the page record read from the (sub-)journal file
! 2070: ** is greater than the current value of Pager.dbSize, then playback is
! 2071: ** skipped and SQLITE_OK is returned.
! 2072: **
! 2073: ** If pDone is not NULL, then it is a record of pages that have already
! 2074: ** been played back. If the page at *pOffset has already been played back
! 2075: ** (if the corresponding pDone bit is set) then skip the playback.
! 2076: ** Make sure the pDone bit corresponding to the *pOffset page is set
! 2077: ** prior to returning.
! 2078: **
! 2079: ** If the page record is successfully read from the (sub-)journal file
! 2080: ** and played back, then SQLITE_OK is returned. If an IO error occurs
! 2081: ** while reading the record from the (sub-)journal file or while writing
! 2082: ** to the database file, then the IO error code is returned. If data
! 2083: ** is successfully read from the (sub-)journal file but appears to be
! 2084: ** corrupted, SQLITE_DONE is returned. Data is considered corrupted in
! 2085: ** two circumstances:
! 2086: **
! 2087: ** * If the record page-number is illegal (0 or PAGER_MJ_PGNO), or
! 2088: ** * If the record is being rolled back from the main journal file
! 2089: ** and the checksum field does not match the record content.
! 2090: **
! 2091: ** Neither of these two scenarios are possible during a savepoint rollback.
! 2092: **
! 2093: ** If this is a savepoint rollback, then memory may have to be dynamically
! 2094: ** allocated by this function. If this is the case and an allocation fails,
! 2095: ** SQLITE_NOMEM is returned.
! 2096: */
! 2097: static int pager_playback_one_page(
! 2098: Pager *pPager, /* The pager being played back */
! 2099: i64 *pOffset, /* Offset of record to playback */
! 2100: Bitvec *pDone, /* Bitvec of pages already played back */
! 2101: int isMainJrnl, /* 1 -> main journal. 0 -> sub-journal. */
! 2102: int isSavepnt /* True for a savepoint rollback */
! 2103: ){
! 2104: int rc;
! 2105: PgHdr *pPg; /* An existing page in the cache */
! 2106: Pgno pgno; /* The page number of a page in journal */
! 2107: u32 cksum; /* Checksum used for sanity checking */
! 2108: char *aData; /* Temporary storage for the page */
! 2109: sqlite3_file *jfd; /* The file descriptor for the journal file */
! 2110: int isSynced; /* True if journal page is synced */
! 2111:
! 2112: assert( (isMainJrnl&~1)==0 ); /* isMainJrnl is 0 or 1 */
! 2113: assert( (isSavepnt&~1)==0 ); /* isSavepnt is 0 or 1 */
! 2114: assert( isMainJrnl || pDone ); /* pDone always used on sub-journals */
! 2115: assert( isSavepnt || pDone==0 ); /* pDone never used on non-savepoint */
! 2116:
! 2117: aData = pPager->pTmpSpace;
! 2118: assert( aData ); /* Temp storage must have already been allocated */
! 2119: assert( pagerUseWal(pPager)==0 || (!isMainJrnl && isSavepnt) );
! 2120:
! 2121: /* Either the state is greater than PAGER_WRITER_CACHEMOD (a transaction
! 2122: ** or savepoint rollback done at the request of the caller) or this is
! 2123: ** a hot-journal rollback. If it is a hot-journal rollback, the pager
! 2124: ** is in state OPEN and holds an EXCLUSIVE lock. Hot-journal rollback
! 2125: ** only reads from the main journal, not the sub-journal.
! 2126: */
! 2127: assert( pPager->eState>=PAGER_WRITER_CACHEMOD
! 2128: || (pPager->eState==PAGER_OPEN && pPager->eLock==EXCLUSIVE_LOCK)
! 2129: );
! 2130: assert( pPager->eState>=PAGER_WRITER_CACHEMOD || isMainJrnl );
! 2131:
! 2132: /* Read the page number and page data from the journal or sub-journal
! 2133: ** file. Return an error code to the caller if an IO error occurs.
! 2134: */
! 2135: jfd = isMainJrnl ? pPager->jfd : pPager->sjfd;
! 2136: rc = read32bits(jfd, *pOffset, &pgno);
! 2137: if( rc!=SQLITE_OK ) return rc;
! 2138: rc = sqlite3OsRead(jfd, (u8*)aData, pPager->pageSize, (*pOffset)+4);
! 2139: if( rc!=SQLITE_OK ) return rc;
! 2140: *pOffset += pPager->pageSize + 4 + isMainJrnl*4;
! 2141:
! 2142: /* Sanity checking on the page. This is more important that I originally
! 2143: ** thought. If a power failure occurs while the journal is being written,
! 2144: ** it could cause invalid data to be written into the journal. We need to
! 2145: ** detect this invalid data (with high probability) and ignore it.
! 2146: */
! 2147: if( pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){
! 2148: assert( !isSavepnt );
! 2149: return SQLITE_DONE;
! 2150: }
! 2151: if( pgno>(Pgno)pPager->dbSize || sqlite3BitvecTest(pDone, pgno) ){
! 2152: return SQLITE_OK;
! 2153: }
! 2154: if( isMainJrnl ){
! 2155: rc = read32bits(jfd, (*pOffset)-4, &cksum);
! 2156: if( rc ) return rc;
! 2157: if( !isSavepnt && pager_cksum(pPager, (u8*)aData)!=cksum ){
! 2158: return SQLITE_DONE;
! 2159: }
! 2160: }
! 2161:
! 2162: /* If this page has already been played by before during the current
! 2163: ** rollback, then don't bother to play it back again.
! 2164: */
! 2165: if( pDone && (rc = sqlite3BitvecSet(pDone, pgno))!=SQLITE_OK ){
! 2166: return rc;
! 2167: }
! 2168:
! 2169: /* When playing back page 1, restore the nReserve setting
! 2170: */
! 2171: if( pgno==1 && pPager->nReserve!=((u8*)aData)[20] ){
! 2172: pPager->nReserve = ((u8*)aData)[20];
! 2173: pagerReportSize(pPager);
! 2174: }
! 2175:
! 2176: /* If the pager is in CACHEMOD state, then there must be a copy of this
! 2177: ** page in the pager cache. In this case just update the pager cache,
! 2178: ** not the database file. The page is left marked dirty in this case.
! 2179: **
! 2180: ** An exception to the above rule: If the database is in no-sync mode
! 2181: ** and a page is moved during an incremental vacuum then the page may
! 2182: ** not be in the pager cache. Later: if a malloc() or IO error occurs
! 2183: ** during a Movepage() call, then the page may not be in the cache
! 2184: ** either. So the condition described in the above paragraph is not
! 2185: ** assert()able.
! 2186: **
! 2187: ** If in WRITER_DBMOD, WRITER_FINISHED or OPEN state, then we update the
! 2188: ** pager cache if it exists and the main file. The page is then marked
! 2189: ** not dirty. Since this code is only executed in PAGER_OPEN state for
! 2190: ** a hot-journal rollback, it is guaranteed that the page-cache is empty
! 2191: ** if the pager is in OPEN state.
! 2192: **
! 2193: ** Ticket #1171: The statement journal might contain page content that is
! 2194: ** different from the page content at the start of the transaction.
! 2195: ** This occurs when a page is changed prior to the start of a statement
! 2196: ** then changed again within the statement. When rolling back such a
! 2197: ** statement we must not write to the original database unless we know
! 2198: ** for certain that original page contents are synced into the main rollback
! 2199: ** journal. Otherwise, a power loss might leave modified data in the
! 2200: ** database file without an entry in the rollback journal that can
! 2201: ** restore the database to its original form. Two conditions must be
! 2202: ** met before writing to the database files. (1) the database must be
! 2203: ** locked. (2) we know that the original page content is fully synced
! 2204: ** in the main journal either because the page is not in cache or else
! 2205: ** the page is marked as needSync==0.
! 2206: **
! 2207: ** 2008-04-14: When attempting to vacuum a corrupt database file, it
! 2208: ** is possible to fail a statement on a database that does not yet exist.
! 2209: ** Do not attempt to write if database file has never been opened.
! 2210: */
! 2211: if( pagerUseWal(pPager) ){
! 2212: pPg = 0;
! 2213: }else{
! 2214: pPg = pager_lookup(pPager, pgno);
! 2215: }
! 2216: assert( pPg || !MEMDB );
! 2217: assert( pPager->eState!=PAGER_OPEN || pPg==0 );
! 2218: PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n",
! 2219: PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData),
! 2220: (isMainJrnl?"main-journal":"sub-journal")
! 2221: ));
! 2222: if( isMainJrnl ){
! 2223: isSynced = pPager->noSync || (*pOffset <= pPager->journalHdr);
! 2224: }else{
! 2225: isSynced = (pPg==0 || 0==(pPg->flags & PGHDR_NEED_SYNC));
! 2226: }
! 2227: if( isOpen(pPager->fd)
! 2228: && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN)
! 2229: && isSynced
! 2230: ){
! 2231: i64 ofst = (pgno-1)*(i64)pPager->pageSize;
! 2232: testcase( !isSavepnt && pPg!=0 && (pPg->flags&PGHDR_NEED_SYNC)!=0 );
! 2233: assert( !pagerUseWal(pPager) );
! 2234: rc = sqlite3OsWrite(pPager->fd, (u8*)aData, pPager->pageSize, ofst);
! 2235: if( pgno>pPager->dbFileSize ){
! 2236: pPager->dbFileSize = pgno;
! 2237: }
! 2238: if( pPager->pBackup ){
! 2239: CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM);
! 2240: sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData);
! 2241: CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM, aData);
! 2242: }
! 2243: }else if( !isMainJrnl && pPg==0 ){
! 2244: /* If this is a rollback of a savepoint and data was not written to
! 2245: ** the database and the page is not in-memory, there is a potential
! 2246: ** problem. When the page is next fetched by the b-tree layer, it
! 2247: ** will be read from the database file, which may or may not be
! 2248: ** current.
! 2249: **
! 2250: ** There are a couple of different ways this can happen. All are quite
! 2251: ** obscure. When running in synchronous mode, this can only happen
! 2252: ** if the page is on the free-list at the start of the transaction, then
! 2253: ** populated, then moved using sqlite3PagerMovepage().
! 2254: **
! 2255: ** The solution is to add an in-memory page to the cache containing
! 2256: ** the data just read from the sub-journal. Mark the page as dirty
! 2257: ** and if the pager requires a journal-sync, then mark the page as
! 2258: ** requiring a journal-sync before it is written.
! 2259: */
! 2260: assert( isSavepnt );
! 2261: assert( pPager->doNotSpill==0 );
! 2262: pPager->doNotSpill++;
! 2263: rc = sqlite3PagerAcquire(pPager, pgno, &pPg, 1);
! 2264: assert( pPager->doNotSpill==1 );
! 2265: pPager->doNotSpill--;
! 2266: if( rc!=SQLITE_OK ) return rc;
! 2267: pPg->flags &= ~PGHDR_NEED_READ;
! 2268: sqlite3PcacheMakeDirty(pPg);
! 2269: }
! 2270: if( pPg ){
! 2271: /* No page should ever be explicitly rolled back that is in use, except
! 2272: ** for page 1 which is held in use in order to keep the lock on the
! 2273: ** database active. However such a page may be rolled back as a result
! 2274: ** of an internal error resulting in an automatic call to
! 2275: ** sqlite3PagerRollback().
! 2276: */
! 2277: void *pData;
! 2278: pData = pPg->pData;
! 2279: memcpy(pData, (u8*)aData, pPager->pageSize);
! 2280: pPager->xReiniter(pPg);
! 2281: if( isMainJrnl && (!isSavepnt || *pOffset<=pPager->journalHdr) ){
! 2282: /* If the contents of this page were just restored from the main
! 2283: ** journal file, then its content must be as they were when the
! 2284: ** transaction was first opened. In this case we can mark the page
! 2285: ** as clean, since there will be no need to write it out to the
! 2286: ** database.
! 2287: **
! 2288: ** There is one exception to this rule. If the page is being rolled
! 2289: ** back as part of a savepoint (or statement) rollback from an
! 2290: ** unsynced portion of the main journal file, then it is not safe
! 2291: ** to mark the page as clean. This is because marking the page as
! 2292: ** clean will clear the PGHDR_NEED_SYNC flag. Since the page is
! 2293: ** already in the journal file (recorded in Pager.pInJournal) and
! 2294: ** the PGHDR_NEED_SYNC flag is cleared, if the page is written to
! 2295: ** again within this transaction, it will be marked as dirty but
! 2296: ** the PGHDR_NEED_SYNC flag will not be set. It could then potentially
! 2297: ** be written out into the database file before its journal file
! 2298: ** segment is synced. If a crash occurs during or following this,
! 2299: ** database corruption may ensue.
! 2300: */
! 2301: assert( !pagerUseWal(pPager) );
! 2302: sqlite3PcacheMakeClean(pPg);
! 2303: }
! 2304: pager_set_pagehash(pPg);
! 2305:
! 2306: /* If this was page 1, then restore the value of Pager.dbFileVers.
! 2307: ** Do this before any decoding. */
! 2308: if( pgno==1 ){
! 2309: memcpy(&pPager->dbFileVers, &((u8*)pData)[24],sizeof(pPager->dbFileVers));
! 2310: }
! 2311:
! 2312: /* Decode the page just read from disk */
! 2313: CODEC1(pPager, pData, pPg->pgno, 3, rc=SQLITE_NOMEM);
! 2314: sqlite3PcacheRelease(pPg);
! 2315: }
! 2316: return rc;
! 2317: }
! 2318:
! 2319: /*
! 2320: ** Parameter zMaster is the name of a master journal file. A single journal
! 2321: ** file that referred to the master journal file has just been rolled back.
! 2322: ** This routine checks if it is possible to delete the master journal file,
! 2323: ** and does so if it is.
! 2324: **
! 2325: ** Argument zMaster may point to Pager.pTmpSpace. So that buffer is not
! 2326: ** available for use within this function.
! 2327: **
! 2328: ** When a master journal file is created, it is populated with the names
! 2329: ** of all of its child journals, one after another, formatted as utf-8
! 2330: ** encoded text. The end of each child journal file is marked with a
! 2331: ** nul-terminator byte (0x00). i.e. the entire contents of a master journal
! 2332: ** file for a transaction involving two databases might be:
! 2333: **
! 2334: ** "/home/bill/a.db-journal\x00/home/bill/b.db-journal\x00"
! 2335: **
! 2336: ** A master journal file may only be deleted once all of its child
! 2337: ** journals have been rolled back.
! 2338: **
! 2339: ** This function reads the contents of the master-journal file into
! 2340: ** memory and loops through each of the child journal names. For
! 2341: ** each child journal, it checks if:
! 2342: **
! 2343: ** * if the child journal exists, and if so
! 2344: ** * if the child journal contains a reference to master journal
! 2345: ** file zMaster
! 2346: **
! 2347: ** If a child journal can be found that matches both of the criteria
! 2348: ** above, this function returns without doing anything. Otherwise, if
! 2349: ** no such child journal can be found, file zMaster is deleted from
! 2350: ** the file-system using sqlite3OsDelete().
! 2351: **
! 2352: ** If an IO error within this function, an error code is returned. This
! 2353: ** function allocates memory by calling sqlite3Malloc(). If an allocation
! 2354: ** fails, SQLITE_NOMEM is returned. Otherwise, if no IO or malloc errors
! 2355: ** occur, SQLITE_OK is returned.
! 2356: **
! 2357: ** TODO: This function allocates a single block of memory to load
! 2358: ** the entire contents of the master journal file. This could be
! 2359: ** a couple of kilobytes or so - potentially larger than the page
! 2360: ** size.
! 2361: */
! 2362: static int pager_delmaster(Pager *pPager, const char *zMaster){
! 2363: sqlite3_vfs *pVfs = pPager->pVfs;
! 2364: int rc; /* Return code */
! 2365: sqlite3_file *pMaster; /* Malloc'd master-journal file descriptor */
! 2366: sqlite3_file *pJournal; /* Malloc'd child-journal file descriptor */
! 2367: char *zMasterJournal = 0; /* Contents of master journal file */
! 2368: i64 nMasterJournal; /* Size of master journal file */
! 2369: char *zJournal; /* Pointer to one journal within MJ file */
! 2370: char *zMasterPtr; /* Space to hold MJ filename from a journal file */
! 2371: int nMasterPtr; /* Amount of space allocated to zMasterPtr[] */
! 2372:
! 2373: /* Allocate space for both the pJournal and pMaster file descriptors.
! 2374: ** If successful, open the master journal file for reading.
! 2375: */
! 2376: pMaster = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile * 2);
! 2377: pJournal = (sqlite3_file *)(((u8 *)pMaster) + pVfs->szOsFile);
! 2378: if( !pMaster ){
! 2379: rc = SQLITE_NOMEM;
! 2380: }else{
! 2381: const int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL);
! 2382: rc = sqlite3OsOpen(pVfs, zMaster, pMaster, flags, 0);
! 2383: }
! 2384: if( rc!=SQLITE_OK ) goto delmaster_out;
! 2385:
! 2386: /* Load the entire master journal file into space obtained from
! 2387: ** sqlite3_malloc() and pointed to by zMasterJournal. Also obtain
! 2388: ** sufficient space (in zMasterPtr) to hold the names of master
! 2389: ** journal files extracted from regular rollback-journals.
! 2390: */
! 2391: rc = sqlite3OsFileSize(pMaster, &nMasterJournal);
! 2392: if( rc!=SQLITE_OK ) goto delmaster_out;
! 2393: nMasterPtr = pVfs->mxPathname+1;
! 2394: zMasterJournal = sqlite3Malloc((int)nMasterJournal + nMasterPtr + 1);
! 2395: if( !zMasterJournal ){
! 2396: rc = SQLITE_NOMEM;
! 2397: goto delmaster_out;
! 2398: }
! 2399: zMasterPtr = &zMasterJournal[nMasterJournal+1];
! 2400: rc = sqlite3OsRead(pMaster, zMasterJournal, (int)nMasterJournal, 0);
! 2401: if( rc!=SQLITE_OK ) goto delmaster_out;
! 2402: zMasterJournal[nMasterJournal] = 0;
! 2403:
! 2404: zJournal = zMasterJournal;
! 2405: while( (zJournal-zMasterJournal)<nMasterJournal ){
! 2406: int exists;
! 2407: rc = sqlite3OsAccess(pVfs, zJournal, SQLITE_ACCESS_EXISTS, &exists);
! 2408: if( rc!=SQLITE_OK ){
! 2409: goto delmaster_out;
! 2410: }
! 2411: if( exists ){
! 2412: /* One of the journals pointed to by the master journal exists.
! 2413: ** Open it and check if it points at the master journal. If
! 2414: ** so, return without deleting the master journal file.
! 2415: */
! 2416: int c;
! 2417: int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL);
! 2418: rc = sqlite3OsOpen(pVfs, zJournal, pJournal, flags, 0);
! 2419: if( rc!=SQLITE_OK ){
! 2420: goto delmaster_out;
! 2421: }
! 2422:
! 2423: rc = readMasterJournal(pJournal, zMasterPtr, nMasterPtr);
! 2424: sqlite3OsClose(pJournal);
! 2425: if( rc!=SQLITE_OK ){
! 2426: goto delmaster_out;
! 2427: }
! 2428:
! 2429: c = zMasterPtr[0]!=0 && strcmp(zMasterPtr, zMaster)==0;
! 2430: if( c ){
! 2431: /* We have a match. Do not delete the master journal file. */
! 2432: goto delmaster_out;
! 2433: }
! 2434: }
! 2435: zJournal += (sqlite3Strlen30(zJournal)+1);
! 2436: }
! 2437:
! 2438: sqlite3OsClose(pMaster);
! 2439: rc = sqlite3OsDelete(pVfs, zMaster, 0);
! 2440:
! 2441: delmaster_out:
! 2442: sqlite3_free(zMasterJournal);
! 2443: if( pMaster ){
! 2444: sqlite3OsClose(pMaster);
! 2445: assert( !isOpen(pJournal) );
! 2446: sqlite3_free(pMaster);
! 2447: }
! 2448: return rc;
! 2449: }
! 2450:
! 2451:
! 2452: /*
! 2453: ** This function is used to change the actual size of the database
! 2454: ** file in the file-system. This only happens when committing a transaction,
! 2455: ** or rolling back a transaction (including rolling back a hot-journal).
! 2456: **
! 2457: ** If the main database file is not open, or the pager is not in either
! 2458: ** DBMOD or OPEN state, this function is a no-op. Otherwise, the size
! 2459: ** of the file is changed to nPage pages (nPage*pPager->pageSize bytes).
! 2460: ** If the file on disk is currently larger than nPage pages, then use the VFS
! 2461: ** xTruncate() method to truncate it.
! 2462: **
! 2463: ** Or, it might might be the case that the file on disk is smaller than
! 2464: ** nPage pages. Some operating system implementations can get confused if
! 2465: ** you try to truncate a file to some size that is larger than it
! 2466: ** currently is, so detect this case and write a single zero byte to
! 2467: ** the end of the new file instead.
! 2468: **
! 2469: ** If successful, return SQLITE_OK. If an IO error occurs while modifying
! 2470: ** the database file, return the error code to the caller.
! 2471: */
! 2472: static int pager_truncate(Pager *pPager, Pgno nPage){
! 2473: int rc = SQLITE_OK;
! 2474: assert( pPager->eState!=PAGER_ERROR );
! 2475: assert( pPager->eState!=PAGER_READER );
! 2476:
! 2477: if( isOpen(pPager->fd)
! 2478: && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN)
! 2479: ){
! 2480: i64 currentSize, newSize;
! 2481: int szPage = pPager->pageSize;
! 2482: assert( pPager->eLock==EXCLUSIVE_LOCK );
! 2483: /* TODO: Is it safe to use Pager.dbFileSize here? */
! 2484: rc = sqlite3OsFileSize(pPager->fd, ¤tSize);
! 2485: newSize = szPage*(i64)nPage;
! 2486: if( rc==SQLITE_OK && currentSize!=newSize ){
! 2487: if( currentSize>newSize ){
! 2488: rc = sqlite3OsTruncate(pPager->fd, newSize);
! 2489: }else if( (currentSize+szPage)<=newSize ){
! 2490: char *pTmp = pPager->pTmpSpace;
! 2491: memset(pTmp, 0, szPage);
! 2492: testcase( (newSize-szPage) == currentSize );
! 2493: testcase( (newSize-szPage) > currentSize );
! 2494: rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage);
! 2495: }
! 2496: if( rc==SQLITE_OK ){
! 2497: pPager->dbFileSize = nPage;
! 2498: }
! 2499: }
! 2500: }
! 2501: return rc;
! 2502: }
! 2503:
! 2504: /*
! 2505: ** Set the value of the Pager.sectorSize variable for the given
! 2506: ** pager based on the value returned by the xSectorSize method
! 2507: ** of the open database file. The sector size will be used used
! 2508: ** to determine the size and alignment of journal header and
! 2509: ** master journal pointers within created journal files.
! 2510: **
! 2511: ** For temporary files the effective sector size is always 512 bytes.
! 2512: **
! 2513: ** Otherwise, for non-temporary files, the effective sector size is
! 2514: ** 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
! 2516: ** is greater than MAX_SECTOR_SIZE.
! 2517: **
! 2518: ** If the file has the SQLITE_IOCAP_POWERSAFE_OVERWRITE property, then set
! 2519: ** the effective sector size to its minimum value (512). The purpose of
! 2520: ** pPager->sectorSize is to define the "blast radius" of bytes that
! 2521: ** might change if a crash occurs while writing to a single byte in
! 2522: ** that range. But with POWERSAFE_OVERWRITE, the blast radius is zero
! 2523: ** (that is what POWERSAFE_OVERWRITE means), so we minimize the sector
! 2524: ** size. For backwards compatibility of the rollback journal file format,
! 2525: ** we cannot reduce the effective sector size below 512.
! 2526: */
! 2527: static void setSectorSize(Pager *pPager){
! 2528: assert( isOpen(pPager->fd) || pPager->tempFile );
! 2529:
! 2530: if( pPager->tempFile
! 2531: || (sqlite3OsDeviceCharacteristics(pPager->fd) &
! 2532: SQLITE_IOCAP_POWERSAFE_OVERWRITE)!=0
! 2533: ){
! 2534: /* Sector size doesn't matter for temporary files. Also, the file
! 2535: ** may not have been opened yet, in which case the OsSectorSize()
! 2536: ** call will segfault. */
! 2537: pPager->sectorSize = 512;
! 2538: }else{
! 2539: pPager->sectorSize = sqlite3OsSectorSize(pPager->fd);
! 2540: if( pPager->sectorSize<32 ){
! 2541: pPager->sectorSize = 512;
! 2542: }
! 2543: if( pPager->sectorSize>MAX_SECTOR_SIZE ){
! 2544: assert( MAX_SECTOR_SIZE>=512 );
! 2545: pPager->sectorSize = MAX_SECTOR_SIZE;
! 2546: }
! 2547: }
! 2548: }
! 2549:
! 2550: /*
! 2551: ** Playback the journal and thus restore the database file to
! 2552: ** the state it was in before we started making changes.
! 2553: **
! 2554: ** The journal file format is as follows:
! 2555: **
! 2556: ** (1) 8 byte prefix. A copy of aJournalMagic[].
! 2557: ** (2) 4 byte big-endian integer which is the number of valid page records
! 2558: ** in the journal. If this value is 0xffffffff, then compute the
! 2559: ** number of page records from the journal size.
! 2560: ** (3) 4 byte big-endian integer which is the initial value for the
! 2561: ** sanity checksum.
! 2562: ** (4) 4 byte integer which is the number of pages to truncate the
! 2563: ** database to during a rollback.
! 2564: ** (5) 4 byte big-endian integer which is the sector size. The header
! 2565: ** is this many bytes in size.
! 2566: ** (6) 4 byte big-endian integer which is the page size.
! 2567: ** (7) zero padding out to the next sector size.
! 2568: ** (8) Zero or more pages instances, each as follows:
! 2569: ** + 4 byte page number.
! 2570: ** + pPager->pageSize bytes of data.
! 2571: ** + 4 byte checksum
! 2572: **
! 2573: ** When we speak of the journal header, we mean the first 7 items above.
! 2574: ** Each entry in the journal is an instance of the 8th item.
! 2575: **
! 2576: ** Call the value from the second bullet "nRec". nRec is the number of
! 2577: ** valid page entries in the journal. In most cases, you can compute the
! 2578: ** value of nRec from the size of the journal file. But if a power
! 2579: ** failure occurred while the journal was being written, it could be the
! 2580: ** case that the size of the journal file had already been increased but
! 2581: ** the extra entries had not yet made it safely to disk. In such a case,
! 2582: ** the value of nRec computed from the file size would be too large. For
! 2583: ** that reason, we always use the nRec value in the header.
! 2584: **
! 2585: ** If the nRec value is 0xffffffff it means that nRec should be computed
! 2586: ** from the file size. This value is used when the user selects the
! 2587: ** no-sync option for the journal. A power failure could lead to corruption
! 2588: ** in this case. But for things like temporary table (which will be
! 2589: ** deleted when the power is restored) we don't care.
! 2590: **
! 2591: ** If the file opened as the journal file is not a well-formed
! 2592: ** journal file then all pages up to the first corrupted page are rolled
! 2593: ** back (or no pages if the journal header is corrupted). The journal file
! 2594: ** is then deleted and SQLITE_OK returned, just as if no corruption had
! 2595: ** been encountered.
! 2596: **
! 2597: ** If an I/O or malloc() error occurs, the journal-file is not deleted
! 2598: ** and an error code is returned.
! 2599: **
! 2600: ** The isHot parameter indicates that we are trying to rollback a journal
! 2601: ** that might be a hot journal. Or, it could be that the journal is
! 2602: ** preserved because of JOURNALMODE_PERSIST or JOURNALMODE_TRUNCATE.
! 2603: ** If the journal really is hot, reset the pager cache prior rolling
! 2604: ** back any content. If the journal is merely persistent, no reset is
! 2605: ** needed.
! 2606: */
! 2607: static int pager_playback(Pager *pPager, int isHot){
! 2608: sqlite3_vfs *pVfs = pPager->pVfs;
! 2609: i64 szJ; /* Size of the journal file in bytes */
! 2610: u32 nRec; /* Number of Records in the journal */
! 2611: u32 u; /* Unsigned loop counter */
! 2612: Pgno mxPg = 0; /* Size of the original file in pages */
! 2613: int rc; /* Result code of a subroutine */
! 2614: int res = 1; /* Value returned by sqlite3OsAccess() */
! 2615: char *zMaster = 0; /* Name of master journal file if any */
! 2616: int needPagerReset; /* True to reset page prior to first page rollback */
! 2617:
! 2618: /* Figure out how many records are in the journal. Abort early if
! 2619: ** the journal is empty.
! 2620: */
! 2621: assert( isOpen(pPager->jfd) );
! 2622: rc = sqlite3OsFileSize(pPager->jfd, &szJ);
! 2623: if( rc!=SQLITE_OK ){
! 2624: goto end_playback;
! 2625: }
! 2626:
! 2627: /* Read the master journal name from the journal, if it is present.
! 2628: ** If a master journal file name is specified, but the file is not
! 2629: ** present on disk, then the journal is not hot and does not need to be
! 2630: ** played back.
! 2631: **
! 2632: ** TODO: Technically the following is an error because it assumes that
! 2633: ** buffer Pager.pTmpSpace is (mxPathname+1) bytes or larger. i.e. that
! 2634: ** (pPager->pageSize >= pPager->pVfs->mxPathname+1). Using os_unix.c,
! 2635: ** mxPathname is 512, which is the same as the minimum allowable value
! 2636: ** for pageSize.
! 2637: */
! 2638: zMaster = pPager->pTmpSpace;
! 2639: rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1);
! 2640: if( rc==SQLITE_OK && zMaster[0] ){
! 2641: rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res);
! 2642: }
! 2643: zMaster = 0;
! 2644: if( rc!=SQLITE_OK || !res ){
! 2645: goto end_playback;
! 2646: }
! 2647: pPager->journalOff = 0;
! 2648: needPagerReset = isHot;
! 2649:
! 2650: /* This loop terminates either when a readJournalHdr() or
! 2651: ** pager_playback_one_page() call returns SQLITE_DONE or an IO error
! 2652: ** occurs.
! 2653: */
! 2654: while( 1 ){
! 2655: /* Read the next journal header from the journal file. If there are
! 2656: ** not enough bytes left in the journal file for a complete header, or
! 2657: ** it is corrupted, then a process must have failed while writing it.
! 2658: ** This indicates nothing more needs to be rolled back.
! 2659: */
! 2660: rc = readJournalHdr(pPager, isHot, szJ, &nRec, &mxPg);
! 2661: if( rc!=SQLITE_OK ){
! 2662: if( rc==SQLITE_DONE ){
! 2663: rc = SQLITE_OK;
! 2664: }
! 2665: goto end_playback;
! 2666: }
! 2667:
! 2668: /* If nRec is 0xffffffff, then this journal was created by a process
! 2669: ** working in no-sync mode. This means that the rest of the journal
! 2670: ** file consists of pages, there are no more journal headers. Compute
! 2671: ** the value of nRec based on this assumption.
! 2672: */
! 2673: if( nRec==0xffffffff ){
! 2674: assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) );
! 2675: nRec = (int)((szJ - JOURNAL_HDR_SZ(pPager))/JOURNAL_PG_SZ(pPager));
! 2676: }
! 2677:
! 2678: /* If nRec is 0 and this rollback is of a transaction created by this
! 2679: ** process and if this is the final header in the journal, then it means
! 2680: ** that this part of the journal was being filled but has not yet been
! 2681: ** synced to disk. Compute the number of pages based on the remaining
! 2682: ** size of the file.
! 2683: **
! 2684: ** The third term of the test was added to fix ticket #2565.
! 2685: ** When rolling back a hot journal, nRec==0 always means that the next
! 2686: ** chunk of the journal contains zero pages to be rolled back. But
! 2687: ** when doing a ROLLBACK and the nRec==0 chunk is the last chunk in
! 2688: ** the journal, it means that the journal might contain additional
! 2689: ** pages that need to be rolled back and that the number of pages
! 2690: ** should be computed based on the journal file size.
! 2691: */
! 2692: if( nRec==0 && !isHot &&
! 2693: pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff ){
! 2694: nRec = (int)((szJ - pPager->journalOff) / JOURNAL_PG_SZ(pPager));
! 2695: }
! 2696:
! 2697: /* If this is the first header read from the journal, truncate the
! 2698: ** database file back to its original size.
! 2699: */
! 2700: if( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ){
! 2701: rc = pager_truncate(pPager, mxPg);
! 2702: if( rc!=SQLITE_OK ){
! 2703: goto end_playback;
! 2704: }
! 2705: pPager->dbSize = mxPg;
! 2706: }
! 2707:
! 2708: /* Copy original pages out of the journal and back into the
! 2709: ** database file and/or page cache.
! 2710: */
! 2711: for(u=0; u<nRec; u++){
! 2712: if( needPagerReset ){
! 2713: pager_reset(pPager);
! 2714: needPagerReset = 0;
! 2715: }
! 2716: rc = pager_playback_one_page(pPager,&pPager->journalOff,0,1,0);
! 2717: if( rc!=SQLITE_OK ){
! 2718: if( rc==SQLITE_DONE ){
! 2719: pPager->journalOff = szJ;
! 2720: break;
! 2721: }else if( rc==SQLITE_IOERR_SHORT_READ ){
! 2722: /* If the journal has been truncated, simply stop reading and
! 2723: ** processing the journal. This might happen if the journal was
! 2724: ** not completely written and synced prior to a crash. In that
! 2725: ** case, the database should have never been written in the
! 2726: ** first place so it is OK to simply abandon the rollback. */
! 2727: rc = SQLITE_OK;
! 2728: goto end_playback;
! 2729: }else{
! 2730: /* If we are unable to rollback, quit and return the error
! 2731: ** code. This will cause the pager to enter the error state
! 2732: ** so that no further harm will be done. Perhaps the next
! 2733: ** process to come along will be able to rollback the database.
! 2734: */
! 2735: goto end_playback;
! 2736: }
! 2737: }
! 2738: }
! 2739: }
! 2740: /*NOTREACHED*/
! 2741: assert( 0 );
! 2742:
! 2743: end_playback:
! 2744: /* Following a rollback, the database file should be back in its original
! 2745: ** state prior to the start of the transaction, so invoke the
! 2746: ** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the
! 2747: ** assertion that the transaction counter was modified.
! 2748: */
! 2749: #ifdef SQLITE_DEBUG
! 2750: if( pPager->fd->pMethods ){
! 2751: sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0);
! 2752: }
! 2753: #endif
! 2754:
! 2755: /* If this playback is happening automatically as a result of an IO or
! 2756: ** malloc error that occurred after the change-counter was updated but
! 2757: ** before the transaction was committed, then the change-counter
! 2758: ** modification may just have been reverted. If this happens in exclusive
! 2759: ** mode, then subsequent transactions performed by the connection will not
! 2760: ** update the change-counter at all. This may lead to cache inconsistency
! 2761: ** problems for other processes at some point in the future. So, just
! 2762: ** in case this has happened, clear the changeCountDone flag now.
! 2763: */
! 2764: pPager->changeCountDone = pPager->tempFile;
! 2765:
! 2766: if( rc==SQLITE_OK ){
! 2767: zMaster = pPager->pTmpSpace;
! 2768: rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1);
! 2769: testcase( rc!=SQLITE_OK );
! 2770: }
! 2771: if( rc==SQLITE_OK
! 2772: && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN)
! 2773: ){
! 2774: rc = sqlite3PagerSync(pPager);
! 2775: }
! 2776: if( rc==SQLITE_OK ){
! 2777: rc = pager_end_transaction(pPager, zMaster[0]!='\0');
! 2778: testcase( rc!=SQLITE_OK );
! 2779: }
! 2780: if( rc==SQLITE_OK && zMaster[0] && res ){
! 2781: /* If there was a master journal and this routine will return success,
! 2782: ** see if it is possible to delete the master journal.
! 2783: */
! 2784: rc = pager_delmaster(pPager, zMaster);
! 2785: testcase( rc!=SQLITE_OK );
! 2786: }
! 2787:
! 2788: /* The Pager.sectorSize variable may have been updated while rolling
! 2789: ** back a journal created by a process with a different sector size
! 2790: ** value. Reset it to the correct value for this process.
! 2791: */
! 2792: setSectorSize(pPager);
! 2793: return rc;
! 2794: }
! 2795:
! 2796:
! 2797: /*
! 2798: ** Read the content for page pPg out of the database file and into
! 2799: ** pPg->pData. A shared lock or greater must be held on the database
! 2800: ** file before this function is called.
! 2801: **
! 2802: ** If page 1 is read, then the value of Pager.dbFileVers[] is set to
! 2803: ** the value read from the database file.
! 2804: **
! 2805: ** If an IO error occurs, then the IO error is returned to the caller.
! 2806: ** Otherwise, SQLITE_OK is returned.
! 2807: */
! 2808: static int readDbPage(PgHdr *pPg){
! 2809: Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */
! 2810: Pgno pgno = pPg->pgno; /* Page number to read */
! 2811: int rc = SQLITE_OK; /* Return code */
! 2812: int isInWal = 0; /* True if page is in log file */
! 2813: int pgsz = pPager->pageSize; /* Number of bytes to read */
! 2814:
! 2815: assert( pPager->eState>=PAGER_READER && !MEMDB );
! 2816: assert( isOpen(pPager->fd) );
! 2817:
! 2818: if( NEVER(!isOpen(pPager->fd)) ){
! 2819: assert( pPager->tempFile );
! 2820: memset(pPg->pData, 0, pPager->pageSize);
! 2821: return SQLITE_OK;
! 2822: }
! 2823:
! 2824: if( pagerUseWal(pPager) ){
! 2825: /* Try to pull the page from the write-ahead log. */
! 2826: rc = sqlite3WalRead(pPager->pWal, pgno, &isInWal, pgsz, pPg->pData);
! 2827: }
! 2828: if( rc==SQLITE_OK && !isInWal ){
! 2829: i64 iOffset = (pgno-1)*(i64)pPager->pageSize;
! 2830: rc = sqlite3OsRead(pPager->fd, pPg->pData, pgsz, iOffset);
! 2831: if( rc==SQLITE_IOERR_SHORT_READ ){
! 2832: rc = SQLITE_OK;
! 2833: }
! 2834: }
! 2835:
! 2836: if( pgno==1 ){
! 2837: if( rc ){
! 2838: /* If the read is unsuccessful, set the dbFileVers[] to something
! 2839: ** that will never be a valid file version. dbFileVers[] is a copy
! 2840: ** of bytes 24..39 of the database. Bytes 28..31 should always be
! 2841: ** zero or the size of the database in page. Bytes 32..35 and 35..39
! 2842: ** should be page numbers which are never 0xffffffff. So filling
! 2843: ** pPager->dbFileVers[] with all 0xff bytes should suffice.
! 2844: **
! 2845: ** For an encrypted database, the situation is more complex: bytes
! 2846: ** 24..39 of the database are white noise. But the probability of
! 2847: ** white noising equaling 16 bytes of 0xff is vanishingly small so
! 2848: ** we should still be ok.
! 2849: */
! 2850: memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers));
! 2851: }else{
! 2852: u8 *dbFileVers = &((u8*)pPg->pData)[24];
! 2853: memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers));
! 2854: }
! 2855: }
! 2856: CODEC1(pPager, pPg->pData, pgno, 3, rc = SQLITE_NOMEM);
! 2857:
! 2858: PAGER_INCR(sqlite3_pager_readdb_count);
! 2859: PAGER_INCR(pPager->nRead);
! 2860: IOTRACE(("PGIN %p %d\n", pPager, pgno));
! 2861: PAGERTRACE(("FETCH %d page %d hash(%08x)\n",
! 2862: PAGERID(pPager), pgno, pager_pagehash(pPg)));
! 2863:
! 2864: return rc;
! 2865: }
! 2866:
! 2867: /*
! 2868: ** Update the value of the change-counter at offsets 24 and 92 in
! 2869: ** the header and the sqlite version number at offset 96.
! 2870: **
! 2871: ** This is an unconditional update. See also the pager_incr_changecounter()
! 2872: ** routine which only updates the change-counter if the update is actually
! 2873: ** needed, as determined by the pPager->changeCountDone state variable.
! 2874: */
! 2875: static void pager_write_changecounter(PgHdr *pPg){
! 2876: u32 change_counter;
! 2877:
! 2878: /* Increment the value just read and write it back to byte 24. */
! 2879: change_counter = sqlite3Get4byte((u8*)pPg->pPager->dbFileVers)+1;
! 2880: put32bits(((char*)pPg->pData)+24, change_counter);
! 2881:
! 2882: /* Also store the SQLite version number in bytes 96..99 and in
! 2883: ** bytes 92..95 store the change counter for which the version number
! 2884: ** is valid. */
! 2885: put32bits(((char*)pPg->pData)+92, change_counter);
! 2886: put32bits(((char*)pPg->pData)+96, SQLITE_VERSION_NUMBER);
! 2887: }
! 2888:
! 2889: #ifndef SQLITE_OMIT_WAL
! 2890: /*
! 2891: ** This function is invoked once for each page that has already been
! 2892: ** written into the log file when a WAL transaction is rolled back.
! 2893: ** Parameter iPg is the page number of said page. The pCtx argument
! 2894: ** is actually a pointer to the Pager structure.
! 2895: **
! 2896: ** If page iPg is present in the cache, and has no outstanding references,
! 2897: ** it is discarded. Otherwise, if there are one or more outstanding
! 2898: ** references, the page content is reloaded from the database. If the
! 2899: ** attempt to reload content from the database is required and fails,
! 2900: ** return an SQLite error code. Otherwise, SQLITE_OK.
! 2901: */
! 2902: static int pagerUndoCallback(void *pCtx, Pgno iPg){
! 2903: int rc = SQLITE_OK;
! 2904: Pager *pPager = (Pager *)pCtx;
! 2905: PgHdr *pPg;
! 2906:
! 2907: pPg = sqlite3PagerLookup(pPager, iPg);
! 2908: if( pPg ){
! 2909: if( sqlite3PcachePageRefcount(pPg)==1 ){
! 2910: sqlite3PcacheDrop(pPg);
! 2911: }else{
! 2912: rc = readDbPage(pPg);
! 2913: if( rc==SQLITE_OK ){
! 2914: pPager->xReiniter(pPg);
! 2915: }
! 2916: sqlite3PagerUnref(pPg);
! 2917: }
! 2918: }
! 2919:
! 2920: /* Normally, if a transaction is rolled back, any backup processes are
! 2921: ** updated as data is copied out of the rollback journal and into the
! 2922: ** database. This is not generally possible with a WAL database, as
! 2923: ** rollback involves simply truncating the log file. Therefore, if one
! 2924: ** or more frames have already been written to the log (and therefore
! 2925: ** also copied into the backup databases) as part of this transaction,
! 2926: ** the backups must be restarted.
! 2927: */
! 2928: sqlite3BackupRestart(pPager->pBackup);
! 2929:
! 2930: return rc;
! 2931: }
! 2932:
! 2933: /*
! 2934: ** This function is called to rollback a transaction on a WAL database.
! 2935: */
! 2936: static int pagerRollbackWal(Pager *pPager){
! 2937: int rc; /* Return Code */
! 2938: PgHdr *pList; /* List of dirty pages to revert */
! 2939:
! 2940: /* For all pages in the cache that are currently dirty or have already
! 2941: ** been written (but not committed) to the log file, do one of the
! 2942: ** following:
! 2943: **
! 2944: ** + Discard the cached page (if refcount==0), or
! 2945: ** + Reload page content from the database (if refcount>0).
! 2946: */
! 2947: pPager->dbSize = pPager->dbOrigSize;
! 2948: rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager);
! 2949: pList = sqlite3PcacheDirtyList(pPager->pPCache);
! 2950: while( pList && rc==SQLITE_OK ){
! 2951: PgHdr *pNext = pList->pDirty;
! 2952: rc = pagerUndoCallback((void *)pPager, pList->pgno);
! 2953: pList = pNext;
! 2954: }
! 2955:
! 2956: return rc;
! 2957: }
! 2958:
! 2959: /*
! 2960: ** This function is a wrapper around sqlite3WalFrames(). As well as logging
! 2961: ** the contents of the list of pages headed by pList (connected by pDirty),
! 2962: ** this function notifies any active backup processes that the pages have
! 2963: ** changed.
! 2964: **
! 2965: ** The list of pages passed into this routine is always sorted by page number.
! 2966: ** Hence, if page 1 appears anywhere on the list, it will be the first page.
! 2967: */
! 2968: static int pagerWalFrames(
! 2969: Pager *pPager, /* Pager object */
! 2970: PgHdr *pList, /* List of frames to log */
! 2971: Pgno nTruncate, /* Database size after this commit */
! 2972: int isCommit /* True if this is a commit */
! 2973: ){
! 2974: int rc; /* Return code */
! 2975: #if defined(SQLITE_DEBUG) || defined(SQLITE_CHECK_PAGES)
! 2976: PgHdr *p; /* For looping over pages */
! 2977: #endif
! 2978:
! 2979: assert( pPager->pWal );
! 2980: assert( pList );
! 2981: #ifdef SQLITE_DEBUG
! 2982: /* Verify that the page list is in accending order */
! 2983: for(p=pList; p && p->pDirty; p=p->pDirty){
! 2984: assert( p->pgno < p->pDirty->pgno );
! 2985: }
! 2986: #endif
! 2987:
! 2988: if( isCommit ){
! 2989: /* If a WAL transaction is being committed, there is no point in writing
! 2990: ** any pages with page numbers greater than nTruncate into the WAL file.
! 2991: ** They will never be read by any client. So remove them from the pDirty
! 2992: ** list here. */
! 2993: PgHdr *p;
! 2994: PgHdr **ppNext = &pList;
! 2995: for(p=pList; (*ppNext = p); p=p->pDirty){
! 2996: if( p->pgno<=nTruncate ) ppNext = &p->pDirty;
! 2997: }
! 2998: assert( pList );
! 2999: }
! 3000:
! 3001: if( pList->pgno==1 ) pager_write_changecounter(pList);
! 3002: rc = sqlite3WalFrames(pPager->pWal,
! 3003: pPager->pageSize, pList, nTruncate, isCommit, pPager->walSyncFlags
! 3004: );
! 3005: if( rc==SQLITE_OK && pPager->pBackup ){
! 3006: PgHdr *p;
! 3007: for(p=pList; p; p=p->pDirty){
! 3008: sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData);
! 3009: }
! 3010: }
! 3011:
! 3012: #ifdef SQLITE_CHECK_PAGES
! 3013: pList = sqlite3PcacheDirtyList(pPager->pPCache);
! 3014: for(p=pList; p; p=p->pDirty){
! 3015: pager_set_pagehash(p);
! 3016: }
! 3017: #endif
! 3018:
! 3019: return rc;
! 3020: }
! 3021:
! 3022: /*
! 3023: ** Begin a read transaction on the WAL.
! 3024: **
! 3025: ** This routine used to be called "pagerOpenSnapshot()" because it essentially
! 3026: ** makes a snapshot of the database at the current point in time and preserves
! 3027: ** that snapshot for use by the reader in spite of concurrently changes by
! 3028: ** other writers or checkpointers.
! 3029: */
! 3030: static int pagerBeginReadTransaction(Pager *pPager){
! 3031: int rc; /* Return code */
! 3032: int changed = 0; /* True if cache must be reset */
! 3033:
! 3034: assert( pagerUseWal(pPager) );
! 3035: assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER );
! 3036:
! 3037: /* sqlite3WalEndReadTransaction() was not called for the previous
! 3038: ** transaction in locking_mode=EXCLUSIVE. So call it now. If we
! 3039: ** are in locking_mode=NORMAL and EndRead() was previously called,
! 3040: ** the duplicate call is harmless.
! 3041: */
! 3042: sqlite3WalEndReadTransaction(pPager->pWal);
! 3043:
! 3044: rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed);
! 3045: if( rc!=SQLITE_OK || changed ){
! 3046: pager_reset(pPager);
! 3047: }
! 3048:
! 3049: return rc;
! 3050: }
! 3051: #endif
! 3052:
! 3053: /*
! 3054: ** This function is called as part of the transition from PAGER_OPEN
! 3055: ** to PAGER_READER state to determine the size of the database file
! 3056: ** in pages (assuming the page size currently stored in Pager.pageSize).
! 3057: **
! 3058: ** If no error occurs, SQLITE_OK is returned and the size of the database
! 3059: ** in pages is stored in *pnPage. Otherwise, an error code (perhaps
! 3060: ** SQLITE_IOERR_FSTAT) is returned and *pnPage is left unmodified.
! 3061: */
! 3062: static int pagerPagecount(Pager *pPager, Pgno *pnPage){
! 3063: Pgno nPage; /* Value to return via *pnPage */
! 3064:
! 3065: /* Query the WAL sub-system for the database size. The WalDbsize()
! 3066: ** function returns zero if the WAL is not open (i.e. Pager.pWal==0), or
! 3067: ** if the database size is not available. The database size is not
! 3068: ** available from the WAL sub-system if the log file is empty or
! 3069: ** contains no valid committed transactions.
! 3070: */
! 3071: assert( pPager->eState==PAGER_OPEN );
! 3072: assert( pPager->eLock>=SHARED_LOCK || pPager->noReadlock );
! 3073: nPage = sqlite3WalDbsize(pPager->pWal);
! 3074:
! 3075: /* If the database size was not available from the WAL sub-system,
! 3076: ** determine it based on the size of the database file. If the size
! 3077: ** of the database file is not an integer multiple of the page-size,
! 3078: ** round down to the nearest page. Except, any file larger than 0
! 3079: ** bytes in size is considered to contain at least one page.
! 3080: */
! 3081: if( nPage==0 ){
! 3082: i64 n = 0; /* Size of db file in bytes */
! 3083: assert( isOpen(pPager->fd) || pPager->tempFile );
! 3084: if( isOpen(pPager->fd) ){
! 3085: int rc = sqlite3OsFileSize(pPager->fd, &n);
! 3086: if( rc!=SQLITE_OK ){
! 3087: return rc;
! 3088: }
! 3089: }
! 3090: nPage = (Pgno)((n+pPager->pageSize-1) / pPager->pageSize);
! 3091: }
! 3092:
! 3093: /* If the current number of pages in the file is greater than the
! 3094: ** configured maximum pager number, increase the allowed limit so
! 3095: ** that the file can be read.
! 3096: */
! 3097: if( nPage>pPager->mxPgno ){
! 3098: pPager->mxPgno = (Pgno)nPage;
! 3099: }
! 3100:
! 3101: *pnPage = nPage;
! 3102: return SQLITE_OK;
! 3103: }
! 3104:
! 3105: #ifndef SQLITE_OMIT_WAL
! 3106: /*
! 3107: ** Check if the *-wal file that corresponds to the database opened by pPager
! 3108: ** exists if the database is not empy, or verify that the *-wal file does
! 3109: ** not exist (by deleting it) if the database file is empty.
! 3110: **
! 3111: ** If the database is not empty and the *-wal file exists, open the pager
! 3112: ** in WAL mode. If the database is empty or if no *-wal file exists and
! 3113: ** if no error occurs, make sure Pager.journalMode is not set to
! 3114: ** PAGER_JOURNALMODE_WAL.
! 3115: **
! 3116: ** Return SQLITE_OK or an error code.
! 3117: **
! 3118: ** The caller must hold a SHARED lock on the database file to call this
! 3119: ** function. Because an EXCLUSIVE lock on the db file is required to delete
! 3120: ** a WAL on a none-empty database, this ensures there is no race condition
! 3121: ** between the xAccess() below and an xDelete() being executed by some
! 3122: ** other connection.
! 3123: */
! 3124: static int pagerOpenWalIfPresent(Pager *pPager){
! 3125: int rc = SQLITE_OK;
! 3126: assert( pPager->eState==PAGER_OPEN );
! 3127: assert( pPager->eLock>=SHARED_LOCK || pPager->noReadlock );
! 3128:
! 3129: if( !pPager->tempFile ){
! 3130: int isWal; /* True if WAL file exists */
! 3131: Pgno nPage; /* Size of the database file */
! 3132:
! 3133: rc = pagerPagecount(pPager, &nPage);
! 3134: if( rc ) return rc;
! 3135: if( nPage==0 ){
! 3136: rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0);
! 3137: isWal = 0;
! 3138: }else{
! 3139: rc = sqlite3OsAccess(
! 3140: pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &isWal
! 3141: );
! 3142: }
! 3143: if( rc==SQLITE_OK ){
! 3144: if( isWal ){
! 3145: testcase( sqlite3PcachePagecount(pPager->pPCache)==0 );
! 3146: rc = sqlite3PagerOpenWal(pPager, 0);
! 3147: }else if( pPager->journalMode==PAGER_JOURNALMODE_WAL ){
! 3148: pPager->journalMode = PAGER_JOURNALMODE_DELETE;
! 3149: }
! 3150: }
! 3151: }
! 3152: return rc;
! 3153: }
! 3154: #endif
! 3155:
! 3156: /*
! 3157: ** Playback savepoint pSavepoint. Or, if pSavepoint==NULL, then playback
! 3158: ** the entire master journal file. The case pSavepoint==NULL occurs when
! 3159: ** a ROLLBACK TO command is invoked on a SAVEPOINT that is a transaction
! 3160: ** savepoint.
! 3161: **
! 3162: ** When pSavepoint is not NULL (meaning a non-transaction savepoint is
! 3163: ** being rolled back), then the rollback consists of up to three stages,
! 3164: ** performed in the order specified:
! 3165: **
! 3166: ** * Pages are played back from the main journal starting at byte
! 3167: ** offset PagerSavepoint.iOffset and continuing to
! 3168: ** PagerSavepoint.iHdrOffset, or to the end of the main journal
! 3169: ** file if PagerSavepoint.iHdrOffset is zero.
! 3170: **
! 3171: ** * If PagerSavepoint.iHdrOffset is not zero, then pages are played
! 3172: ** back starting from the journal header immediately following
! 3173: ** PagerSavepoint.iHdrOffset to the end of the main journal file.
! 3174: **
! 3175: ** * Pages are then played back from the sub-journal file, starting
! 3176: ** with the PagerSavepoint.iSubRec and continuing to the end of
! 3177: ** the journal file.
! 3178: **
! 3179: ** Throughout the rollback process, each time a page is rolled back, the
! 3180: ** corresponding bit is set in a bitvec structure (variable pDone in the
! 3181: ** implementation below). This is used to ensure that a page is only
! 3182: ** rolled back the first time it is encountered in either journal.
! 3183: **
! 3184: ** If pSavepoint is NULL, then pages are only played back from the main
! 3185: ** journal file. There is no need for a bitvec in this case.
! 3186: **
! 3187: ** In either case, before playback commences the Pager.dbSize variable
! 3188: ** is reset to the value that it held at the start of the savepoint
! 3189: ** (or transaction). No page with a page-number greater than this value
! 3190: ** is played back. If one is encountered it is simply skipped.
! 3191: */
! 3192: static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){
! 3193: i64 szJ; /* Effective size of the main journal */
! 3194: i64 iHdrOff; /* End of first segment of main-journal records */
! 3195: int rc = SQLITE_OK; /* Return code */
! 3196: Bitvec *pDone = 0; /* Bitvec to ensure pages played back only once */
! 3197:
! 3198: assert( pPager->eState!=PAGER_ERROR );
! 3199: assert( pPager->eState>=PAGER_WRITER_LOCKED );
! 3200:
! 3201: /* Allocate a bitvec to use to store the set of pages rolled back */
! 3202: if( pSavepoint ){
! 3203: pDone = sqlite3BitvecCreate(pSavepoint->nOrig);
! 3204: if( !pDone ){
! 3205: return SQLITE_NOMEM;
! 3206: }
! 3207: }
! 3208:
! 3209: /* Set the database size back to the value it was before the savepoint
! 3210: ** being reverted was opened.
! 3211: */
! 3212: pPager->dbSize = pSavepoint ? pSavepoint->nOrig : pPager->dbOrigSize;
! 3213: pPager->changeCountDone = pPager->tempFile;
! 3214:
! 3215: if( !pSavepoint && pagerUseWal(pPager) ){
! 3216: return pagerRollbackWal(pPager);
! 3217: }
! 3218:
! 3219: /* Use pPager->journalOff as the effective size of the main rollback
! 3220: ** journal. The actual file might be larger than this in
! 3221: ** PAGER_JOURNALMODE_TRUNCATE or PAGER_JOURNALMODE_PERSIST. But anything
! 3222: ** past pPager->journalOff is off-limits to us.
! 3223: */
! 3224: szJ = pPager->journalOff;
! 3225: assert( pagerUseWal(pPager)==0 || szJ==0 );
! 3226:
! 3227: /* Begin by rolling back records from the main journal starting at
! 3228: ** PagerSavepoint.iOffset and continuing to the next journal header.
! 3229: ** There might be records in the main journal that have a page number
! 3230: ** greater than the current database size (pPager->dbSize) but those
! 3231: ** will be skipped automatically. Pages are added to pDone as they
! 3232: ** are played back.
! 3233: */
! 3234: if( pSavepoint && !pagerUseWal(pPager) ){
! 3235: iHdrOff = pSavepoint->iHdrOffset ? pSavepoint->iHdrOffset : szJ;
! 3236: pPager->journalOff = pSavepoint->iOffset;
! 3237: while( rc==SQLITE_OK && pPager->journalOff<iHdrOff ){
! 3238: rc = pager_playback_one_page(pPager, &pPager->journalOff, pDone, 1, 1);
! 3239: }
! 3240: assert( rc!=SQLITE_DONE );
! 3241: }else{
! 3242: pPager->journalOff = 0;
! 3243: }
! 3244:
! 3245: /* Continue rolling back records out of the main journal starting at
! 3246: ** the first journal header seen and continuing until the effective end
! 3247: ** of the main journal file. Continue to skip out-of-range pages and
! 3248: ** continue adding pages rolled back to pDone.
! 3249: */
! 3250: while( rc==SQLITE_OK && pPager->journalOff<szJ ){
! 3251: u32 ii; /* Loop counter */
! 3252: u32 nJRec = 0; /* Number of Journal Records */
! 3253: u32 dummy;
! 3254: rc = readJournalHdr(pPager, 0, szJ, &nJRec, &dummy);
! 3255: assert( rc!=SQLITE_DONE );
! 3256:
! 3257: /*
! 3258: ** The "pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff"
! 3259: ** test is related to ticket #2565. See the discussion in the
! 3260: ** pager_playback() function for additional information.
! 3261: */
! 3262: if( nJRec==0
! 3263: && pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff
! 3264: ){
! 3265: nJRec = (u32)((szJ - pPager->journalOff)/JOURNAL_PG_SZ(pPager));
! 3266: }
! 3267: for(ii=0; rc==SQLITE_OK && ii<nJRec && pPager->journalOff<szJ; ii++){
! 3268: rc = pager_playback_one_page(pPager, &pPager->journalOff, pDone, 1, 1);
! 3269: }
! 3270: assert( rc!=SQLITE_DONE );
! 3271: }
! 3272: assert( rc!=SQLITE_OK || pPager->journalOff>=szJ );
! 3273:
! 3274: /* Finally, rollback pages from the sub-journal. Page that were
! 3275: ** previously rolled back out of the main journal (and are hence in pDone)
! 3276: ** will be skipped. Out-of-range pages are also skipped.
! 3277: */
! 3278: if( pSavepoint ){
! 3279: u32 ii; /* Loop counter */
! 3280: i64 offset = (i64)pSavepoint->iSubRec*(4+pPager->pageSize);
! 3281:
! 3282: if( pagerUseWal(pPager) ){
! 3283: rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData);
! 3284: }
! 3285: for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && ii<pPager->nSubRec; ii++){
! 3286: assert( offset==(i64)ii*(4+pPager->pageSize) );
! 3287: rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1);
! 3288: }
! 3289: assert( rc!=SQLITE_DONE );
! 3290: }
! 3291:
! 3292: sqlite3BitvecDestroy(pDone);
! 3293: if( rc==SQLITE_OK ){
! 3294: pPager->journalOff = szJ;
! 3295: }
! 3296:
! 3297: return rc;
! 3298: }
! 3299:
! 3300: /*
! 3301: ** Change the maximum number of in-memory pages that are allowed.
! 3302: */
! 3303: void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){
! 3304: sqlite3PcacheSetCachesize(pPager->pPCache, mxPage);
! 3305: }
! 3306:
! 3307: /*
! 3308: ** Free as much memory as possible from the pager.
! 3309: */
! 3310: void sqlite3PagerShrink(Pager *pPager){
! 3311: sqlite3PcacheShrink(pPager->pPCache);
! 3312: }
! 3313:
! 3314: /*
! 3315: ** Adjust the robustness of the database to damage due to OS crashes
! 3316: ** or power failures by changing the number of syncs()s when writing
! 3317: ** the rollback journal. There are three levels:
! 3318: **
! 3319: ** OFF sqlite3OsSync() is never called. This is the default
! 3320: ** for temporary and transient files.
! 3321: **
! 3322: ** NORMAL The journal is synced once before writes begin on the
! 3323: ** database. This is normally adequate protection, but
! 3324: ** it is theoretically possible, though very unlikely,
! 3325: ** that an inopertune power failure could leave the journal
! 3326: ** in a state which would cause damage to the database
! 3327: ** when it is rolled back.
! 3328: **
! 3329: ** FULL The journal is synced twice before writes begin on the
! 3330: ** database (with some additional information - the nRec field
! 3331: ** of the journal header - being written in between the two
! 3332: ** syncs). If we assume that writing a
! 3333: ** single disk sector is atomic, then this mode provides
! 3334: ** assurance that the journal will not be corrupted to the
! 3335: ** point of causing damage to the database during rollback.
! 3336: **
! 3337: ** The above is for a rollback-journal mode. For WAL mode, OFF continues
! 3338: ** to mean that no syncs ever occur. NORMAL means that the WAL is synced
! 3339: ** prior to the start of checkpoint and that the database file is synced
! 3340: ** at the conclusion of the checkpoint if the entire content of the WAL
! 3341: ** was written back into the database. But no sync operations occur for
! 3342: ** an ordinary commit in NORMAL mode with WAL. FULL means that the WAL
! 3343: ** file is synced following each commit operation, in addition to the
! 3344: ** syncs associated with NORMAL.
! 3345: **
! 3346: ** Do not confuse synchronous=FULL with SQLITE_SYNC_FULL. The
! 3347: ** SQLITE_SYNC_FULL macro means to use the MacOSX-style full-fsync
! 3348: ** using fcntl(F_FULLFSYNC). SQLITE_SYNC_NORMAL means to do an
! 3349: ** ordinary fsync() call. There is no difference between SQLITE_SYNC_FULL
! 3350: ** and SQLITE_SYNC_NORMAL on platforms other than MacOSX. But the
! 3351: ** synchronous=FULL versus synchronous=NORMAL setting determines when
! 3352: ** the xSync primitive is called and is relevant to all platforms.
! 3353: **
! 3354: ** Numeric values associated with these states are OFF==1, NORMAL=2,
! 3355: ** and FULL=3.
! 3356: */
! 3357: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
! 3358: void sqlite3PagerSetSafetyLevel(
! 3359: Pager *pPager, /* The pager to set safety level for */
! 3360: int level, /* PRAGMA synchronous. 1=OFF, 2=NORMAL, 3=FULL */
! 3361: int bFullFsync, /* PRAGMA fullfsync */
! 3362: int bCkptFullFsync /* PRAGMA checkpoint_fullfsync */
! 3363: ){
! 3364: assert( level>=1 && level<=3 );
! 3365: pPager->noSync = (level==1 || pPager->tempFile) ?1:0;
! 3366: pPager->fullSync = (level==3 && !pPager->tempFile) ?1:0;
! 3367: if( pPager->noSync ){
! 3368: pPager->syncFlags = 0;
! 3369: pPager->ckptSyncFlags = 0;
! 3370: }else if( bFullFsync ){
! 3371: pPager->syncFlags = SQLITE_SYNC_FULL;
! 3372: pPager->ckptSyncFlags = SQLITE_SYNC_FULL;
! 3373: }else if( bCkptFullFsync ){
! 3374: pPager->syncFlags = SQLITE_SYNC_NORMAL;
! 3375: pPager->ckptSyncFlags = SQLITE_SYNC_FULL;
! 3376: }else{
! 3377: pPager->syncFlags = SQLITE_SYNC_NORMAL;
! 3378: pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL;
! 3379: }
! 3380: pPager->walSyncFlags = pPager->syncFlags;
! 3381: if( pPager->fullSync ){
! 3382: pPager->walSyncFlags |= WAL_SYNC_TRANSACTIONS;
! 3383: }
! 3384: }
! 3385: #endif
! 3386:
! 3387: /*
! 3388: ** The following global variable is incremented whenever the library
! 3389: ** attempts to open a temporary file. This information is used for
! 3390: ** testing and analysis only.
! 3391: */
! 3392: #ifdef SQLITE_TEST
! 3393: int sqlite3_opentemp_count = 0;
! 3394: #endif
! 3395:
! 3396: /*
! 3397: ** Open a temporary file.
! 3398: **
! 3399: ** Write the file descriptor into *pFile. Return SQLITE_OK on success
! 3400: ** or some other error code if we fail. The OS will automatically
! 3401: ** delete the temporary file when it is closed.
! 3402: **
! 3403: ** The flags passed to the VFS layer xOpen() call are those specified
! 3404: ** by parameter vfsFlags ORed with the following:
! 3405: **
! 3406: ** SQLITE_OPEN_READWRITE
! 3407: ** SQLITE_OPEN_CREATE
! 3408: ** SQLITE_OPEN_EXCLUSIVE
! 3409: ** SQLITE_OPEN_DELETEONCLOSE
! 3410: */
! 3411: static int pagerOpentemp(
! 3412: Pager *pPager, /* The pager object */
! 3413: sqlite3_file *pFile, /* Write the file descriptor here */
! 3414: int vfsFlags /* Flags passed through to the VFS */
! 3415: ){
! 3416: int rc; /* Return code */
! 3417:
! 3418: #ifdef SQLITE_TEST
! 3419: sqlite3_opentemp_count++; /* Used for testing and analysis only */
! 3420: #endif
! 3421:
! 3422: vfsFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
! 3423: SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE;
! 3424: rc = sqlite3OsOpen(pPager->pVfs, 0, pFile, vfsFlags, 0);
! 3425: assert( rc!=SQLITE_OK || isOpen(pFile) );
! 3426: return rc;
! 3427: }
! 3428:
! 3429: /*
! 3430: ** Set the busy handler function.
! 3431: **
! 3432: ** The pager invokes the busy-handler if sqlite3OsLock() returns
! 3433: ** SQLITE_BUSY when trying to upgrade from no-lock to a SHARED lock,
! 3434: ** or when trying to upgrade from a RESERVED lock to an EXCLUSIVE
! 3435: ** lock. It does *not* invoke the busy handler when upgrading from
! 3436: ** SHARED to RESERVED, or when upgrading from SHARED to EXCLUSIVE
! 3437: ** (which occurs during hot-journal rollback). Summary:
! 3438: **
! 3439: ** Transition | Invokes xBusyHandler
! 3440: ** --------------------------------------------------------
! 3441: ** NO_LOCK -> SHARED_LOCK | Yes
! 3442: ** SHARED_LOCK -> RESERVED_LOCK | No
! 3443: ** SHARED_LOCK -> EXCLUSIVE_LOCK | No
! 3444: ** RESERVED_LOCK -> EXCLUSIVE_LOCK | Yes
! 3445: **
! 3446: ** If the busy-handler callback returns non-zero, the lock is
! 3447: ** retried. If it returns zero, then the SQLITE_BUSY error is
! 3448: ** returned to the caller of the pager API function.
! 3449: */
! 3450: void sqlite3PagerSetBusyhandler(
! 3451: Pager *pPager, /* Pager object */
! 3452: int (*xBusyHandler)(void *), /* Pointer to busy-handler function */
! 3453: void *pBusyHandlerArg /* Argument to pass to xBusyHandler */
! 3454: ){
! 3455: pPager->xBusyHandler = xBusyHandler;
! 3456: pPager->pBusyHandlerArg = pBusyHandlerArg;
! 3457: }
! 3458:
! 3459: /*
! 3460: ** Change the page size used by the Pager object. The new page size
! 3461: ** is passed in *pPageSize.
! 3462: **
! 3463: ** If the pager is in the error state when this function is called, it
! 3464: ** is a no-op. The value returned is the error state error code (i.e.
! 3465: ** one of SQLITE_IOERR, an SQLITE_IOERR_xxx sub-code or SQLITE_FULL).
! 3466: **
! 3467: ** Otherwise, if all of the following are true:
! 3468: **
! 3469: ** * the new page size (value of *pPageSize) is valid (a power
! 3470: ** of two between 512 and SQLITE_MAX_PAGE_SIZE, inclusive), and
! 3471: **
! 3472: ** * there are no outstanding page references, and
! 3473: **
! 3474: ** * the database is either not an in-memory database or it is
! 3475: ** an in-memory database that currently consists of zero pages.
! 3476: **
! 3477: ** then the pager object page size is set to *pPageSize.
! 3478: **
! 3479: ** If the page size is changed, then this function uses sqlite3PagerMalloc()
! 3480: ** to obtain a new Pager.pTmpSpace buffer. If this allocation attempt
! 3481: ** fails, SQLITE_NOMEM is returned and the page size remains unchanged.
! 3482: ** In all other cases, SQLITE_OK is returned.
! 3483: **
! 3484: ** If the page size is not changed, either because one of the enumerated
! 3485: ** conditions above is not true, the pager was in error state when this
! 3486: ** function was called, or because the memory allocation attempt failed,
! 3487: ** then *pPageSize is set to the old, retained page size before returning.
! 3488: */
! 3489: int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){
! 3490: int rc = SQLITE_OK;
! 3491:
! 3492: /* It is not possible to do a full assert_pager_state() here, as this
! 3493: ** function may be called from within PagerOpen(), before the state
! 3494: ** of the Pager object is internally consistent.
! 3495: **
! 3496: ** At one point this function returned an error if the pager was in
! 3497: ** PAGER_ERROR state. But since PAGER_ERROR state guarantees that
! 3498: ** there is at least one outstanding page reference, this function
! 3499: ** is a no-op for that case anyhow.
! 3500: */
! 3501:
! 3502: u32 pageSize = *pPageSize;
! 3503: assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) );
! 3504: if( (pPager->memDb==0 || pPager->dbSize==0)
! 3505: && sqlite3PcacheRefCount(pPager->pPCache)==0
! 3506: && pageSize && pageSize!=(u32)pPager->pageSize
! 3507: ){
! 3508: char *pNew = NULL; /* New temp space */
! 3509: i64 nByte = 0;
! 3510:
! 3511: if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){
! 3512: rc = sqlite3OsFileSize(pPager->fd, &nByte);
! 3513: }
! 3514: if( rc==SQLITE_OK ){
! 3515: pNew = (char *)sqlite3PageMalloc(pageSize);
! 3516: if( !pNew ) rc = SQLITE_NOMEM;
! 3517: }
! 3518:
! 3519: if( rc==SQLITE_OK ){
! 3520: pager_reset(pPager);
! 3521: pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize);
! 3522: pPager->pageSize = pageSize;
! 3523: sqlite3PageFree(pPager->pTmpSpace);
! 3524: pPager->pTmpSpace = pNew;
! 3525: sqlite3PcacheSetPageSize(pPager->pPCache, pageSize);
! 3526: }
! 3527: }
! 3528:
! 3529: *pPageSize = pPager->pageSize;
! 3530: if( rc==SQLITE_OK ){
! 3531: if( nReserve<0 ) nReserve = pPager->nReserve;
! 3532: assert( nReserve>=0 && nReserve<1000 );
! 3533: pPager->nReserve = (i16)nReserve;
! 3534: pagerReportSize(pPager);
! 3535: }
! 3536: return rc;
! 3537: }
! 3538:
! 3539: /*
! 3540: ** Return a pointer to the "temporary page" buffer held internally
! 3541: ** by the pager. This is a buffer that is big enough to hold the
! 3542: ** entire content of a database page. This buffer is used internally
! 3543: ** during rollback and will be overwritten whenever a rollback
! 3544: ** occurs. But other modules are free to use it too, as long as
! 3545: ** no rollbacks are happening.
! 3546: */
! 3547: void *sqlite3PagerTempSpace(Pager *pPager){
! 3548: return pPager->pTmpSpace;
! 3549: }
! 3550:
! 3551: /*
! 3552: ** Attempt to set the maximum database page count if mxPage is positive.
! 3553: ** Make no changes if mxPage is zero or negative. And never reduce the
! 3554: ** maximum page count below the current size of the database.
! 3555: **
! 3556: ** Regardless of mxPage, return the current maximum page count.
! 3557: */
! 3558: int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){
! 3559: if( mxPage>0 ){
! 3560: pPager->mxPgno = mxPage;
! 3561: }
! 3562: assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */
! 3563: assert( pPager->mxPgno>=pPager->dbSize ); /* OP_MaxPgcnt enforces this */
! 3564: return pPager->mxPgno;
! 3565: }
! 3566:
! 3567: /*
! 3568: ** The following set of routines are used to disable the simulated
! 3569: ** I/O error mechanism. These routines are used to avoid simulated
! 3570: ** errors in places where we do not care about errors.
! 3571: **
! 3572: ** Unless -DSQLITE_TEST=1 is used, these routines are all no-ops
! 3573: ** and generate no code.
! 3574: */
! 3575: #ifdef SQLITE_TEST
! 3576: extern int sqlite3_io_error_pending;
! 3577: extern int sqlite3_io_error_hit;
! 3578: static int saved_cnt;
! 3579: void disable_simulated_io_errors(void){
! 3580: saved_cnt = sqlite3_io_error_pending;
! 3581: sqlite3_io_error_pending = -1;
! 3582: }
! 3583: void enable_simulated_io_errors(void){
! 3584: sqlite3_io_error_pending = saved_cnt;
! 3585: }
! 3586: #else
! 3587: # define disable_simulated_io_errors()
! 3588: # define enable_simulated_io_errors()
! 3589: #endif
! 3590:
! 3591: /*
! 3592: ** Read the first N bytes from the beginning of the file into memory
! 3593: ** that pDest points to.
! 3594: **
! 3595: ** If the pager was opened on a transient file (zFilename==""), or
! 3596: ** opened on a file less than N bytes in size, the output buffer is
! 3597: ** zeroed and SQLITE_OK returned. The rationale for this is that this
! 3598: ** function is used to read database headers, and a new transient or
! 3599: ** zero sized database has a header than consists entirely of zeroes.
! 3600: **
! 3601: ** If any IO error apart from SQLITE_IOERR_SHORT_READ is encountered,
! 3602: ** the error code is returned to the caller and the contents of the
! 3603: ** output buffer undefined.
! 3604: */
! 3605: int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned char *pDest){
! 3606: int rc = SQLITE_OK;
! 3607: memset(pDest, 0, N);
! 3608: assert( isOpen(pPager->fd) || pPager->tempFile );
! 3609:
! 3610: /* This routine is only called by btree immediately after creating
! 3611: ** the Pager object. There has not been an opportunity to transition
! 3612: ** to WAL mode yet.
! 3613: */
! 3614: assert( !pagerUseWal(pPager) );
! 3615:
! 3616: if( isOpen(pPager->fd) ){
! 3617: IOTRACE(("DBHDR %p 0 %d\n", pPager, N))
! 3618: rc = sqlite3OsRead(pPager->fd, pDest, N, 0);
! 3619: if( rc==SQLITE_IOERR_SHORT_READ ){
! 3620: rc = SQLITE_OK;
! 3621: }
! 3622: }
! 3623: return rc;
! 3624: }
! 3625:
! 3626: /*
! 3627: ** This function may only be called when a read-transaction is open on
! 3628: ** the pager. It returns the total number of pages in the database.
! 3629: **
! 3630: ** However, if the file is between 1 and <page-size> bytes in size, then
! 3631: ** this is considered a 1 page file.
! 3632: */
! 3633: void sqlite3PagerPagecount(Pager *pPager, int *pnPage){
! 3634: assert( pPager->eState>=PAGER_READER );
! 3635: assert( pPager->eState!=PAGER_WRITER_FINISHED );
! 3636: *pnPage = (int)pPager->dbSize;
! 3637: }
! 3638:
! 3639:
! 3640: /*
! 3641: ** Try to obtain a lock of type locktype on the database file. If
! 3642: ** a similar or greater lock is already held, this function is a no-op
! 3643: ** (returning SQLITE_OK immediately).
! 3644: **
! 3645: ** Otherwise, attempt to obtain the lock using sqlite3OsLock(). Invoke
! 3646: ** the busy callback if the lock is currently not available. Repeat
! 3647: ** until the busy callback returns false or until the attempt to
! 3648: ** obtain the lock succeeds.
! 3649: **
! 3650: ** Return SQLITE_OK on success and an error code if we cannot obtain
! 3651: ** the lock. If the lock is obtained successfully, set the Pager.state
! 3652: ** variable to locktype before returning.
! 3653: */
! 3654: static int pager_wait_on_lock(Pager *pPager, int locktype){
! 3655: int rc; /* Return code */
! 3656:
! 3657: /* Check that this is either a no-op (because the requested lock is
! 3658: ** already held, or one of the transistions that the busy-handler
! 3659: ** may be invoked during, according to the comment above
! 3660: ** sqlite3PagerSetBusyhandler().
! 3661: */
! 3662: assert( (pPager->eLock>=locktype)
! 3663: || (pPager->eLock==NO_LOCK && locktype==SHARED_LOCK)
! 3664: || (pPager->eLock==RESERVED_LOCK && locktype==EXCLUSIVE_LOCK)
! 3665: );
! 3666:
! 3667: do {
! 3668: rc = pagerLockDb(pPager, locktype);
! 3669: }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) );
! 3670: return rc;
! 3671: }
! 3672:
! 3673: /*
! 3674: ** Function assertTruncateConstraint(pPager) checks that one of the
! 3675: ** following is true for all dirty pages currently in the page-cache:
! 3676: **
! 3677: ** a) The page number is less than or equal to the size of the
! 3678: ** current database image, in pages, OR
! 3679: **
! 3680: ** b) if the page content were written at this time, it would not
! 3681: ** be necessary to write the current content out to the sub-journal
! 3682: ** (as determined by function subjRequiresPage()).
! 3683: **
! 3684: ** If the condition asserted by this function were not true, and the
! 3685: ** dirty page were to be discarded from the cache via the pagerStress()
! 3686: ** routine, pagerStress() would not write the current page content to
! 3687: ** the database file. If a savepoint transaction were rolled back after
! 3688: ** this happened, the correct behaviour would be to restore the current
! 3689: ** content of the page. However, since this content is not present in either
! 3690: ** the database file or the portion of the rollback journal and
! 3691: ** sub-journal rolled back the content could not be restored and the
! 3692: ** database image would become corrupt. It is therefore fortunate that
! 3693: ** this circumstance cannot arise.
! 3694: */
! 3695: #if defined(SQLITE_DEBUG)
! 3696: static void assertTruncateConstraintCb(PgHdr *pPg){
! 3697: assert( pPg->flags&PGHDR_DIRTY );
! 3698: assert( !subjRequiresPage(pPg) || pPg->pgno<=pPg->pPager->dbSize );
! 3699: }
! 3700: static void assertTruncateConstraint(Pager *pPager){
! 3701: sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb);
! 3702: }
! 3703: #else
! 3704: # define assertTruncateConstraint(pPager)
! 3705: #endif
! 3706:
! 3707: /*
! 3708: ** Truncate the in-memory database file image to nPage pages. This
! 3709: ** function does not actually modify the database file on disk. It
! 3710: ** just sets the internal state of the pager object so that the
! 3711: ** truncation will be done when the current transaction is committed.
! 3712: */
! 3713: void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){
! 3714: assert( pPager->dbSize>=nPage );
! 3715: assert( pPager->eState>=PAGER_WRITER_CACHEMOD );
! 3716: pPager->dbSize = nPage;
! 3717: assertTruncateConstraint(pPager);
! 3718: }
! 3719:
! 3720:
! 3721: /*
! 3722: ** This function is called before attempting a hot-journal rollback. It
! 3723: ** syncs the journal file to disk, then sets pPager->journalHdr to the
! 3724: ** size of the journal file so that the pager_playback() routine knows
! 3725: ** that the entire journal file has been synced.
! 3726: **
! 3727: ** Syncing a hot-journal to disk before attempting to roll it back ensures
! 3728: ** that if a power-failure occurs during the rollback, the process that
! 3729: ** attempts rollback following system recovery sees the same journal
! 3730: ** content as this process.
! 3731: **
! 3732: ** If everything goes as planned, SQLITE_OK is returned. Otherwise,
! 3733: ** an SQLite error code.
! 3734: */
! 3735: static int pagerSyncHotJournal(Pager *pPager){
! 3736: int rc = SQLITE_OK;
! 3737: if( !pPager->noSync ){
! 3738: rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_NORMAL);
! 3739: }
! 3740: if( rc==SQLITE_OK ){
! 3741: rc = sqlite3OsFileSize(pPager->jfd, &pPager->journalHdr);
! 3742: }
! 3743: return rc;
! 3744: }
! 3745:
! 3746: /*
! 3747: ** Shutdown the page cache. Free all memory and close all files.
! 3748: **
! 3749: ** If a transaction was in progress when this routine is called, that
! 3750: ** transaction is rolled back. All outstanding pages are invalidated
! 3751: ** and their memory is freed. Any attempt to use a page associated
! 3752: ** with this page cache after this function returns will likely
! 3753: ** result in a coredump.
! 3754: **
! 3755: ** This function always succeeds. If a transaction is active an attempt
! 3756: ** is made to roll it back. If an error occurs during the rollback
! 3757: ** a hot journal may be left in the filesystem but no error is returned
! 3758: ** to the caller.
! 3759: */
! 3760: int sqlite3PagerClose(Pager *pPager){
! 3761: u8 *pTmp = (u8 *)pPager->pTmpSpace;
! 3762:
! 3763: assert( assert_pager_state(pPager) );
! 3764: disable_simulated_io_errors();
! 3765: sqlite3BeginBenignMalloc();
! 3766: /* pPager->errCode = 0; */
! 3767: pPager->exclusiveMode = 0;
! 3768: #ifndef SQLITE_OMIT_WAL
! 3769: sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, pPager->pageSize, pTmp);
! 3770: pPager->pWal = 0;
! 3771: #endif
! 3772: pager_reset(pPager);
! 3773: if( MEMDB ){
! 3774: pager_unlock(pPager);
! 3775: }else{
! 3776: /* If it is open, sync the journal file before calling UnlockAndRollback.
! 3777: ** If this is not done, then an unsynced portion of the open journal
! 3778: ** file may be played back into the database. If a power failure occurs
! 3779: ** while this is happening, the database could become corrupt.
! 3780: **
! 3781: ** If an error occurs while trying to sync the journal, shift the pager
! 3782: ** into the ERROR state. This causes UnlockAndRollback to unlock the
! 3783: ** database and close the journal file without attempting to roll it
! 3784: ** back or finalize it. The next database user will have to do hot-journal
! 3785: ** rollback before accessing the database file.
! 3786: */
! 3787: if( isOpen(pPager->jfd) ){
! 3788: pager_error(pPager, pagerSyncHotJournal(pPager));
! 3789: }
! 3790: pagerUnlockAndRollback(pPager);
! 3791: }
! 3792: sqlite3EndBenignMalloc();
! 3793: enable_simulated_io_errors();
! 3794: PAGERTRACE(("CLOSE %d\n", PAGERID(pPager)));
! 3795: IOTRACE(("CLOSE %p\n", pPager))
! 3796: sqlite3OsClose(pPager->jfd);
! 3797: sqlite3OsClose(pPager->fd);
! 3798: sqlite3PageFree(pTmp);
! 3799: sqlite3PcacheClose(pPager->pPCache);
! 3800:
! 3801: #ifdef SQLITE_HAS_CODEC
! 3802: if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec);
! 3803: #endif
! 3804:
! 3805: assert( !pPager->aSavepoint && !pPager->pInJournal );
! 3806: assert( !isOpen(pPager->jfd) && !isOpen(pPager->sjfd) );
! 3807:
! 3808: sqlite3_free(pPager);
! 3809: return SQLITE_OK;
! 3810: }
! 3811:
! 3812: #if !defined(NDEBUG) || defined(SQLITE_TEST)
! 3813: /*
! 3814: ** Return the page number for page pPg.
! 3815: */
! 3816: Pgno sqlite3PagerPagenumber(DbPage *pPg){
! 3817: return pPg->pgno;
! 3818: }
! 3819: #endif
! 3820:
! 3821: /*
! 3822: ** Increment the reference count for page pPg.
! 3823: */
! 3824: void sqlite3PagerRef(DbPage *pPg){
! 3825: sqlite3PcacheRef(pPg);
! 3826: }
! 3827:
! 3828: /*
! 3829: ** Sync the journal. In other words, make sure all the pages that have
! 3830: ** been written to the journal have actually reached the surface of the
! 3831: ** disk and can be restored in the event of a hot-journal rollback.
! 3832: **
! 3833: ** If the Pager.noSync flag is set, then this function is a no-op.
! 3834: ** Otherwise, the actions required depend on the journal-mode and the
! 3835: ** device characteristics of the the file-system, as follows:
! 3836: **
! 3837: ** * If the journal file is an in-memory journal file, no action need
! 3838: ** be taken.
! 3839: **
! 3840: ** * Otherwise, if the device does not support the SAFE_APPEND property,
! 3841: ** then the nRec field of the most recently written journal header
! 3842: ** is updated to contain the number of journal records that have
! 3843: ** been written following it. If the pager is operating in full-sync
! 3844: ** mode, then the journal file is synced before this field is updated.
! 3845: **
! 3846: ** * If the device does not support the SEQUENTIAL property, then
! 3847: ** journal file is synced.
! 3848: **
! 3849: ** Or, in pseudo-code:
! 3850: **
! 3851: ** if( NOT <in-memory journal> ){
! 3852: ** if( NOT SAFE_APPEND ){
! 3853: ** if( <full-sync mode> ) xSync(<journal file>);
! 3854: ** <update nRec field>
! 3855: ** }
! 3856: ** if( NOT SEQUENTIAL ) xSync(<journal file>);
! 3857: ** }
! 3858: **
! 3859: ** If successful, this routine clears the PGHDR_NEED_SYNC flag of every
! 3860: ** page currently held in memory before returning SQLITE_OK. If an IO
! 3861: ** error is encountered, then the IO error code is returned to the caller.
! 3862: */
! 3863: static int syncJournal(Pager *pPager, int newHdr){
! 3864: int rc; /* Return code */
! 3865:
! 3866: assert( pPager->eState==PAGER_WRITER_CACHEMOD
! 3867: || pPager->eState==PAGER_WRITER_DBMOD
! 3868: );
! 3869: assert( assert_pager_state(pPager) );
! 3870: assert( !pagerUseWal(pPager) );
! 3871:
! 3872: rc = sqlite3PagerExclusiveLock(pPager);
! 3873: if( rc!=SQLITE_OK ) return rc;
! 3874:
! 3875: if( !pPager->noSync ){
! 3876: assert( !pPager->tempFile );
! 3877: if( isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){
! 3878: const int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
! 3879: assert( isOpen(pPager->jfd) );
! 3880:
! 3881: if( 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){
! 3882: /* This block deals with an obscure problem. If the last connection
! 3883: ** that wrote to this database was operating in persistent-journal
! 3884: ** mode, then the journal file may at this point actually be larger
! 3885: ** than Pager.journalOff bytes. If the next thing in the journal
! 3886: ** file happens to be a journal-header (written as part of the
! 3887: ** previous connection's transaction), and a crash or power-failure
! 3888: ** occurs after nRec is updated but before this connection writes
! 3889: ** anything else to the journal file (or commits/rolls back its
! 3890: ** transaction), then SQLite may become confused when doing the
! 3891: ** hot-journal rollback following recovery. It may roll back all
! 3892: ** of this connections data, then proceed to rolling back the old,
! 3893: ** out-of-date data that follows it. Database corruption.
! 3894: **
! 3895: ** To work around this, if the journal file does appear to contain
! 3896: ** a valid header following Pager.journalOff, then write a 0x00
! 3897: ** byte to the start of it to prevent it from being recognized.
! 3898: **
! 3899: ** Variable iNextHdrOffset is set to the offset at which this
! 3900: ** problematic header will occur, if it exists. aMagic is used
! 3901: ** as a temporary buffer to inspect the first couple of bytes of
! 3902: ** the potential journal header.
! 3903: */
! 3904: i64 iNextHdrOffset;
! 3905: u8 aMagic[8];
! 3906: u8 zHeader[sizeof(aJournalMagic)+4];
! 3907:
! 3908: memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic));
! 3909: put32bits(&zHeader[sizeof(aJournalMagic)], pPager->nRec);
! 3910:
! 3911: iNextHdrOffset = journalHdrOffset(pPager);
! 3912: rc = sqlite3OsRead(pPager->jfd, aMagic, 8, iNextHdrOffset);
! 3913: if( rc==SQLITE_OK && 0==memcmp(aMagic, aJournalMagic, 8) ){
! 3914: static const u8 zerobyte = 0;
! 3915: rc = sqlite3OsWrite(pPager->jfd, &zerobyte, 1, iNextHdrOffset);
! 3916: }
! 3917: if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){
! 3918: return rc;
! 3919: }
! 3920:
! 3921: /* Write the nRec value into the journal file header. If in
! 3922: ** full-synchronous mode, sync the journal first. This ensures that
! 3923: ** all data has really hit the disk before nRec is updated to mark
! 3924: ** it as a candidate for rollback.
! 3925: **
! 3926: ** This is not required if the persistent media supports the
! 3927: ** SAFE_APPEND property. Because in this case it is not possible
! 3928: ** for garbage data to be appended to the file, the nRec field
! 3929: ** is populated with 0xFFFFFFFF when the journal header is written
! 3930: ** and never needs to be updated.
! 3931: */
! 3932: if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){
! 3933: PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager)));
! 3934: IOTRACE(("JSYNC %p\n", pPager))
! 3935: rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags);
! 3936: if( rc!=SQLITE_OK ) return rc;
! 3937: }
! 3938: IOTRACE(("JHDR %p %lld\n", pPager, pPager->journalHdr));
! 3939: rc = sqlite3OsWrite(
! 3940: pPager->jfd, zHeader, sizeof(zHeader), pPager->journalHdr
! 3941: );
! 3942: if( rc!=SQLITE_OK ) return rc;
! 3943: }
! 3944: if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){
! 3945: PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager)));
! 3946: IOTRACE(("JSYNC %p\n", pPager))
! 3947: rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags|
! 3948: (pPager->syncFlags==SQLITE_SYNC_FULL?SQLITE_SYNC_DATAONLY:0)
! 3949: );
! 3950: if( rc!=SQLITE_OK ) return rc;
! 3951: }
! 3952:
! 3953: pPager->journalHdr = pPager->journalOff;
! 3954: if( newHdr && 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){
! 3955: pPager->nRec = 0;
! 3956: rc = writeJournalHdr(pPager);
! 3957: if( rc!=SQLITE_OK ) return rc;
! 3958: }
! 3959: }else{
! 3960: pPager->journalHdr = pPager->journalOff;
! 3961: }
! 3962: }
! 3963:
! 3964: /* Unless the pager is in noSync mode, the journal file was just
! 3965: ** successfully synced. Either way, clear the PGHDR_NEED_SYNC flag on
! 3966: ** all pages.
! 3967: */
! 3968: sqlite3PcacheClearSyncFlags(pPager->pPCache);
! 3969: pPager->eState = PAGER_WRITER_DBMOD;
! 3970: assert( assert_pager_state(pPager) );
! 3971: return SQLITE_OK;
! 3972: }
! 3973:
! 3974: /*
! 3975: ** The argument is the first in a linked list of dirty pages connected
! 3976: ** by the PgHdr.pDirty pointer. This function writes each one of the
! 3977: ** in-memory pages in the list to the database file. The argument may
! 3978: ** be NULL, representing an empty list. In this case this function is
! 3979: ** a no-op.
! 3980: **
! 3981: ** The pager must hold at least a RESERVED lock when this function
! 3982: ** is called. Before writing anything to the database file, this lock
! 3983: ** is upgraded to an EXCLUSIVE lock. If the lock cannot be obtained,
! 3984: ** SQLITE_BUSY is returned and no data is written to the database file.
! 3985: **
! 3986: ** If the pager is a temp-file pager and the actual file-system file
! 3987: ** is not yet open, it is created and opened before any data is
! 3988: ** written out.
! 3989: **
! 3990: ** Once the lock has been upgraded and, if necessary, the file opened,
! 3991: ** the pages are written out to the database file in list order. Writing
! 3992: ** a page is skipped if it meets either of the following criteria:
! 3993: **
! 3994: ** * The page number is greater than Pager.dbSize, or
! 3995: ** * The PGHDR_DONT_WRITE flag is set on the page.
! 3996: **
! 3997: ** If writing out a page causes the database file to grow, Pager.dbFileSize
! 3998: ** is updated accordingly. If page 1 is written out, then the value cached
! 3999: ** in Pager.dbFileVers[] is updated to match the new value stored in
! 4000: ** the database file.
! 4001: **
! 4002: ** If everything is successful, SQLITE_OK is returned. If an IO error
! 4003: ** occurs, an IO error code is returned. Or, if the EXCLUSIVE lock cannot
! 4004: ** be obtained, SQLITE_BUSY is returned.
! 4005: */
! 4006: static int pager_write_pagelist(Pager *pPager, PgHdr *pList){
! 4007: int rc = SQLITE_OK; /* Return code */
! 4008:
! 4009: /* This function is only called for rollback pagers in WRITER_DBMOD state. */
! 4010: assert( !pagerUseWal(pPager) );
! 4011: assert( pPager->eState==PAGER_WRITER_DBMOD );
! 4012: assert( pPager->eLock==EXCLUSIVE_LOCK );
! 4013:
! 4014: /* If the file is a temp-file has not yet been opened, open it now. It
! 4015: ** is not possible for rc to be other than SQLITE_OK if this branch
! 4016: ** is taken, as pager_wait_on_lock() is a no-op for temp-files.
! 4017: */
! 4018: if( !isOpen(pPager->fd) ){
! 4019: assert( pPager->tempFile && rc==SQLITE_OK );
! 4020: rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags);
! 4021: }
! 4022:
! 4023: /* Before the first write, give the VFS a hint of what the final
! 4024: ** file size will be.
! 4025: */
! 4026: assert( rc!=SQLITE_OK || isOpen(pPager->fd) );
! 4027: if( rc==SQLITE_OK && pPager->dbSize>pPager->dbHintSize ){
! 4028: sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize;
! 4029: sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile);
! 4030: pPager->dbHintSize = pPager->dbSize;
! 4031: }
! 4032:
! 4033: while( rc==SQLITE_OK && pList ){
! 4034: Pgno pgno = pList->pgno;
! 4035:
! 4036: /* If there are dirty pages in the page cache with page numbers greater
! 4037: ** than Pager.dbSize, this means sqlite3PagerTruncateImage() was called to
! 4038: ** make the file smaller (presumably by auto-vacuum code). Do not write
! 4039: ** any such pages to the file.
! 4040: **
! 4041: ** Also, do not write out any page that has the PGHDR_DONT_WRITE flag
! 4042: ** set (set by sqlite3PagerDontWrite()).
! 4043: */
! 4044: if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){
! 4045: i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */
! 4046: char *pData; /* Data to write */
! 4047:
! 4048: assert( (pList->flags&PGHDR_NEED_SYNC)==0 );
! 4049: if( pList->pgno==1 ) pager_write_changecounter(pList);
! 4050:
! 4051: /* Encode the database */
! 4052: CODEC2(pPager, pList->pData, pgno, 6, return SQLITE_NOMEM, pData);
! 4053:
! 4054: /* Write out the page data. */
! 4055: rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset);
! 4056:
! 4057: /* If page 1 was just written, update Pager.dbFileVers to match
! 4058: ** the value now stored in the database file. If writing this
! 4059: ** page caused the database file to grow, update dbFileSize.
! 4060: */
! 4061: if( pgno==1 ){
! 4062: memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers));
! 4063: }
! 4064: if( pgno>pPager->dbFileSize ){
! 4065: pPager->dbFileSize = pgno;
! 4066: }
! 4067:
! 4068: /* Update any backup objects copying the contents of this pager. */
! 4069: sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)pList->pData);
! 4070:
! 4071: PAGERTRACE(("STORE %d page %d hash(%08x)\n",
! 4072: PAGERID(pPager), pgno, pager_pagehash(pList)));
! 4073: IOTRACE(("PGOUT %p %d\n", pPager, pgno));
! 4074: PAGER_INCR(sqlite3_pager_writedb_count);
! 4075: PAGER_INCR(pPager->nWrite);
! 4076: }else{
! 4077: PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno));
! 4078: }
! 4079: pager_set_pagehash(pList);
! 4080: pList = pList->pDirty;
! 4081: }
! 4082:
! 4083: return rc;
! 4084: }
! 4085:
! 4086: /*
! 4087: ** Ensure that the sub-journal file is open. If it is already open, this
! 4088: ** function is a no-op.
! 4089: **
! 4090: ** SQLITE_OK is returned if everything goes according to plan. An
! 4091: ** SQLITE_IOERR_XXX error code is returned if a call to sqlite3OsOpen()
! 4092: ** fails.
! 4093: */
! 4094: static int openSubJournal(Pager *pPager){
! 4095: int rc = SQLITE_OK;
! 4096: if( !isOpen(pPager->sjfd) ){
! 4097: if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){
! 4098: sqlite3MemJournalOpen(pPager->sjfd);
! 4099: }else{
! 4100: rc = pagerOpentemp(pPager, pPager->sjfd, SQLITE_OPEN_SUBJOURNAL);
! 4101: }
! 4102: }
! 4103: return rc;
! 4104: }
! 4105:
! 4106: /*
! 4107: ** Append a record of the current state of page pPg to the sub-journal.
! 4108: ** It is the callers responsibility to use subjRequiresPage() to check
! 4109: ** that it is really required before calling this function.
! 4110: **
! 4111: ** If successful, set the bit corresponding to pPg->pgno in the bitvecs
! 4112: ** for all open savepoints before returning.
! 4113: **
! 4114: ** This function returns SQLITE_OK if everything is successful, an IO
! 4115: ** error code if the attempt to write to the sub-journal fails, or
! 4116: ** SQLITE_NOMEM if a malloc fails while setting a bit in a savepoint
! 4117: ** bitvec.
! 4118: */
! 4119: static int subjournalPage(PgHdr *pPg){
! 4120: int rc = SQLITE_OK;
! 4121: Pager *pPager = pPg->pPager;
! 4122: if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
! 4123:
! 4124: /* Open the sub-journal, if it has not already been opened */
! 4125: assert( pPager->useJournal );
! 4126: assert( isOpen(pPager->jfd) || pagerUseWal(pPager) );
! 4127: assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 );
! 4128: assert( pagerUseWal(pPager)
! 4129: || pageInJournal(pPg)
! 4130: || pPg->pgno>pPager->dbOrigSize
! 4131: );
! 4132: rc = openSubJournal(pPager);
! 4133:
! 4134: /* If the sub-journal was opened successfully (or was already open),
! 4135: ** write the journal record into the file. */
! 4136: if( rc==SQLITE_OK ){
! 4137: void *pData = pPg->pData;
! 4138: i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize);
! 4139: char *pData2;
! 4140:
! 4141: CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2);
! 4142: PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno));
! 4143: rc = write32bits(pPager->sjfd, offset, pPg->pgno);
! 4144: if( rc==SQLITE_OK ){
! 4145: rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4);
! 4146: }
! 4147: }
! 4148: }
! 4149: if( rc==SQLITE_OK ){
! 4150: pPager->nSubRec++;
! 4151: assert( pPager->nSavepoint>0 );
! 4152: rc = addToSavepointBitvecs(pPager, pPg->pgno);
! 4153: }
! 4154: return rc;
! 4155: }
! 4156:
! 4157: /*
! 4158: ** This function is called by the pcache layer when it has reached some
! 4159: ** soft memory limit. The first argument is a pointer to a Pager object
! 4160: ** (cast as a void*). The pager is always 'purgeable' (not an in-memory
! 4161: ** database). The second argument is a reference to a page that is
! 4162: ** currently dirty but has no outstanding references. The page
! 4163: ** is always associated with the Pager object passed as the first
! 4164: ** argument.
! 4165: **
! 4166: ** The job of this function is to make pPg clean by writing its contents
! 4167: ** out to the database file, if possible. This may involve syncing the
! 4168: ** journal file.
! 4169: **
! 4170: ** If successful, sqlite3PcacheMakeClean() is called on the page and
! 4171: ** SQLITE_OK returned. If an IO error occurs while trying to make the
! 4172: ** page clean, the IO error code is returned. If the page cannot be
! 4173: ** made clean for some other reason, but no error occurs, then SQLITE_OK
! 4174: ** is returned by sqlite3PcacheMakeClean() is not called.
! 4175: */
! 4176: static int pagerStress(void *p, PgHdr *pPg){
! 4177: Pager *pPager = (Pager *)p;
! 4178: int rc = SQLITE_OK;
! 4179:
! 4180: assert( pPg->pPager==pPager );
! 4181: assert( pPg->flags&PGHDR_DIRTY );
! 4182:
! 4183: /* The doNotSyncSpill flag is set during times when doing a sync of
! 4184: ** journal (and adding a new header) is not allowed. This occurs
! 4185: ** during calls to sqlite3PagerWrite() while trying to journal multiple
! 4186: ** pages belonging to the same sector.
! 4187: **
! 4188: ** The doNotSpill flag inhibits all cache spilling regardless of whether
! 4189: ** or not a sync is required. This is set during a rollback.
! 4190: **
! 4191: ** Spilling is also prohibited when in an error state since that could
! 4192: ** lead to database corruption. In the current implementaton it
! 4193: ** is impossible for sqlite3PcacheFetch() to be called with createFlag==1
! 4194: ** while in the error state, hence it is impossible for this routine to
! 4195: ** be called in the error state. Nevertheless, we include a NEVER()
! 4196: ** test for the error state as a safeguard against future changes.
! 4197: */
! 4198: if( NEVER(pPager->errCode) ) return SQLITE_OK;
! 4199: if( pPager->doNotSpill ) return SQLITE_OK;
! 4200: if( pPager->doNotSyncSpill && (pPg->flags & PGHDR_NEED_SYNC)!=0 ){
! 4201: return SQLITE_OK;
! 4202: }
! 4203:
! 4204: pPg->pDirty = 0;
! 4205: if( pagerUseWal(pPager) ){
! 4206: /* Write a single frame for this page to the log. */
! 4207: if( subjRequiresPage(pPg) ){
! 4208: rc = subjournalPage(pPg);
! 4209: }
! 4210: if( rc==SQLITE_OK ){
! 4211: rc = pagerWalFrames(pPager, pPg, 0, 0);
! 4212: }
! 4213: }else{
! 4214:
! 4215: /* Sync the journal file if required. */
! 4216: if( pPg->flags&PGHDR_NEED_SYNC
! 4217: || pPager->eState==PAGER_WRITER_CACHEMOD
! 4218: ){
! 4219: rc = syncJournal(pPager, 1);
! 4220: }
! 4221:
! 4222: /* If the page number of this page is larger than the current size of
! 4223: ** the database image, it may need to be written to the sub-journal.
! 4224: ** This is because the call to pager_write_pagelist() below will not
! 4225: ** actually write data to the file in this case.
! 4226: **
! 4227: ** Consider the following sequence of events:
! 4228: **
! 4229: ** BEGIN;
! 4230: ** <journal page X>
! 4231: ** <modify page X>
! 4232: ** SAVEPOINT sp;
! 4233: ** <shrink database file to Y pages>
! 4234: ** pagerStress(page X)
! 4235: ** ROLLBACK TO sp;
! 4236: **
! 4237: ** If (X>Y), then when pagerStress is called page X will not be written
! 4238: ** out to the database file, but will be dropped from the cache. Then,
! 4239: ** following the "ROLLBACK TO sp" statement, reading page X will read
! 4240: ** data from the database file. This will be the copy of page X as it
! 4241: ** was when the transaction started, not as it was when "SAVEPOINT sp"
! 4242: ** was executed.
! 4243: **
! 4244: ** The solution is to write the current data for page X into the
! 4245: ** sub-journal file now (if it is not already there), so that it will
! 4246: ** be restored to its current value when the "ROLLBACK TO sp" is
! 4247: ** executed.
! 4248: */
! 4249: if( NEVER(
! 4250: rc==SQLITE_OK && pPg->pgno>pPager->dbSize && subjRequiresPage(pPg)
! 4251: ) ){
! 4252: rc = subjournalPage(pPg);
! 4253: }
! 4254:
! 4255: /* Write the contents of the page out to the database file. */
! 4256: if( rc==SQLITE_OK ){
! 4257: assert( (pPg->flags&PGHDR_NEED_SYNC)==0 );
! 4258: rc = pager_write_pagelist(pPager, pPg);
! 4259: }
! 4260: }
! 4261:
! 4262: /* Mark the page as clean. */
! 4263: if( rc==SQLITE_OK ){
! 4264: PAGERTRACE(("STRESS %d page %d\n", PAGERID(pPager), pPg->pgno));
! 4265: sqlite3PcacheMakeClean(pPg);
! 4266: }
! 4267:
! 4268: return pager_error(pPager, rc);
! 4269: }
! 4270:
! 4271:
! 4272: /*
! 4273: ** Allocate and initialize a new Pager object and put a pointer to it
! 4274: ** in *ppPager. The pager should eventually be freed by passing it
! 4275: ** to sqlite3PagerClose().
! 4276: **
! 4277: ** The zFilename argument is the path to the database file to open.
! 4278: ** If zFilename is NULL then a randomly-named temporary file is created
! 4279: ** and used as the file to be cached. Temporary files are be deleted
! 4280: ** automatically when they are closed. If zFilename is ":memory:" then
! 4281: ** all information is held in cache. It is never written to disk.
! 4282: ** This can be used to implement an in-memory database.
! 4283: **
! 4284: ** The nExtra parameter specifies the number of bytes of space allocated
! 4285: ** along with each page reference. This space is available to the user
! 4286: ** via the sqlite3PagerGetExtra() API.
! 4287: **
! 4288: ** The flags argument is used to specify properties that affect the
! 4289: ** operation of the pager. It should be passed some bitwise combination
! 4290: ** of the PAGER_OMIT_JOURNAL and PAGER_NO_READLOCK flags.
! 4291: **
! 4292: ** The vfsFlags parameter is a bitmask to pass to the flags parameter
! 4293: ** of the xOpen() method of the supplied VFS when opening files.
! 4294: **
! 4295: ** If the pager object is allocated and the specified file opened
! 4296: ** successfully, SQLITE_OK is returned and *ppPager set to point to
! 4297: ** the new pager object. If an error occurs, *ppPager is set to NULL
! 4298: ** and error code returned. This function may return SQLITE_NOMEM
! 4299: ** (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or
! 4300: ** various SQLITE_IO_XXX errors.
! 4301: */
! 4302: int sqlite3PagerOpen(
! 4303: sqlite3_vfs *pVfs, /* The virtual file system to use */
! 4304: Pager **ppPager, /* OUT: Return the Pager structure here */
! 4305: const char *zFilename, /* Name of the database file to open */
! 4306: int nExtra, /* Extra bytes append to each in-memory page */
! 4307: int flags, /* flags controlling this file */
! 4308: int vfsFlags, /* flags passed through to sqlite3_vfs.xOpen() */
! 4309: void (*xReinit)(DbPage*) /* Function to reinitialize pages */
! 4310: ){
! 4311: u8 *pPtr;
! 4312: Pager *pPager = 0; /* Pager object to allocate and return */
! 4313: int rc = SQLITE_OK; /* Return code */
! 4314: int tempFile = 0; /* True for temp files (incl. in-memory files) */
! 4315: int memDb = 0; /* True if this is an in-memory file */
! 4316: int readOnly = 0; /* True if this is a read-only file */
! 4317: int journalFileSize; /* Bytes to allocate for each journal fd */
! 4318: char *zPathname = 0; /* Full path to database file */
! 4319: int nPathname = 0; /* Number of bytes in zPathname */
! 4320: int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; /* False to omit journal */
! 4321: int noReadlock = (flags & PAGER_NO_READLOCK)!=0; /* True to omit read-lock */
! 4322: int pcacheSize = sqlite3PcacheSize(); /* Bytes to allocate for PCache */
! 4323: u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */
! 4324: const char *zUri = 0; /* URI args to copy */
! 4325: int nUri = 0; /* Number of bytes of URI args at *zUri */
! 4326:
! 4327: /* Figure out how much space is required for each journal file-handle
! 4328: ** (there are two of them, the main journal and the sub-journal). This
! 4329: ** is the maximum space required for an in-memory journal file handle
! 4330: ** and a regular journal file-handle. Note that a "regular journal-handle"
! 4331: ** may be a wrapper capable of caching the first portion of the journal
! 4332: ** file in memory to implement the atomic-write optimization (see
! 4333: ** source file journal.c).
! 4334: */
! 4335: if( sqlite3JournalSize(pVfs)>sqlite3MemJournalSize() ){
! 4336: journalFileSize = ROUND8(sqlite3JournalSize(pVfs));
! 4337: }else{
! 4338: journalFileSize = ROUND8(sqlite3MemJournalSize());
! 4339: }
! 4340:
! 4341: /* Set the output variable to NULL in case an error occurs. */
! 4342: *ppPager = 0;
! 4343:
! 4344: #ifndef SQLITE_OMIT_MEMORYDB
! 4345: if( flags & PAGER_MEMORY ){
! 4346: memDb = 1;
! 4347: zFilename = 0;
! 4348: }
! 4349: #endif
! 4350:
! 4351: /* Compute and store the full pathname in an allocated buffer pointed
! 4352: ** to by zPathname, length nPathname. Or, if this is a temporary file,
! 4353: ** leave both nPathname and zPathname set to 0.
! 4354: */
! 4355: if( zFilename && zFilename[0] ){
! 4356: const char *z;
! 4357: nPathname = pVfs->mxPathname+1;
! 4358: zPathname = sqlite3Malloc(nPathname*2);
! 4359: if( zPathname==0 ){
! 4360: return SQLITE_NOMEM;
! 4361: }
! 4362: zPathname[0] = 0; /* Make sure initialized even if FullPathname() fails */
! 4363: rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname);
! 4364: nPathname = sqlite3Strlen30(zPathname);
! 4365: z = zUri = &zFilename[sqlite3Strlen30(zFilename)+1];
! 4366: while( *z ){
! 4367: z += sqlite3Strlen30(z)+1;
! 4368: z += sqlite3Strlen30(z)+1;
! 4369: }
! 4370: nUri = (int)(&z[1] - zUri);
! 4371: assert( nUri>=0 );
! 4372: if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){
! 4373: /* This branch is taken when the journal path required by
! 4374: ** the database being opened will be more than pVfs->mxPathname
! 4375: ** bytes in length. This means the database cannot be opened,
! 4376: ** as it will not be possible to open the journal file or even
! 4377: ** check for a hot-journal before reading.
! 4378: */
! 4379: rc = SQLITE_CANTOPEN_BKPT;
! 4380: }
! 4381: if( rc!=SQLITE_OK ){
! 4382: sqlite3_free(zPathname);
! 4383: return rc;
! 4384: }
! 4385: }
! 4386:
! 4387: /* Allocate memory for the Pager structure, PCache object, the
! 4388: ** three file descriptors, the database file name and the journal
! 4389: ** file name. The layout in memory is as follows:
! 4390: **
! 4391: ** Pager object (sizeof(Pager) bytes)
! 4392: ** PCache object (sqlite3PcacheSize() bytes)
! 4393: ** Database file handle (pVfs->szOsFile bytes)
! 4394: ** Sub-journal file handle (journalFileSize bytes)
! 4395: ** Main journal file handle (journalFileSize bytes)
! 4396: ** Database file name (nPathname+1 bytes)
! 4397: ** Journal file name (nPathname+8+1 bytes)
! 4398: */
! 4399: pPtr = (u8 *)sqlite3MallocZero(
! 4400: ROUND8(sizeof(*pPager)) + /* Pager structure */
! 4401: ROUND8(pcacheSize) + /* PCache object */
! 4402: ROUND8(pVfs->szOsFile) + /* The main db file */
! 4403: journalFileSize * 2 + /* The two journal files */
! 4404: nPathname + 1 + nUri + /* zFilename */
! 4405: nPathname + 8 + 2 /* zJournal */
! 4406: #ifndef SQLITE_OMIT_WAL
! 4407: + nPathname + 4 + 2 /* zWal */
! 4408: #endif
! 4409: );
! 4410: assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) );
! 4411: if( !pPtr ){
! 4412: sqlite3_free(zPathname);
! 4413: return SQLITE_NOMEM;
! 4414: }
! 4415: pPager = (Pager*)(pPtr);
! 4416: pPager->pPCache = (PCache*)(pPtr += ROUND8(sizeof(*pPager)));
! 4417: pPager->fd = (sqlite3_file*)(pPtr += ROUND8(pcacheSize));
! 4418: pPager->sjfd = (sqlite3_file*)(pPtr += ROUND8(pVfs->szOsFile));
! 4419: pPager->jfd = (sqlite3_file*)(pPtr += journalFileSize);
! 4420: pPager->zFilename = (char*)(pPtr += journalFileSize);
! 4421: assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) );
! 4422:
! 4423: /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */
! 4424: if( zPathname ){
! 4425: assert( nPathname>0 );
! 4426: pPager->zJournal = (char*)(pPtr += nPathname + 1 + nUri);
! 4427: memcpy(pPager->zFilename, zPathname, nPathname);
! 4428: memcpy(&pPager->zFilename[nPathname+1], zUri, nUri);
! 4429: memcpy(pPager->zJournal, zPathname, nPathname);
! 4430: memcpy(&pPager->zJournal[nPathname], "-journal\000", 8+1);
! 4431: sqlite3FileSuffix3(pPager->zFilename, pPager->zJournal);
! 4432: #ifndef SQLITE_OMIT_WAL
! 4433: pPager->zWal = &pPager->zJournal[nPathname+8+1];
! 4434: memcpy(pPager->zWal, zPathname, nPathname);
! 4435: memcpy(&pPager->zWal[nPathname], "-wal\000", 4+1);
! 4436: sqlite3FileSuffix3(pPager->zFilename, pPager->zWal);
! 4437: #endif
! 4438: sqlite3_free(zPathname);
! 4439: }
! 4440: pPager->pVfs = pVfs;
! 4441: pPager->vfsFlags = vfsFlags;
! 4442:
! 4443: /* Open the pager file.
! 4444: */
! 4445: if( zFilename && zFilename[0] ){
! 4446: int fout = 0; /* VFS flags returned by xOpen() */
! 4447: rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout);
! 4448: assert( !memDb );
! 4449: readOnly = (fout&SQLITE_OPEN_READONLY);
! 4450:
! 4451: /* If the file was successfully opened for read/write access,
! 4452: ** choose a default page size in case we have to create the
! 4453: ** database file. The default page size is the maximum of:
! 4454: **
! 4455: ** + SQLITE_DEFAULT_PAGE_SIZE,
! 4456: ** + The value returned by sqlite3OsSectorSize()
! 4457: ** + The largest page size that can be written atomically.
! 4458: */
! 4459: if( rc==SQLITE_OK && !readOnly ){
! 4460: setSectorSize(pPager);
! 4461: assert(SQLITE_DEFAULT_PAGE_SIZE<=SQLITE_MAX_DEFAULT_PAGE_SIZE);
! 4462: if( szPageDflt<pPager->sectorSize ){
! 4463: if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){
! 4464: szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE;
! 4465: }else{
! 4466: szPageDflt = (u32)pPager->sectorSize;
! 4467: }
! 4468: }
! 4469: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
! 4470: {
! 4471: int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
! 4472: int ii;
! 4473: assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
! 4474: assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
! 4475: assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536);
! 4476: for(ii=szPageDflt; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){
! 4477: if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ){
! 4478: szPageDflt = ii;
! 4479: }
! 4480: }
! 4481: }
! 4482: #endif
! 4483: }
! 4484: }else{
! 4485: /* If a temporary file is requested, it is not opened immediately.
! 4486: ** In this case we accept the default page size and delay actually
! 4487: ** opening the file until the first call to OsWrite().
! 4488: **
! 4489: ** This branch is also run for an in-memory database. An in-memory
! 4490: ** database is the same as a temp-file that is never written out to
! 4491: ** disk and uses an in-memory rollback journal.
! 4492: */
! 4493: tempFile = 1;
! 4494: pPager->eState = PAGER_READER;
! 4495: pPager->eLock = EXCLUSIVE_LOCK;
! 4496: readOnly = (vfsFlags&SQLITE_OPEN_READONLY);
! 4497: }
! 4498:
! 4499: /* The following call to PagerSetPagesize() serves to set the value of
! 4500: ** Pager.pageSize and to allocate the Pager.pTmpSpace buffer.
! 4501: */
! 4502: if( rc==SQLITE_OK ){
! 4503: assert( pPager->memDb==0 );
! 4504: rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1);
! 4505: testcase( rc!=SQLITE_OK );
! 4506: }
! 4507:
! 4508: /* If an error occurred in either of the blocks above, free the
! 4509: ** Pager structure and close the file.
! 4510: */
! 4511: if( rc!=SQLITE_OK ){
! 4512: assert( !pPager->pTmpSpace );
! 4513: sqlite3OsClose(pPager->fd);
! 4514: sqlite3_free(pPager);
! 4515: return rc;
! 4516: }
! 4517:
! 4518: /* Initialize the PCache object. */
! 4519: assert( nExtra<1000 );
! 4520: nExtra = ROUND8(nExtra);
! 4521: sqlite3PcacheOpen(szPageDflt, nExtra, !memDb,
! 4522: !memDb?pagerStress:0, (void *)pPager, pPager->pPCache);
! 4523:
! 4524: PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename));
! 4525: IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename))
! 4526:
! 4527: pPager->useJournal = (u8)useJournal;
! 4528: pPager->noReadlock = (noReadlock && readOnly) ?1:0;
! 4529: /* pPager->stmtOpen = 0; */
! 4530: /* pPager->stmtInUse = 0; */
! 4531: /* pPager->nRef = 0; */
! 4532: /* pPager->stmtSize = 0; */
! 4533: /* pPager->stmtJSize = 0; */
! 4534: /* pPager->nPage = 0; */
! 4535: pPager->mxPgno = SQLITE_MAX_PAGE_COUNT;
! 4536: /* pPager->state = PAGER_UNLOCK; */
! 4537: #if 0
! 4538: assert( pPager->state == (tempFile ? PAGER_EXCLUSIVE : PAGER_UNLOCK) );
! 4539: #endif
! 4540: /* pPager->errMask = 0; */
! 4541: pPager->tempFile = (u8)tempFile;
! 4542: assert( tempFile==PAGER_LOCKINGMODE_NORMAL
! 4543: || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE );
! 4544: assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 );
! 4545: pPager->exclusiveMode = (u8)tempFile;
! 4546: pPager->changeCountDone = pPager->tempFile;
! 4547: pPager->memDb = (u8)memDb;
! 4548: pPager->readOnly = (u8)readOnly;
! 4549: assert( useJournal || pPager->tempFile );
! 4550: pPager->noSync = pPager->tempFile;
! 4551: if( pPager->noSync ){
! 4552: assert( pPager->fullSync==0 );
! 4553: assert( pPager->syncFlags==0 );
! 4554: assert( pPager->walSyncFlags==0 );
! 4555: assert( pPager->ckptSyncFlags==0 );
! 4556: }else{
! 4557: pPager->fullSync = 1;
! 4558: pPager->syncFlags = SQLITE_SYNC_NORMAL;
! 4559: pPager->walSyncFlags = SQLITE_SYNC_NORMAL | WAL_SYNC_TRANSACTIONS;
! 4560: pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL;
! 4561: }
! 4562: /* pPager->pFirst = 0; */
! 4563: /* pPager->pFirstSynced = 0; */
! 4564: /* pPager->pLast = 0; */
! 4565: pPager->nExtra = (u16)nExtra;
! 4566: pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT;
! 4567: assert( isOpen(pPager->fd) || tempFile );
! 4568: setSectorSize(pPager);
! 4569: if( !useJournal ){
! 4570: pPager->journalMode = PAGER_JOURNALMODE_OFF;
! 4571: }else if( memDb ){
! 4572: pPager->journalMode = PAGER_JOURNALMODE_MEMORY;
! 4573: }
! 4574: /* pPager->xBusyHandler = 0; */
! 4575: /* pPager->pBusyHandlerArg = 0; */
! 4576: pPager->xReiniter = xReinit;
! 4577: /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
! 4578:
! 4579: *ppPager = pPager;
! 4580: return SQLITE_OK;
! 4581: }
! 4582:
! 4583:
! 4584:
! 4585: /*
! 4586: ** This function is called after transitioning from PAGER_UNLOCK to
! 4587: ** PAGER_SHARED state. It tests if there is a hot journal present in
! 4588: ** the file-system for the given pager. A hot journal is one that
! 4589: ** needs to be played back. According to this function, a hot-journal
! 4590: ** file exists if the following criteria are met:
! 4591: **
! 4592: ** * The journal file exists in the file system, and
! 4593: ** * No process holds a RESERVED or greater lock on the database file, and
! 4594: ** * The database file itself is greater than 0 bytes in size, and
! 4595: ** * The first byte of the journal file exists and is not 0x00.
! 4596: **
! 4597: ** If the current size of the database file is 0 but a journal file
! 4598: ** exists, that is probably an old journal left over from a prior
! 4599: ** database with the same name. In this case the journal file is
! 4600: ** just deleted using OsDelete, *pExists is set to 0 and SQLITE_OK
! 4601: ** is returned.
! 4602: **
! 4603: ** This routine does not check if there is a master journal filename
! 4604: ** at the end of the file. If there is, and that master journal file
! 4605: ** does not exist, then the journal file is not really hot. In this
! 4606: ** case this routine will return a false-positive. The pager_playback()
! 4607: ** routine will discover that the journal file is not really hot and
! 4608: ** will not roll it back.
! 4609: **
! 4610: ** If a hot-journal file is found to exist, *pExists is set to 1 and
! 4611: ** SQLITE_OK returned. If no hot-journal file is present, *pExists is
! 4612: ** set to 0 and SQLITE_OK returned. If an IO error occurs while trying
! 4613: ** to determine whether or not a hot-journal file exists, the IO error
! 4614: ** code is returned and the value of *pExists is undefined.
! 4615: */
! 4616: static int hasHotJournal(Pager *pPager, int *pExists){
! 4617: sqlite3_vfs * const pVfs = pPager->pVfs;
! 4618: int rc = SQLITE_OK; /* Return code */
! 4619: int exists = 1; /* True if a journal file is present */
! 4620: int jrnlOpen = !!isOpen(pPager->jfd);
! 4621:
! 4622: assert( pPager->useJournal );
! 4623: assert( isOpen(pPager->fd) );
! 4624: assert( pPager->eState==PAGER_OPEN );
! 4625:
! 4626: assert( jrnlOpen==0 || ( sqlite3OsDeviceCharacteristics(pPager->jfd) &
! 4627: SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN
! 4628: ));
! 4629:
! 4630: *pExists = 0;
! 4631: if( !jrnlOpen ){
! 4632: rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists);
! 4633: }
! 4634: if( rc==SQLITE_OK && exists ){
! 4635: int locked = 0; /* True if some process holds a RESERVED lock */
! 4636:
! 4637: /* Race condition here: Another process might have been holding the
! 4638: ** the RESERVED lock and have a journal open at the sqlite3OsAccess()
! 4639: ** call above, but then delete the journal and drop the lock before
! 4640: ** we get to the following sqlite3OsCheckReservedLock() call. If that
! 4641: ** is the case, this routine might think there is a hot journal when
! 4642: ** in fact there is none. This results in a false-positive which will
! 4643: ** be dealt with by the playback routine. Ticket #3883.
! 4644: */
! 4645: rc = sqlite3OsCheckReservedLock(pPager->fd, &locked);
! 4646: if( rc==SQLITE_OK && !locked ){
! 4647: Pgno nPage; /* Number of pages in database file */
! 4648:
! 4649: /* Check the size of the database file. If it consists of 0 pages,
! 4650: ** then delete the journal file. See the header comment above for
! 4651: ** the reasoning here. Delete the obsolete journal file under
! 4652: ** a RESERVED lock to avoid race conditions and to avoid violating
! 4653: ** [H33020].
! 4654: */
! 4655: rc = pagerPagecount(pPager, &nPage);
! 4656: if( rc==SQLITE_OK ){
! 4657: if( nPage==0 ){
! 4658: sqlite3BeginBenignMalloc();
! 4659: if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){
! 4660: sqlite3OsDelete(pVfs, pPager->zJournal, 0);
! 4661: if( !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK);
! 4662: }
! 4663: sqlite3EndBenignMalloc();
! 4664: }else{
! 4665: /* The journal file exists and no other connection has a reserved
! 4666: ** or greater lock on the database file. Now check that there is
! 4667: ** at least one non-zero bytes at the start of the journal file.
! 4668: ** If there is, then we consider this journal to be hot. If not,
! 4669: ** it can be ignored.
! 4670: */
! 4671: if( !jrnlOpen ){
! 4672: int f = SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL;
! 4673: rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f);
! 4674: }
! 4675: if( rc==SQLITE_OK ){
! 4676: u8 first = 0;
! 4677: rc = sqlite3OsRead(pPager->jfd, (void *)&first, 1, 0);
! 4678: if( rc==SQLITE_IOERR_SHORT_READ ){
! 4679: rc = SQLITE_OK;
! 4680: }
! 4681: if( !jrnlOpen ){
! 4682: sqlite3OsClose(pPager->jfd);
! 4683: }
! 4684: *pExists = (first!=0);
! 4685: }else if( rc==SQLITE_CANTOPEN ){
! 4686: /* If we cannot open the rollback journal file in order to see if
! 4687: ** its has a zero header, that might be due to an I/O error, or
! 4688: ** it might be due to the race condition described above and in
! 4689: ** ticket #3883. Either way, assume that the journal is hot.
! 4690: ** This might be a false positive. But if it is, then the
! 4691: ** automatic journal playback and recovery mechanism will deal
! 4692: ** with it under an EXCLUSIVE lock where we do not need to
! 4693: ** worry so much with race conditions.
! 4694: */
! 4695: *pExists = 1;
! 4696: rc = SQLITE_OK;
! 4697: }
! 4698: }
! 4699: }
! 4700: }
! 4701: }
! 4702:
! 4703: return rc;
! 4704: }
! 4705:
! 4706: /*
! 4707: ** This function is called to obtain a shared lock on the database file.
! 4708: ** It is illegal to call sqlite3PagerAcquire() until after this function
! 4709: ** has been successfully called. If a shared-lock is already held when
! 4710: ** this function is called, it is a no-op.
! 4711: **
! 4712: ** The following operations are also performed by this function.
! 4713: **
! 4714: ** 1) If the pager is currently in PAGER_OPEN state (no lock held
! 4715: ** on the database file), then an attempt is made to obtain a
! 4716: ** SHARED lock on the database file. Immediately after obtaining
! 4717: ** the SHARED lock, the file-system is checked for a hot-journal,
! 4718: ** which is played back if present. Following any hot-journal
! 4719: ** rollback, the contents of the cache are validated by checking
! 4720: ** the 'change-counter' field of the database file header and
! 4721: ** discarded if they are found to be invalid.
! 4722: **
! 4723: ** 2) If the pager is running in exclusive-mode, and there are currently
! 4724: ** no outstanding references to any pages, and is in the error state,
! 4725: ** then an attempt is made to clear the error state by discarding
! 4726: ** the contents of the page cache and rolling back any open journal
! 4727: ** file.
! 4728: **
! 4729: ** If everything is successful, SQLITE_OK is returned. If an IO error
! 4730: ** occurs while locking the database, checking for a hot-journal file or
! 4731: ** rolling back a journal file, the IO error code is returned.
! 4732: */
! 4733: int sqlite3PagerSharedLock(Pager *pPager){
! 4734: int rc = SQLITE_OK; /* Return code */
! 4735:
! 4736: /* This routine is only called from b-tree and only when there are no
! 4737: ** outstanding pages. This implies that the pager state should either
! 4738: ** be OPEN or READER. READER is only possible if the pager is or was in
! 4739: ** exclusive access mode.
! 4740: */
! 4741: assert( sqlite3PcacheRefCount(pPager->pPCache)==0 );
! 4742: assert( assert_pager_state(pPager) );
! 4743: assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER );
! 4744: if( NEVER(MEMDB && pPager->errCode) ){ return pPager->errCode; }
! 4745:
! 4746: if( !pagerUseWal(pPager) && pPager->eState==PAGER_OPEN ){
! 4747: int bHotJournal = 1; /* True if there exists a hot journal-file */
! 4748:
! 4749: assert( !MEMDB );
! 4750: assert( pPager->noReadlock==0 || pPager->readOnly );
! 4751:
! 4752: if( pPager->noReadlock==0 ){
! 4753: rc = pager_wait_on_lock(pPager, SHARED_LOCK);
! 4754: if( rc!=SQLITE_OK ){
! 4755: assert( pPager->eLock==NO_LOCK || pPager->eLock==UNKNOWN_LOCK );
! 4756: goto failed;
! 4757: }
! 4758: }
! 4759:
! 4760: /* If a journal file exists, and there is no RESERVED lock on the
! 4761: ** database file, then it either needs to be played back or deleted.
! 4762: */
! 4763: if( pPager->eLock<=SHARED_LOCK ){
! 4764: rc = hasHotJournal(pPager, &bHotJournal);
! 4765: }
! 4766: if( rc!=SQLITE_OK ){
! 4767: goto failed;
! 4768: }
! 4769: if( bHotJournal ){
! 4770: /* Get an EXCLUSIVE lock on the database file. At this point it is
! 4771: ** important that a RESERVED lock is not obtained on the way to the
! 4772: ** EXCLUSIVE lock. If it were, another process might open the
! 4773: ** database file, detect the RESERVED lock, and conclude that the
! 4774: ** database is safe to read while this process is still rolling the
! 4775: ** hot-journal back.
! 4776: **
! 4777: ** Because the intermediate RESERVED lock is not requested, any
! 4778: ** other process attempting to access the database file will get to
! 4779: ** this point in the code and fail to obtain its own EXCLUSIVE lock
! 4780: ** on the database file.
! 4781: **
! 4782: ** Unless the pager is in locking_mode=exclusive mode, the lock is
! 4783: ** downgraded to SHARED_LOCK before this function returns.
! 4784: */
! 4785: rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
! 4786: if( rc!=SQLITE_OK ){
! 4787: goto failed;
! 4788: }
! 4789:
! 4790: /* If it is not already open and the file exists on disk, open the
! 4791: ** journal for read/write access. Write access is required because
! 4792: ** in exclusive-access mode the file descriptor will be kept open
! 4793: ** and possibly used for a transaction later on. Also, write-access
! 4794: ** is usually required to finalize the journal in journal_mode=persist
! 4795: ** mode (and also for journal_mode=truncate on some systems).
! 4796: **
! 4797: ** If the journal does not exist, it usually means that some
! 4798: ** other connection managed to get in and roll it back before
! 4799: ** this connection obtained the exclusive lock above. Or, it
! 4800: ** may mean that the pager was in the error-state when this
! 4801: ** function was called and the journal file does not exist.
! 4802: */
! 4803: if( !isOpen(pPager->jfd) ){
! 4804: sqlite3_vfs * const pVfs = pPager->pVfs;
! 4805: int bExists; /* True if journal file exists */
! 4806: rc = sqlite3OsAccess(
! 4807: pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &bExists);
! 4808: if( rc==SQLITE_OK && bExists ){
! 4809: int fout = 0;
! 4810: int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL;
! 4811: assert( !pPager->tempFile );
! 4812: rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout);
! 4813: assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
! 4814: if( rc==SQLITE_OK && fout&SQLITE_OPEN_READONLY ){
! 4815: rc = SQLITE_CANTOPEN_BKPT;
! 4816: sqlite3OsClose(pPager->jfd);
! 4817: }
! 4818: }
! 4819: }
! 4820:
! 4821: /* Playback and delete the journal. Drop the database write
! 4822: ** lock and reacquire the read lock. Purge the cache before
! 4823: ** playing back the hot-journal so that we don't end up with
! 4824: ** an inconsistent cache. Sync the hot journal before playing
! 4825: ** it back since the process that crashed and left the hot journal
! 4826: ** probably did not sync it and we are required to always sync
! 4827: ** the journal before playing it back.
! 4828: */
! 4829: if( isOpen(pPager->jfd) ){
! 4830: assert( rc==SQLITE_OK );
! 4831: rc = pagerSyncHotJournal(pPager);
! 4832: if( rc==SQLITE_OK ){
! 4833: rc = pager_playback(pPager, 1);
! 4834: pPager->eState = PAGER_OPEN;
! 4835: }
! 4836: }else if( !pPager->exclusiveMode ){
! 4837: pagerUnlockDb(pPager, SHARED_LOCK);
! 4838: }
! 4839:
! 4840: if( rc!=SQLITE_OK ){
! 4841: /* This branch is taken if an error occurs while trying to open
! 4842: ** or roll back a hot-journal while holding an EXCLUSIVE lock. The
! 4843: ** pager_unlock() routine will be called before returning to unlock
! 4844: ** the file. If the unlock attempt fails, then Pager.eLock must be
! 4845: ** set to UNKNOWN_LOCK (see the comment above the #define for
! 4846: ** UNKNOWN_LOCK above for an explanation).
! 4847: **
! 4848: ** In order to get pager_unlock() to do this, set Pager.eState to
! 4849: ** PAGER_ERROR now. This is not actually counted as a transition
! 4850: ** to ERROR state in the state diagram at the top of this file,
! 4851: ** since we know that the same call to pager_unlock() will very
! 4852: ** shortly transition the pager object to the OPEN state. Calling
! 4853: ** assert_pager_state() would fail now, as it should not be possible
! 4854: ** to be in ERROR state when there are zero outstanding page
! 4855: ** references.
! 4856: */
! 4857: pager_error(pPager, rc);
! 4858: goto failed;
! 4859: }
! 4860:
! 4861: assert( pPager->eState==PAGER_OPEN );
! 4862: assert( (pPager->eLock==SHARED_LOCK)
! 4863: || (pPager->exclusiveMode && pPager->eLock>SHARED_LOCK)
! 4864: );
! 4865: }
! 4866:
! 4867: if( !pPager->tempFile
! 4868: && (pPager->pBackup || sqlite3PcachePagecount(pPager->pPCache)>0)
! 4869: ){
! 4870: /* The shared-lock has just been acquired on the database file
! 4871: ** and there are already pages in the cache (from a previous
! 4872: ** read or write transaction). Check to see if the database
! 4873: ** has been modified. If the database has changed, flush the
! 4874: ** cache.
! 4875: **
! 4876: ** Database changes is detected by looking at 15 bytes beginning
! 4877: ** at offset 24 into the file. The first 4 of these 16 bytes are
! 4878: ** a 32-bit counter that is incremented with each change. The
! 4879: ** other bytes change randomly with each file change when
! 4880: ** a codec is in use.
! 4881: **
! 4882: ** There is a vanishingly small chance that a change will not be
! 4883: ** detected. The chance of an undetected change is so small that
! 4884: ** it can be neglected.
! 4885: */
! 4886: Pgno nPage = 0;
! 4887: char dbFileVers[sizeof(pPager->dbFileVers)];
! 4888:
! 4889: rc = pagerPagecount(pPager, &nPage);
! 4890: if( rc ) goto failed;
! 4891:
! 4892: if( nPage>0 ){
! 4893: IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers)));
! 4894: rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24);
! 4895: if( rc!=SQLITE_OK ){
! 4896: goto failed;
! 4897: }
! 4898: }else{
! 4899: memset(dbFileVers, 0, sizeof(dbFileVers));
! 4900: }
! 4901:
! 4902: if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){
! 4903: pager_reset(pPager);
! 4904: }
! 4905: }
! 4906:
! 4907: /* If there is a WAL file in the file-system, open this database in WAL
! 4908: ** mode. Otherwise, the following function call is a no-op.
! 4909: */
! 4910: rc = pagerOpenWalIfPresent(pPager);
! 4911: #ifndef SQLITE_OMIT_WAL
! 4912: assert( pPager->pWal==0 || rc==SQLITE_OK );
! 4913: #endif
! 4914: }
! 4915:
! 4916: if( pagerUseWal(pPager) ){
! 4917: assert( rc==SQLITE_OK );
! 4918: rc = pagerBeginReadTransaction(pPager);
! 4919: }
! 4920:
! 4921: if( pPager->eState==PAGER_OPEN && rc==SQLITE_OK ){
! 4922: rc = pagerPagecount(pPager, &pPager->dbSize);
! 4923: }
! 4924:
! 4925: failed:
! 4926: if( rc!=SQLITE_OK ){
! 4927: assert( !MEMDB );
! 4928: pager_unlock(pPager);
! 4929: assert( pPager->eState==PAGER_OPEN );
! 4930: }else{
! 4931: pPager->eState = PAGER_READER;
! 4932: }
! 4933: return rc;
! 4934: }
! 4935:
! 4936: /*
! 4937: ** If the reference count has reached zero, rollback any active
! 4938: ** transaction and unlock the pager.
! 4939: **
! 4940: ** Except, in locking_mode=EXCLUSIVE when there is nothing to in
! 4941: ** the rollback journal, the unlock is not performed and there is
! 4942: ** nothing to rollback, so this routine is a no-op.
! 4943: */
! 4944: static void pagerUnlockIfUnused(Pager *pPager){
! 4945: if( (sqlite3PcacheRefCount(pPager->pPCache)==0) ){
! 4946: pagerUnlockAndRollback(pPager);
! 4947: }
! 4948: }
! 4949:
! 4950: /*
! 4951: ** Acquire a reference to page number pgno in pager pPager (a page
! 4952: ** reference has type DbPage*). If the requested reference is
! 4953: ** successfully obtained, it is copied to *ppPage and SQLITE_OK returned.
! 4954: **
! 4955: ** If the requested page is already in the cache, it is returned.
! 4956: ** Otherwise, a new page object is allocated and populated with data
! 4957: ** read from the database file. In some cases, the pcache module may
! 4958: ** choose not to allocate a new page object and may reuse an existing
! 4959: ** object with no outstanding references.
! 4960: **
! 4961: ** The extra data appended to a page is always initialized to zeros the
! 4962: ** first time a page is loaded into memory. If the page requested is
! 4963: ** already in the cache when this function is called, then the extra
! 4964: ** data is left as it was when the page object was last used.
! 4965: **
! 4966: ** If the database image is smaller than the requested page or if a
! 4967: ** non-zero value is passed as the noContent parameter and the
! 4968: ** requested page is not already stored in the cache, then no
! 4969: ** actual disk read occurs. In this case the memory image of the
! 4970: ** page is initialized to all zeros.
! 4971: **
! 4972: ** If noContent is true, it means that we do not care about the contents
! 4973: ** of the page. This occurs in two seperate scenarios:
! 4974: **
! 4975: ** a) When reading a free-list leaf page from the database, and
! 4976: **
! 4977: ** b) When a savepoint is being rolled back and we need to load
! 4978: ** a new page into the cache to be filled with the data read
! 4979: ** from the savepoint journal.
! 4980: **
! 4981: ** If noContent is true, then the data returned is zeroed instead of
! 4982: ** being read from the database. Additionally, the bits corresponding
! 4983: ** to pgno in Pager.pInJournal (bitvec of pages already written to the
! 4984: ** journal file) and the PagerSavepoint.pInSavepoint bitvecs of any open
! 4985: ** savepoints are set. This means if the page is made writable at any
! 4986: ** point in the future, using a call to sqlite3PagerWrite(), its contents
! 4987: ** will not be journaled. This saves IO.
! 4988: **
! 4989: ** The acquisition might fail for several reasons. In all cases,
! 4990: ** an appropriate error code is returned and *ppPage is set to NULL.
! 4991: **
! 4992: ** See also sqlite3PagerLookup(). Both this routine and Lookup() attempt
! 4993: ** to find a page in the in-memory cache first. If the page is not already
! 4994: ** in memory, this routine goes to disk to read it in whereas Lookup()
! 4995: ** just returns 0. This routine acquires a read-lock the first time it
! 4996: ** has to go to disk, and could also playback an old journal if necessary.
! 4997: ** Since Lookup() never goes to disk, it never has to deal with locks
! 4998: ** or journal files.
! 4999: */
! 5000: int sqlite3PagerAcquire(
! 5001: Pager *pPager, /* The pager open on the database file */
! 5002: Pgno pgno, /* Page number to fetch */
! 5003: DbPage **ppPage, /* Write a pointer to the page here */
! 5004: int noContent /* Do not bother reading content from disk if true */
! 5005: ){
! 5006: int rc;
! 5007: PgHdr *pPg;
! 5008:
! 5009: assert( pPager->eState>=PAGER_READER );
! 5010: assert( assert_pager_state(pPager) );
! 5011:
! 5012: if( pgno==0 ){
! 5013: return SQLITE_CORRUPT_BKPT;
! 5014: }
! 5015:
! 5016: /* If the pager is in the error state, return an error immediately.
! 5017: ** Otherwise, request the page from the PCache layer. */
! 5018: if( pPager->errCode!=SQLITE_OK ){
! 5019: rc = pPager->errCode;
! 5020: }else{
! 5021: rc = sqlite3PcacheFetch(pPager->pPCache, pgno, 1, ppPage);
! 5022: }
! 5023:
! 5024: if( rc!=SQLITE_OK ){
! 5025: /* Either the call to sqlite3PcacheFetch() returned an error or the
! 5026: ** pager was already in the error-state when this function was called.
! 5027: ** Set pPg to 0 and jump to the exception handler. */
! 5028: pPg = 0;
! 5029: goto pager_acquire_err;
! 5030: }
! 5031: assert( (*ppPage)->pgno==pgno );
! 5032: assert( (*ppPage)->pPager==pPager || (*ppPage)->pPager==0 );
! 5033:
! 5034: if( (*ppPage)->pPager && !noContent ){
! 5035: /* In this case the pcache already contains an initialized copy of
! 5036: ** the page. Return without further ado. */
! 5037: assert( pgno<=PAGER_MAX_PGNO && pgno!=PAGER_MJ_PGNO(pPager) );
! 5038: pPager->nHit++;
! 5039: return SQLITE_OK;
! 5040:
! 5041: }else{
! 5042: /* The pager cache has created a new page. Its content needs to
! 5043: ** be initialized. */
! 5044:
! 5045: pPg = *ppPage;
! 5046: pPg->pPager = pPager;
! 5047:
! 5048: /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page
! 5049: ** number greater than this, or the unused locking-page, is requested. */
! 5050: if( pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){
! 5051: rc = SQLITE_CORRUPT_BKPT;
! 5052: goto pager_acquire_err;
! 5053: }
! 5054:
! 5055: if( MEMDB || pPager->dbSize<pgno || noContent || !isOpen(pPager->fd) ){
! 5056: if( pgno>pPager->mxPgno ){
! 5057: rc = SQLITE_FULL;
! 5058: goto pager_acquire_err;
! 5059: }
! 5060: if( noContent ){
! 5061: /* Failure to set the bits in the InJournal bit-vectors is benign.
! 5062: ** It merely means that we might do some extra work to journal a
! 5063: ** page that does not need to be journaled. Nevertheless, be sure
! 5064: ** to test the case where a malloc error occurs while trying to set
! 5065: ** a bit in a bit vector.
! 5066: */
! 5067: sqlite3BeginBenignMalloc();
! 5068: if( pgno<=pPager->dbOrigSize ){
! 5069: TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno);
! 5070: testcase( rc==SQLITE_NOMEM );
! 5071: }
! 5072: TESTONLY( rc = ) addToSavepointBitvecs(pPager, pgno);
! 5073: testcase( rc==SQLITE_NOMEM );
! 5074: sqlite3EndBenignMalloc();
! 5075: }
! 5076: memset(pPg->pData, 0, pPager->pageSize);
! 5077: IOTRACE(("ZERO %p %d\n", pPager, pgno));
! 5078: }else{
! 5079: assert( pPg->pPager==pPager );
! 5080: pPager->nMiss++;
! 5081: rc = readDbPage(pPg);
! 5082: if( rc!=SQLITE_OK ){
! 5083: goto pager_acquire_err;
! 5084: }
! 5085: }
! 5086: pager_set_pagehash(pPg);
! 5087: }
! 5088:
! 5089: return SQLITE_OK;
! 5090:
! 5091: pager_acquire_err:
! 5092: assert( rc!=SQLITE_OK );
! 5093: if( pPg ){
! 5094: sqlite3PcacheDrop(pPg);
! 5095: }
! 5096: pagerUnlockIfUnused(pPager);
! 5097:
! 5098: *ppPage = 0;
! 5099: return rc;
! 5100: }
! 5101:
! 5102: /*
! 5103: ** Acquire a page if it is already in the in-memory cache. Do
! 5104: ** not read the page from disk. Return a pointer to the page,
! 5105: ** or 0 if the page is not in cache.
! 5106: **
! 5107: ** See also sqlite3PagerGet(). The difference between this routine
! 5108: ** and sqlite3PagerGet() is that _get() will go to the disk and read
! 5109: ** in the page if the page is not already in cache. This routine
! 5110: ** returns NULL if the page is not in cache or if a disk I/O error
! 5111: ** has ever happened.
! 5112: */
! 5113: DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){
! 5114: PgHdr *pPg = 0;
! 5115: assert( pPager!=0 );
! 5116: assert( pgno!=0 );
! 5117: assert( pPager->pPCache!=0 );
! 5118: assert( pPager->eState>=PAGER_READER && pPager->eState!=PAGER_ERROR );
! 5119: sqlite3PcacheFetch(pPager->pPCache, pgno, 0, &pPg);
! 5120: return pPg;
! 5121: }
! 5122:
! 5123: /*
! 5124: ** Release a page reference.
! 5125: **
! 5126: ** If the number of references to the page drop to zero, then the
! 5127: ** page is added to the LRU list. When all references to all pages
! 5128: ** are released, a rollback occurs and the lock on the database is
! 5129: ** removed.
! 5130: */
! 5131: void sqlite3PagerUnref(DbPage *pPg){
! 5132: if( pPg ){
! 5133: Pager *pPager = pPg->pPager;
! 5134: sqlite3PcacheRelease(pPg);
! 5135: pagerUnlockIfUnused(pPager);
! 5136: }
! 5137: }
! 5138:
! 5139: /*
! 5140: ** This function is called at the start of every write transaction.
! 5141: ** There must already be a RESERVED or EXCLUSIVE lock on the database
! 5142: ** file when this routine is called.
! 5143: **
! 5144: ** Open the journal file for pager pPager and write a journal header
! 5145: ** to the start of it. If there are active savepoints, open the sub-journal
! 5146: ** as well. This function is only used when the journal file is being
! 5147: ** opened to write a rollback log for a transaction. It is not used
! 5148: ** when opening a hot journal file to roll it back.
! 5149: **
! 5150: ** If the journal file is already open (as it may be in exclusive mode),
! 5151: ** then this function just writes a journal header to the start of the
! 5152: ** already open file.
! 5153: **
! 5154: ** Whether or not the journal file is opened by this function, the
! 5155: ** Pager.pInJournal bitvec structure is allocated.
! 5156: **
! 5157: ** Return SQLITE_OK if everything is successful. Otherwise, return
! 5158: ** SQLITE_NOMEM if the attempt to allocate Pager.pInJournal fails, or
! 5159: ** an IO error code if opening or writing the journal file fails.
! 5160: */
! 5161: static int pager_open_journal(Pager *pPager){
! 5162: int rc = SQLITE_OK; /* Return code */
! 5163: sqlite3_vfs * const pVfs = pPager->pVfs; /* Local cache of vfs pointer */
! 5164:
! 5165: assert( pPager->eState==PAGER_WRITER_LOCKED );
! 5166: assert( assert_pager_state(pPager) );
! 5167: assert( pPager->pInJournal==0 );
! 5168:
! 5169: /* If already in the error state, this function is a no-op. But on
! 5170: ** the other hand, this routine is never called if we are already in
! 5171: ** an error state. */
! 5172: if( NEVER(pPager->errCode) ) return pPager->errCode;
! 5173:
! 5174: if( !pagerUseWal(pPager) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
! 5175: pPager->pInJournal = sqlite3BitvecCreate(pPager->dbSize);
! 5176: if( pPager->pInJournal==0 ){
! 5177: return SQLITE_NOMEM;
! 5178: }
! 5179:
! 5180: /* Open the journal file if it is not already open. */
! 5181: if( !isOpen(pPager->jfd) ){
! 5182: if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){
! 5183: sqlite3MemJournalOpen(pPager->jfd);
! 5184: }else{
! 5185: const int flags = /* VFS flags to open journal file */
! 5186: SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|
! 5187: (pPager->tempFile ?
! 5188: (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL):
! 5189: (SQLITE_OPEN_MAIN_JOURNAL)
! 5190: );
! 5191: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
! 5192: rc = sqlite3JournalOpen(
! 5193: pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager)
! 5194: );
! 5195: #else
! 5196: rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0);
! 5197: #endif
! 5198: }
! 5199: assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
! 5200: }
! 5201:
! 5202:
! 5203: /* Write the first journal header to the journal file and open
! 5204: ** the sub-journal if necessary.
! 5205: */
! 5206: if( rc==SQLITE_OK ){
! 5207: /* TODO: Check if all of these are really required. */
! 5208: pPager->nRec = 0;
! 5209: pPager->journalOff = 0;
! 5210: pPager->setMaster = 0;
! 5211: pPager->journalHdr = 0;
! 5212: rc = writeJournalHdr(pPager);
! 5213: }
! 5214: }
! 5215:
! 5216: if( rc!=SQLITE_OK ){
! 5217: sqlite3BitvecDestroy(pPager->pInJournal);
! 5218: pPager->pInJournal = 0;
! 5219: }else{
! 5220: assert( pPager->eState==PAGER_WRITER_LOCKED );
! 5221: pPager->eState = PAGER_WRITER_CACHEMOD;
! 5222: }
! 5223:
! 5224: return rc;
! 5225: }
! 5226:
! 5227: /*
! 5228: ** Begin a write-transaction on the specified pager object. If a
! 5229: ** write-transaction has already been opened, this function is a no-op.
! 5230: **
! 5231: ** If the exFlag argument is false, then acquire at least a RESERVED
! 5232: ** lock on the database file. If exFlag is true, then acquire at least
! 5233: ** an EXCLUSIVE lock. If such a lock is already held, no locking
! 5234: ** functions need be called.
! 5235: **
! 5236: ** If the subjInMemory argument is non-zero, then any sub-journal opened
! 5237: ** within this transaction will be opened as an in-memory file. This
! 5238: ** has no effect if the sub-journal is already opened (as it may be when
! 5239: ** running in exclusive mode) or if the transaction does not require a
! 5240: ** sub-journal. If the subjInMemory argument is zero, then any required
! 5241: ** sub-journal is implemented in-memory if pPager is an in-memory database,
! 5242: ** or using a temporary file otherwise.
! 5243: */
! 5244: int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){
! 5245: int rc = SQLITE_OK;
! 5246:
! 5247: if( pPager->errCode ) return pPager->errCode;
! 5248: assert( pPager->eState>=PAGER_READER && pPager->eState<PAGER_ERROR );
! 5249: pPager->subjInMemory = (u8)subjInMemory;
! 5250:
! 5251: if( ALWAYS(pPager->eState==PAGER_READER) ){
! 5252: assert( pPager->pInJournal==0 );
! 5253:
! 5254: if( pagerUseWal(pPager) ){
! 5255: /* If the pager is configured to use locking_mode=exclusive, and an
! 5256: ** exclusive lock on the database is not already held, obtain it now.
! 5257: */
! 5258: if( pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, -1) ){
! 5259: rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
! 5260: if( rc!=SQLITE_OK ){
! 5261: return rc;
! 5262: }
! 5263: sqlite3WalExclusiveMode(pPager->pWal, 1);
! 5264: }
! 5265:
! 5266: /* Grab the write lock on the log file. If successful, upgrade to
! 5267: ** PAGER_RESERVED state. Otherwise, return an error code to the caller.
! 5268: ** The busy-handler is not invoked if another connection already
! 5269: ** holds the write-lock. If possible, the upper layer will call it.
! 5270: */
! 5271: rc = sqlite3WalBeginWriteTransaction(pPager->pWal);
! 5272: }else{
! 5273: /* Obtain a RESERVED lock on the database file. If the exFlag parameter
! 5274: ** is true, then immediately upgrade this to an EXCLUSIVE lock. The
! 5275: ** busy-handler callback can be used when upgrading to the EXCLUSIVE
! 5276: ** lock, but not when obtaining the RESERVED lock.
! 5277: */
! 5278: rc = pagerLockDb(pPager, RESERVED_LOCK);
! 5279: if( rc==SQLITE_OK && exFlag ){
! 5280: rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
! 5281: }
! 5282: }
! 5283:
! 5284: if( rc==SQLITE_OK ){
! 5285: /* Change to WRITER_LOCKED state.
! 5286: **
! 5287: ** WAL mode sets Pager.eState to PAGER_WRITER_LOCKED or CACHEMOD
! 5288: ** when it has an open transaction, but never to DBMOD or FINISHED.
! 5289: ** This is because in those states the code to roll back savepoint
! 5290: ** transactions may copy data from the sub-journal into the database
! 5291: ** file as well as into the page cache. Which would be incorrect in
! 5292: ** WAL mode.
! 5293: */
! 5294: pPager->eState = PAGER_WRITER_LOCKED;
! 5295: pPager->dbHintSize = pPager->dbSize;
! 5296: pPager->dbFileSize = pPager->dbSize;
! 5297: pPager->dbOrigSize = pPager->dbSize;
! 5298: pPager->journalOff = 0;
! 5299: }
! 5300:
! 5301: assert( rc==SQLITE_OK || pPager->eState==PAGER_READER );
! 5302: assert( rc!=SQLITE_OK || pPager->eState==PAGER_WRITER_LOCKED );
! 5303: assert( assert_pager_state(pPager) );
! 5304: }
! 5305:
! 5306: PAGERTRACE(("TRANSACTION %d\n", PAGERID(pPager)));
! 5307: return rc;
! 5308: }
! 5309:
! 5310: /*
! 5311: ** Mark a single data page as writeable. The page is written into the
! 5312: ** main journal or sub-journal as required. If the page is written into
! 5313: ** one of the journals, the corresponding bit is set in the
! 5314: ** Pager.pInJournal bitvec and the PagerSavepoint.pInSavepoint bitvecs
! 5315: ** of any open savepoints as appropriate.
! 5316: */
! 5317: static int pager_write(PgHdr *pPg){
! 5318: void *pData = pPg->pData;
! 5319: Pager *pPager = pPg->pPager;
! 5320: int rc = SQLITE_OK;
! 5321:
! 5322: /* This routine is not called unless a write-transaction has already
! 5323: ** been started. The journal file may or may not be open at this point.
! 5324: ** It is never called in the ERROR state.
! 5325: */
! 5326: assert( pPager->eState==PAGER_WRITER_LOCKED
! 5327: || pPager->eState==PAGER_WRITER_CACHEMOD
! 5328: || pPager->eState==PAGER_WRITER_DBMOD
! 5329: );
! 5330: assert( assert_pager_state(pPager) );
! 5331:
! 5332: /* If an error has been previously detected, report the same error
! 5333: ** again. This should not happen, but the check provides robustness. */
! 5334: if( NEVER(pPager->errCode) ) return pPager->errCode;
! 5335:
! 5336: /* Higher-level routines never call this function if database is not
! 5337: ** writable. But check anyway, just for robustness. */
! 5338: if( NEVER(pPager->readOnly) ) return SQLITE_PERM;
! 5339:
! 5340: CHECK_PAGE(pPg);
! 5341:
! 5342: /* The journal file needs to be opened. Higher level routines have already
! 5343: ** obtained the necessary locks to begin the write-transaction, but the
! 5344: ** rollback journal might not yet be open. Open it now if this is the case.
! 5345: **
! 5346: ** This is done before calling sqlite3PcacheMakeDirty() on the page.
! 5347: ** Otherwise, if it were done after calling sqlite3PcacheMakeDirty(), then
! 5348: ** an error might occur and the pager would end up in WRITER_LOCKED state
! 5349: ** with pages marked as dirty in the cache.
! 5350: */
! 5351: if( pPager->eState==PAGER_WRITER_LOCKED ){
! 5352: rc = pager_open_journal(pPager);
! 5353: if( rc!=SQLITE_OK ) return rc;
! 5354: }
! 5355: assert( pPager->eState>=PAGER_WRITER_CACHEMOD );
! 5356: assert( assert_pager_state(pPager) );
! 5357:
! 5358: /* Mark the page as dirty. If the page has already been written
! 5359: ** to the journal then we can return right away.
! 5360: */
! 5361: sqlite3PcacheMakeDirty(pPg);
! 5362: if( pageInJournal(pPg) && !subjRequiresPage(pPg) ){
! 5363: assert( !pagerUseWal(pPager) );
! 5364: }else{
! 5365:
! 5366: /* The transaction journal now exists and we have a RESERVED or an
! 5367: ** EXCLUSIVE lock on the main database file. Write the current page to
! 5368: ** the transaction journal if it is not there already.
! 5369: */
! 5370: if( !pageInJournal(pPg) && !pagerUseWal(pPager) ){
! 5371: assert( pagerUseWal(pPager)==0 );
! 5372: if( pPg->pgno<=pPager->dbOrigSize && isOpen(pPager->jfd) ){
! 5373: u32 cksum;
! 5374: char *pData2;
! 5375: i64 iOff = pPager->journalOff;
! 5376:
! 5377: /* We should never write to the journal file the page that
! 5378: ** contains the database locks. The following assert verifies
! 5379: ** that we do not. */
! 5380: assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) );
! 5381:
! 5382: assert( pPager->journalHdr<=pPager->journalOff );
! 5383: CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2);
! 5384: cksum = pager_cksum(pPager, (u8*)pData2);
! 5385:
! 5386: /* Even if an IO or diskfull error occurs while journalling the
! 5387: ** page in the block above, set the need-sync flag for the page.
! 5388: ** Otherwise, when the transaction is rolled back, the logic in
! 5389: ** playback_one_page() will think that the page needs to be restored
! 5390: ** in the database file. And if an IO error occurs while doing so,
! 5391: ** then corruption may follow.
! 5392: */
! 5393: pPg->flags |= PGHDR_NEED_SYNC;
! 5394:
! 5395: rc = write32bits(pPager->jfd, iOff, pPg->pgno);
! 5396: if( rc!=SQLITE_OK ) return rc;
! 5397: rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, iOff+4);
! 5398: if( rc!=SQLITE_OK ) return rc;
! 5399: rc = write32bits(pPager->jfd, iOff+pPager->pageSize+4, cksum);
! 5400: if( rc!=SQLITE_OK ) return rc;
! 5401:
! 5402: IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno,
! 5403: pPager->journalOff, pPager->pageSize));
! 5404: PAGER_INCR(sqlite3_pager_writej_count);
! 5405: PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n",
! 5406: PAGERID(pPager), pPg->pgno,
! 5407: ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg)));
! 5408:
! 5409: pPager->journalOff += 8 + pPager->pageSize;
! 5410: pPager->nRec++;
! 5411: assert( pPager->pInJournal!=0 );
! 5412: rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno);
! 5413: testcase( rc==SQLITE_NOMEM );
! 5414: assert( rc==SQLITE_OK || rc==SQLITE_NOMEM );
! 5415: rc |= addToSavepointBitvecs(pPager, pPg->pgno);
! 5416: if( rc!=SQLITE_OK ){
! 5417: assert( rc==SQLITE_NOMEM );
! 5418: return rc;
! 5419: }
! 5420: }else{
! 5421: if( pPager->eState!=PAGER_WRITER_DBMOD ){
! 5422: pPg->flags |= PGHDR_NEED_SYNC;
! 5423: }
! 5424: PAGERTRACE(("APPEND %d page %d needSync=%d\n",
! 5425: PAGERID(pPager), pPg->pgno,
! 5426: ((pPg->flags&PGHDR_NEED_SYNC)?1:0)));
! 5427: }
! 5428: }
! 5429:
! 5430: /* If the statement journal is open and the page is not in it,
! 5431: ** then write the current page to the statement journal. Note that
! 5432: ** the statement journal format differs from the standard journal format
! 5433: ** in that it omits the checksums and the header.
! 5434: */
! 5435: if( subjRequiresPage(pPg) ){
! 5436: rc = subjournalPage(pPg);
! 5437: }
! 5438: }
! 5439:
! 5440: /* Update the database size and return.
! 5441: */
! 5442: if( pPager->dbSize<pPg->pgno ){
! 5443: pPager->dbSize = pPg->pgno;
! 5444: }
! 5445: return rc;
! 5446: }
! 5447:
! 5448: /*
! 5449: ** Mark a data page as writeable. This routine must be called before
! 5450: ** making changes to a page. The caller must check the return value
! 5451: ** of this function and be careful not to change any page data unless
! 5452: ** this routine returns SQLITE_OK.
! 5453: **
! 5454: ** The difference between this function and pager_write() is that this
! 5455: ** function also deals with the special case where 2 or more pages
! 5456: ** fit on a single disk sector. In this case all co-resident pages
! 5457: ** must have been written to the journal file before returning.
! 5458: **
! 5459: ** If an error occurs, SQLITE_NOMEM or an IO error code is returned
! 5460: ** as appropriate. Otherwise, SQLITE_OK.
! 5461: */
! 5462: int sqlite3PagerWrite(DbPage *pDbPage){
! 5463: int rc = SQLITE_OK;
! 5464:
! 5465: PgHdr *pPg = pDbPage;
! 5466: Pager *pPager = pPg->pPager;
! 5467: Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize);
! 5468:
! 5469: assert( pPager->eState>=PAGER_WRITER_LOCKED );
! 5470: assert( pPager->eState!=PAGER_ERROR );
! 5471: assert( assert_pager_state(pPager) );
! 5472:
! 5473: if( nPagePerSector>1 ){
! 5474: Pgno nPageCount; /* Total number of pages in database file */
! 5475: Pgno pg1; /* First page of the sector pPg is located on. */
! 5476: int nPage = 0; /* Number of pages starting at pg1 to journal */
! 5477: int ii; /* Loop counter */
! 5478: int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */
! 5479:
! 5480: /* Set the doNotSyncSpill flag to 1. This is because we cannot allow
! 5481: ** a journal header to be written between the pages journaled by
! 5482: ** this function.
! 5483: */
! 5484: assert( !MEMDB );
! 5485: assert( pPager->doNotSyncSpill==0 );
! 5486: pPager->doNotSyncSpill++;
! 5487:
! 5488: /* This trick assumes that both the page-size and sector-size are
! 5489: ** an integer power of 2. It sets variable pg1 to the identifier
! 5490: ** of the first page of the sector pPg is located on.
! 5491: */
! 5492: pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1;
! 5493:
! 5494: nPageCount = pPager->dbSize;
! 5495: if( pPg->pgno>nPageCount ){
! 5496: nPage = (pPg->pgno - pg1)+1;
! 5497: }else if( (pg1+nPagePerSector-1)>nPageCount ){
! 5498: nPage = nPageCount+1-pg1;
! 5499: }else{
! 5500: nPage = nPagePerSector;
! 5501: }
! 5502: assert(nPage>0);
! 5503: assert(pg1<=pPg->pgno);
! 5504: assert((pg1+nPage)>pPg->pgno);
! 5505:
! 5506: for(ii=0; ii<nPage && rc==SQLITE_OK; ii++){
! 5507: Pgno pg = pg1+ii;
! 5508: PgHdr *pPage;
! 5509: if( pg==pPg->pgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){
! 5510: if( pg!=PAGER_MJ_PGNO(pPager) ){
! 5511: rc = sqlite3PagerGet(pPager, pg, &pPage);
! 5512: if( rc==SQLITE_OK ){
! 5513: rc = pager_write(pPage);
! 5514: if( pPage->flags&PGHDR_NEED_SYNC ){
! 5515: needSync = 1;
! 5516: }
! 5517: sqlite3PagerUnref(pPage);
! 5518: }
! 5519: }
! 5520: }else if( (pPage = pager_lookup(pPager, pg))!=0 ){
! 5521: if( pPage->flags&PGHDR_NEED_SYNC ){
! 5522: needSync = 1;
! 5523: }
! 5524: sqlite3PagerUnref(pPage);
! 5525: }
! 5526: }
! 5527:
! 5528: /* If the PGHDR_NEED_SYNC flag is set for any of the nPage pages
! 5529: ** starting at pg1, then it needs to be set for all of them. Because
! 5530: ** writing to any of these nPage pages may damage the others, the
! 5531: ** journal file must contain sync()ed copies of all of them
! 5532: ** before any of them can be written out to the database file.
! 5533: */
! 5534: if( rc==SQLITE_OK && needSync ){
! 5535: assert( !MEMDB );
! 5536: for(ii=0; ii<nPage; ii++){
! 5537: PgHdr *pPage = pager_lookup(pPager, pg1+ii);
! 5538: if( pPage ){
! 5539: pPage->flags |= PGHDR_NEED_SYNC;
! 5540: sqlite3PagerUnref(pPage);
! 5541: }
! 5542: }
! 5543: }
! 5544:
! 5545: assert( pPager->doNotSyncSpill==1 );
! 5546: pPager->doNotSyncSpill--;
! 5547: }else{
! 5548: rc = pager_write(pDbPage);
! 5549: }
! 5550: return rc;
! 5551: }
! 5552:
! 5553: /*
! 5554: ** Return TRUE if the page given in the argument was previously passed
! 5555: ** to sqlite3PagerWrite(). In other words, return TRUE if it is ok
! 5556: ** to change the content of the page.
! 5557: */
! 5558: #ifndef NDEBUG
! 5559: int sqlite3PagerIswriteable(DbPage *pPg){
! 5560: return pPg->flags&PGHDR_DIRTY;
! 5561: }
! 5562: #endif
! 5563:
! 5564: /*
! 5565: ** A call to this routine tells the pager that it is not necessary to
! 5566: ** write the information on page pPg back to the disk, even though
! 5567: ** that page might be marked as dirty. This happens, for example, when
! 5568: ** the page has been added as a leaf of the freelist and so its
! 5569: ** content no longer matters.
! 5570: **
! 5571: ** The overlying software layer calls this routine when all of the data
! 5572: ** on the given page is unused. The pager marks the page as clean so
! 5573: ** that it does not get written to disk.
! 5574: **
! 5575: ** Tests show that this optimization can quadruple the speed of large
! 5576: ** DELETE operations.
! 5577: */
! 5578: void sqlite3PagerDontWrite(PgHdr *pPg){
! 5579: Pager *pPager = pPg->pPager;
! 5580: if( (pPg->flags&PGHDR_DIRTY) && pPager->nSavepoint==0 ){
! 5581: PAGERTRACE(("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager)));
! 5582: IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno))
! 5583: pPg->flags |= PGHDR_DONT_WRITE;
! 5584: pager_set_pagehash(pPg);
! 5585: }
! 5586: }
! 5587:
! 5588: /*
! 5589: ** This routine is called to increment the value of the database file
! 5590: ** change-counter, stored as a 4-byte big-endian integer starting at
! 5591: ** byte offset 24 of the pager file. The secondary change counter at
! 5592: ** 92 is also updated, as is the SQLite version number at offset 96.
! 5593: **
! 5594: ** But this only happens if the pPager->changeCountDone flag is false.
! 5595: ** To avoid excess churning of page 1, the update only happens once.
! 5596: ** See also the pager_write_changecounter() routine that does an
! 5597: ** unconditional update of the change counters.
! 5598: **
! 5599: ** If the isDirectMode flag is zero, then this is done by calling
! 5600: ** sqlite3PagerWrite() on page 1, then modifying the contents of the
! 5601: ** page data. In this case the file will be updated when the current
! 5602: ** transaction is committed.
! 5603: **
! 5604: ** The isDirectMode flag may only be non-zero if the library was compiled
! 5605: ** with the SQLITE_ENABLE_ATOMIC_WRITE macro defined. In this case,
! 5606: ** if isDirect is non-zero, then the database file is updated directly
! 5607: ** by writing an updated version of page 1 using a call to the
! 5608: ** sqlite3OsWrite() function.
! 5609: */
! 5610: static int pager_incr_changecounter(Pager *pPager, int isDirectMode){
! 5611: int rc = SQLITE_OK;
! 5612:
! 5613: assert( pPager->eState==PAGER_WRITER_CACHEMOD
! 5614: || pPager->eState==PAGER_WRITER_DBMOD
! 5615: );
! 5616: assert( assert_pager_state(pPager) );
! 5617:
! 5618: /* Declare and initialize constant integer 'isDirect'. If the
! 5619: ** atomic-write optimization is enabled in this build, then isDirect
! 5620: ** is initialized to the value passed as the isDirectMode parameter
! 5621: ** to this function. Otherwise, it is always set to zero.
! 5622: **
! 5623: ** The idea is that if the atomic-write optimization is not
! 5624: ** enabled at compile time, the compiler can omit the tests of
! 5625: ** 'isDirect' below, as well as the block enclosed in the
! 5626: ** "if( isDirect )" condition.
! 5627: */
! 5628: #ifndef SQLITE_ENABLE_ATOMIC_WRITE
! 5629: # define DIRECT_MODE 0
! 5630: assert( isDirectMode==0 );
! 5631: UNUSED_PARAMETER(isDirectMode);
! 5632: #else
! 5633: # define DIRECT_MODE isDirectMode
! 5634: #endif
! 5635:
! 5636: if( !pPager->changeCountDone && pPager->dbSize>0 ){
! 5637: PgHdr *pPgHdr; /* Reference to page 1 */
! 5638:
! 5639: assert( !pPager->tempFile && isOpen(pPager->fd) );
! 5640:
! 5641: /* Open page 1 of the file for writing. */
! 5642: rc = sqlite3PagerGet(pPager, 1, &pPgHdr);
! 5643: assert( pPgHdr==0 || rc==SQLITE_OK );
! 5644:
! 5645: /* If page one was fetched successfully, and this function is not
! 5646: ** operating in direct-mode, make page 1 writable. When not in
! 5647: ** direct mode, page 1 is always held in cache and hence the PagerGet()
! 5648: ** above is always successful - hence the ALWAYS on rc==SQLITE_OK.
! 5649: */
! 5650: if( !DIRECT_MODE && ALWAYS(rc==SQLITE_OK) ){
! 5651: rc = sqlite3PagerWrite(pPgHdr);
! 5652: }
! 5653:
! 5654: if( rc==SQLITE_OK ){
! 5655: /* Actually do the update of the change counter */
! 5656: pager_write_changecounter(pPgHdr);
! 5657:
! 5658: /* If running in direct mode, write the contents of page 1 to the file. */
! 5659: if( DIRECT_MODE ){
! 5660: const void *zBuf;
! 5661: assert( pPager->dbFileSize>0 );
! 5662: CODEC2(pPager, pPgHdr->pData, 1, 6, rc=SQLITE_NOMEM, zBuf);
! 5663: if( rc==SQLITE_OK ){
! 5664: rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0);
! 5665: }
! 5666: if( rc==SQLITE_OK ){
! 5667: pPager->changeCountDone = 1;
! 5668: }
! 5669: }else{
! 5670: pPager->changeCountDone = 1;
! 5671: }
! 5672: }
! 5673:
! 5674: /* Release the page reference. */
! 5675: sqlite3PagerUnref(pPgHdr);
! 5676: }
! 5677: return rc;
! 5678: }
! 5679:
! 5680: /*
! 5681: ** Sync the database file to disk. This is a no-op for in-memory databases
! 5682: ** or pages with the Pager.noSync flag set.
! 5683: **
! 5684: ** If successful, or if called on a pager for which it is a no-op, this
! 5685: ** function returns SQLITE_OK. Otherwise, an IO error code is returned.
! 5686: */
! 5687: int sqlite3PagerSync(Pager *pPager){
! 5688: int rc = SQLITE_OK;
! 5689: if( !pPager->noSync ){
! 5690: assert( !MEMDB );
! 5691: rc = sqlite3OsSync(pPager->fd, pPager->syncFlags);
! 5692: }else if( isOpen(pPager->fd) ){
! 5693: assert( !MEMDB );
! 5694: rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, 0);
! 5695: if( rc==SQLITE_NOTFOUND ){
! 5696: rc = SQLITE_OK;
! 5697: }
! 5698: }
! 5699: return rc;
! 5700: }
! 5701:
! 5702: /*
! 5703: ** This function may only be called while a write-transaction is active in
! 5704: ** rollback. If the connection is in WAL mode, this call is a no-op.
! 5705: ** Otherwise, if the connection does not already have an EXCLUSIVE lock on
! 5706: ** the database file, an attempt is made to obtain one.
! 5707: **
! 5708: ** If the EXCLUSIVE lock is already held or the attempt to obtain it is
! 5709: ** successful, or the connection is in WAL mode, SQLITE_OK is returned.
! 5710: ** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is
! 5711: ** returned.
! 5712: */
! 5713: int sqlite3PagerExclusiveLock(Pager *pPager){
! 5714: int rc = SQLITE_OK;
! 5715: assert( pPager->eState==PAGER_WRITER_CACHEMOD
! 5716: || pPager->eState==PAGER_WRITER_DBMOD
! 5717: || pPager->eState==PAGER_WRITER_LOCKED
! 5718: );
! 5719: assert( assert_pager_state(pPager) );
! 5720: if( 0==pagerUseWal(pPager) ){
! 5721: rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
! 5722: }
! 5723: return rc;
! 5724: }
! 5725:
! 5726: /*
! 5727: ** Sync the database file for the pager pPager. zMaster points to the name
! 5728: ** of a master journal file that should be written into the individual
! 5729: ** journal file. zMaster may be NULL, which is interpreted as no master
! 5730: ** journal (a single database transaction).
! 5731: **
! 5732: ** This routine ensures that:
! 5733: **
! 5734: ** * The database file change-counter is updated,
! 5735: ** * the journal is synced (unless the atomic-write optimization is used),
! 5736: ** * all dirty pages are written to the database file,
! 5737: ** * the database file is truncated (if required), and
! 5738: ** * the database file synced.
! 5739: **
! 5740: ** The only thing that remains to commit the transaction is to finalize
! 5741: ** (delete, truncate or zero the first part of) the journal file (or
! 5742: ** delete the master journal file if specified).
! 5743: **
! 5744: ** Note that if zMaster==NULL, this does not overwrite a previous value
! 5745: ** passed to an sqlite3PagerCommitPhaseOne() call.
! 5746: **
! 5747: ** If the final parameter - noSync - is true, then the database file itself
! 5748: ** is not synced. The caller must call sqlite3PagerSync() directly to
! 5749: ** sync the database file before calling CommitPhaseTwo() to delete the
! 5750: ** journal file in this case.
! 5751: */
! 5752: int sqlite3PagerCommitPhaseOne(
! 5753: Pager *pPager, /* Pager object */
! 5754: const char *zMaster, /* If not NULL, the master journal name */
! 5755: int noSync /* True to omit the xSync on the db file */
! 5756: ){
! 5757: int rc = SQLITE_OK; /* Return code */
! 5758:
! 5759: assert( pPager->eState==PAGER_WRITER_LOCKED
! 5760: || pPager->eState==PAGER_WRITER_CACHEMOD
! 5761: || pPager->eState==PAGER_WRITER_DBMOD
! 5762: || pPager->eState==PAGER_ERROR
! 5763: );
! 5764: assert( assert_pager_state(pPager) );
! 5765:
! 5766: /* If a prior error occurred, report that error again. */
! 5767: if( NEVER(pPager->errCode) ) return pPager->errCode;
! 5768:
! 5769: PAGERTRACE(("DATABASE SYNC: File=%s zMaster=%s nSize=%d\n",
! 5770: pPager->zFilename, zMaster, pPager->dbSize));
! 5771:
! 5772: /* If no database changes have been made, return early. */
! 5773: if( pPager->eState<PAGER_WRITER_CACHEMOD ) return SQLITE_OK;
! 5774:
! 5775: if( MEMDB ){
! 5776: /* If this is an in-memory db, or no pages have been written to, or this
! 5777: ** function has already been called, it is mostly a no-op. However, any
! 5778: ** backup in progress needs to be restarted.
! 5779: */
! 5780: sqlite3BackupRestart(pPager->pBackup);
! 5781: }else{
! 5782: if( pagerUseWal(pPager) ){
! 5783: PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache);
! 5784: PgHdr *pPageOne = 0;
! 5785: if( pList==0 ){
! 5786: /* Must have at least one page for the WAL commit flag.
! 5787: ** Ticket [2d1a5c67dfc2363e44f29d9bbd57f] 2011-05-18 */
! 5788: rc = sqlite3PagerGet(pPager, 1, &pPageOne);
! 5789: pList = pPageOne;
! 5790: pList->pDirty = 0;
! 5791: }
! 5792: assert( rc==SQLITE_OK );
! 5793: if( ALWAYS(pList) ){
! 5794: rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1);
! 5795: }
! 5796: sqlite3PagerUnref(pPageOne);
! 5797: if( rc==SQLITE_OK ){
! 5798: sqlite3PcacheCleanAll(pPager->pPCache);
! 5799: }
! 5800: }else{
! 5801: /* The following block updates the change-counter. Exactly how it
! 5802: ** does this depends on whether or not the atomic-update optimization
! 5803: ** was enabled at compile time, and if this transaction meets the
! 5804: ** runtime criteria to use the operation:
! 5805: **
! 5806: ** * The file-system supports the atomic-write property for
! 5807: ** blocks of size page-size, and
! 5808: ** * This commit is not part of a multi-file transaction, and
! 5809: ** * Exactly one page has been modified and store in the journal file.
! 5810: **
! 5811: ** If the optimization was not enabled at compile time, then the
! 5812: ** pager_incr_changecounter() function is called to update the change
! 5813: ** counter in 'indirect-mode'. If the optimization is compiled in but
! 5814: ** is not applicable to this transaction, call sqlite3JournalCreate()
! 5815: ** to make sure the journal file has actually been created, then call
! 5816: ** pager_incr_changecounter() to update the change-counter in indirect
! 5817: ** mode.
! 5818: **
! 5819: ** Otherwise, if the optimization is both enabled and applicable,
! 5820: ** then call pager_incr_changecounter() to update the change-counter
! 5821: ** in 'direct' mode. In this case the journal file will never be
! 5822: ** created for this transaction.
! 5823: */
! 5824: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
! 5825: PgHdr *pPg;
! 5826: assert( isOpen(pPager->jfd)
! 5827: || pPager->journalMode==PAGER_JOURNALMODE_OFF
! 5828: || pPager->journalMode==PAGER_JOURNALMODE_WAL
! 5829: );
! 5830: if( !zMaster && isOpen(pPager->jfd)
! 5831: && pPager->journalOff==jrnlBufferSize(pPager)
! 5832: && pPager->dbSize>=pPager->dbOrigSize
! 5833: && (0==(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty)
! 5834: ){
! 5835: /* Update the db file change counter via the direct-write method. The
! 5836: ** following call will modify the in-memory representation of page 1
! 5837: ** to include the updated change counter and then write page 1
! 5838: ** directly to the database file. Because of the atomic-write
! 5839: ** property of the host file-system, this is safe.
! 5840: */
! 5841: rc = pager_incr_changecounter(pPager, 1);
! 5842: }else{
! 5843: rc = sqlite3JournalCreate(pPager->jfd);
! 5844: if( rc==SQLITE_OK ){
! 5845: rc = pager_incr_changecounter(pPager, 0);
! 5846: }
! 5847: }
! 5848: #else
! 5849: rc = pager_incr_changecounter(pPager, 0);
! 5850: #endif
! 5851: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
! 5852:
! 5853: /* If this transaction has made the database smaller, then all pages
! 5854: ** being discarded by the truncation must be written to the journal
! 5855: ** file. This can only happen in auto-vacuum mode.
! 5856: **
! 5857: ** Before reading the pages with page numbers larger than the
! 5858: ** current value of Pager.dbSize, set dbSize back to the value
! 5859: ** that it took at the start of the transaction. Otherwise, the
! 5860: ** calls to sqlite3PagerGet() return zeroed pages instead of
! 5861: ** reading data from the database file.
! 5862: */
! 5863: #ifndef SQLITE_OMIT_AUTOVACUUM
! 5864: if( pPager->dbSize<pPager->dbOrigSize
! 5865: && pPager->journalMode!=PAGER_JOURNALMODE_OFF
! 5866: ){
! 5867: Pgno i; /* Iterator variable */
! 5868: const Pgno iSkip = PAGER_MJ_PGNO(pPager); /* Pending lock page */
! 5869: const Pgno dbSize = pPager->dbSize; /* Database image size */
! 5870: pPager->dbSize = pPager->dbOrigSize;
! 5871: for( i=dbSize+1; i<=pPager->dbOrigSize; i++ ){
! 5872: if( !sqlite3BitvecTest(pPager->pInJournal, i) && i!=iSkip ){
! 5873: PgHdr *pPage; /* Page to journal */
! 5874: rc = sqlite3PagerGet(pPager, i, &pPage);
! 5875: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
! 5876: rc = sqlite3PagerWrite(pPage);
! 5877: sqlite3PagerUnref(pPage);
! 5878: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
! 5879: }
! 5880: }
! 5881: pPager->dbSize = dbSize;
! 5882: }
! 5883: #endif
! 5884:
! 5885: /* Write the master journal name into the journal file. If a master
! 5886: ** journal file name has already been written to the journal file,
! 5887: ** or if zMaster is NULL (no master journal), then this call is a no-op.
! 5888: */
! 5889: rc = writeMasterJournal(pPager, zMaster);
! 5890: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
! 5891:
! 5892: /* Sync the journal file and write all dirty pages to the database.
! 5893: ** If the atomic-update optimization is being used, this sync will not
! 5894: ** create the journal file or perform any real IO.
! 5895: **
! 5896: ** Because the change-counter page was just modified, unless the
! 5897: ** atomic-update optimization is used it is almost certain that the
! 5898: ** journal requires a sync here. However, in locking_mode=exclusive
! 5899: ** on a system under memory pressure it is just possible that this is
! 5900: ** not the case. In this case it is likely enough that the redundant
! 5901: ** xSync() call will be changed to a no-op by the OS anyhow.
! 5902: */
! 5903: rc = syncJournal(pPager, 0);
! 5904: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
! 5905:
! 5906: rc = pager_write_pagelist(pPager,sqlite3PcacheDirtyList(pPager->pPCache));
! 5907: if( rc!=SQLITE_OK ){
! 5908: assert( rc!=SQLITE_IOERR_BLOCKED );
! 5909: goto commit_phase_one_exit;
! 5910: }
! 5911: sqlite3PcacheCleanAll(pPager->pPCache);
! 5912:
! 5913: /* If the file on disk is not the same size as the database image,
! 5914: ** then use pager_truncate to grow or shrink the file here.
! 5915: */
! 5916: if( pPager->dbSize!=pPager->dbFileSize ){
! 5917: Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager));
! 5918: assert( pPager->eState==PAGER_WRITER_DBMOD );
! 5919: rc = pager_truncate(pPager, nNew);
! 5920: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
! 5921: }
! 5922:
! 5923: /* Finally, sync the database file. */
! 5924: if( !noSync ){
! 5925: rc = sqlite3PagerSync(pPager);
! 5926: }
! 5927: IOTRACE(("DBSYNC %p\n", pPager))
! 5928: }
! 5929: }
! 5930:
! 5931: commit_phase_one_exit:
! 5932: if( rc==SQLITE_OK && !pagerUseWal(pPager) ){
! 5933: pPager->eState = PAGER_WRITER_FINISHED;
! 5934: }
! 5935: return rc;
! 5936: }
! 5937:
! 5938:
! 5939: /*
! 5940: ** When this function is called, the database file has been completely
! 5941: ** updated to reflect the changes made by the current transaction and
! 5942: ** synced to disk. The journal file still exists in the file-system
! 5943: ** though, and if a failure occurs at this point it will eventually
! 5944: ** be used as a hot-journal and the current transaction rolled back.
! 5945: **
! 5946: ** This function finalizes the journal file, either by deleting,
! 5947: ** truncating or partially zeroing it, so that it cannot be used
! 5948: ** for hot-journal rollback. Once this is done the transaction is
! 5949: ** irrevocably committed.
! 5950: **
! 5951: ** If an error occurs, an IO error code is returned and the pager
! 5952: ** moves into the error state. Otherwise, SQLITE_OK is returned.
! 5953: */
! 5954: int sqlite3PagerCommitPhaseTwo(Pager *pPager){
! 5955: int rc = SQLITE_OK; /* Return code */
! 5956:
! 5957: /* This routine should not be called if a prior error has occurred.
! 5958: ** But if (due to a coding error elsewhere in the system) it does get
! 5959: ** called, just return the same error code without doing anything. */
! 5960: if( NEVER(pPager->errCode) ) return pPager->errCode;
! 5961:
! 5962: assert( pPager->eState==PAGER_WRITER_LOCKED
! 5963: || pPager->eState==PAGER_WRITER_FINISHED
! 5964: || (pagerUseWal(pPager) && pPager->eState==PAGER_WRITER_CACHEMOD)
! 5965: );
! 5966: assert( assert_pager_state(pPager) );
! 5967:
! 5968: /* An optimization. If the database was not actually modified during
! 5969: ** this transaction, the pager is running in exclusive-mode and is
! 5970: ** using persistent journals, then this function is a no-op.
! 5971: **
! 5972: ** The start of the journal file currently contains a single journal
! 5973: ** header with the nRec field set to 0. If such a journal is used as
! 5974: ** a hot-journal during hot-journal rollback, 0 changes will be made
! 5975: ** to the database file. So there is no need to zero the journal
! 5976: ** header. Since the pager is in exclusive mode, there is no need
! 5977: ** to drop any locks either.
! 5978: */
! 5979: if( pPager->eState==PAGER_WRITER_LOCKED
! 5980: && pPager->exclusiveMode
! 5981: && pPager->journalMode==PAGER_JOURNALMODE_PERSIST
! 5982: ){
! 5983: assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) || !pPager->journalOff );
! 5984: pPager->eState = PAGER_READER;
! 5985: return SQLITE_OK;
! 5986: }
! 5987:
! 5988: PAGERTRACE(("COMMIT %d\n", PAGERID(pPager)));
! 5989: rc = pager_end_transaction(pPager, pPager->setMaster);
! 5990: return pager_error(pPager, rc);
! 5991: }
! 5992:
! 5993: /*
! 5994: ** If a write transaction is open, then all changes made within the
! 5995: ** transaction are reverted and the current write-transaction is closed.
! 5996: ** The pager falls back to PAGER_READER state if successful, or PAGER_ERROR
! 5997: ** state if an error occurs.
! 5998: **
! 5999: ** If the pager is already in PAGER_ERROR state when this function is called,
! 6000: ** it returns Pager.errCode immediately. No work is performed in this case.
! 6001: **
! 6002: ** Otherwise, in rollback mode, this function performs two functions:
! 6003: **
! 6004: ** 1) It rolls back the journal file, restoring all database file and
! 6005: ** in-memory cache pages to the state they were in when the transaction
! 6006: ** was opened, and
! 6007: **
! 6008: ** 2) It finalizes the journal file, so that it is not used for hot
! 6009: ** rollback at any point in the future.
! 6010: **
! 6011: ** Finalization of the journal file (task 2) is only performed if the
! 6012: ** rollback is successful.
! 6013: **
! 6014: ** In WAL mode, all cache-entries containing data modified within the
! 6015: ** current transaction are either expelled from the cache or reverted to
! 6016: ** their pre-transaction state by re-reading data from the database or
! 6017: ** WAL files. The WAL transaction is then closed.
! 6018: */
! 6019: int sqlite3PagerRollback(Pager *pPager){
! 6020: int rc = SQLITE_OK; /* Return code */
! 6021: PAGERTRACE(("ROLLBACK %d\n", PAGERID(pPager)));
! 6022:
! 6023: /* PagerRollback() is a no-op if called in READER or OPEN state. If
! 6024: ** the pager is already in the ERROR state, the rollback is not
! 6025: ** attempted here. Instead, the error code is returned to the caller.
! 6026: */
! 6027: assert( assert_pager_state(pPager) );
! 6028: if( pPager->eState==PAGER_ERROR ) return pPager->errCode;
! 6029: if( pPager->eState<=PAGER_READER ) return SQLITE_OK;
! 6030:
! 6031: if( pagerUseWal(pPager) ){
! 6032: int rc2;
! 6033: rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, -1);
! 6034: rc2 = pager_end_transaction(pPager, pPager->setMaster);
! 6035: if( rc==SQLITE_OK ) rc = rc2;
! 6036: }else if( !isOpen(pPager->jfd) || pPager->eState==PAGER_WRITER_LOCKED ){
! 6037: int eState = pPager->eState;
! 6038: rc = pager_end_transaction(pPager, 0);
! 6039: if( !MEMDB && eState>PAGER_WRITER_LOCKED ){
! 6040: /* This can happen using journal_mode=off. Move the pager to the error
! 6041: ** state to indicate that the contents of the cache may not be trusted.
! 6042: ** Any active readers will get SQLITE_ABORT.
! 6043: */
! 6044: pPager->errCode = SQLITE_ABORT;
! 6045: pPager->eState = PAGER_ERROR;
! 6046: return rc;
! 6047: }
! 6048: }else{
! 6049: rc = pager_playback(pPager, 0);
! 6050: }
! 6051:
! 6052: assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK );
! 6053: assert( rc==SQLITE_OK || rc==SQLITE_FULL
! 6054: || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR );
! 6055:
! 6056: /* If an error occurs during a ROLLBACK, we can no longer trust the pager
! 6057: ** cache. So call pager_error() on the way out to make any error persistent.
! 6058: */
! 6059: return pager_error(pPager, rc);
! 6060: }
! 6061:
! 6062: /*
! 6063: ** Return TRUE if the database file is opened read-only. Return FALSE
! 6064: ** if the database is (in theory) writable.
! 6065: */
! 6066: u8 sqlite3PagerIsreadonly(Pager *pPager){
! 6067: return pPager->readOnly;
! 6068: }
! 6069:
! 6070: /*
! 6071: ** Return the number of references to the pager.
! 6072: */
! 6073: int sqlite3PagerRefcount(Pager *pPager){
! 6074: return sqlite3PcacheRefCount(pPager->pPCache);
! 6075: }
! 6076:
! 6077: /*
! 6078: ** Return the approximate number of bytes of memory currently
! 6079: ** used by the pager and its associated cache.
! 6080: */
! 6081: int sqlite3PagerMemUsed(Pager *pPager){
! 6082: int perPageSize = pPager->pageSize + pPager->nExtra + sizeof(PgHdr)
! 6083: + 5*sizeof(void*);
! 6084: return perPageSize*sqlite3PcachePagecount(pPager->pPCache)
! 6085: + sqlite3MallocSize(pPager)
! 6086: + pPager->pageSize;
! 6087: }
! 6088:
! 6089: /*
! 6090: ** Return the number of references to the specified page.
! 6091: */
! 6092: int sqlite3PagerPageRefcount(DbPage *pPage){
! 6093: return sqlite3PcachePageRefcount(pPage);
! 6094: }
! 6095:
! 6096: #ifdef SQLITE_TEST
! 6097: /*
! 6098: ** This routine is used for testing and analysis only.
! 6099: */
! 6100: int *sqlite3PagerStats(Pager *pPager){
! 6101: static int a[11];
! 6102: a[0] = sqlite3PcacheRefCount(pPager->pPCache);
! 6103: a[1] = sqlite3PcachePagecount(pPager->pPCache);
! 6104: a[2] = sqlite3PcacheGetCachesize(pPager->pPCache);
! 6105: a[3] = pPager->eState==PAGER_OPEN ? -1 : (int) pPager->dbSize;
! 6106: a[4] = pPager->eState;
! 6107: a[5] = pPager->errCode;
! 6108: a[6] = pPager->nHit;
! 6109: a[7] = pPager->nMiss;
! 6110: a[8] = 0; /* Used to be pPager->nOvfl */
! 6111: a[9] = pPager->nRead;
! 6112: a[10] = pPager->nWrite;
! 6113: return a;
! 6114: }
! 6115: #endif
! 6116:
! 6117: /*
! 6118: ** Parameter eStat must be either SQLITE_DBSTATUS_CACHE_HIT or
! 6119: ** SQLITE_DBSTATUS_CACHE_MISS. Before returning, *pnVal is incremented by the
! 6120: ** current cache hit or miss count, according to the value of eStat. If the
! 6121: ** reset parameter is non-zero, the cache hit or miss count is zeroed before
! 6122: ** returning.
! 6123: */
! 6124: void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){
! 6125: int *piStat;
! 6126:
! 6127: assert( eStat==SQLITE_DBSTATUS_CACHE_HIT
! 6128: || eStat==SQLITE_DBSTATUS_CACHE_MISS
! 6129: );
! 6130: if( eStat==SQLITE_DBSTATUS_CACHE_HIT ){
! 6131: piStat = &pPager->nHit;
! 6132: }else{
! 6133: piStat = &pPager->nMiss;
! 6134: }
! 6135:
! 6136: *pnVal += *piStat;
! 6137: if( reset ){
! 6138: *piStat = 0;
! 6139: }
! 6140: }
! 6141:
! 6142: /*
! 6143: ** Return true if this is an in-memory pager.
! 6144: */
! 6145: int sqlite3PagerIsMemdb(Pager *pPager){
! 6146: return MEMDB;
! 6147: }
! 6148:
! 6149: /*
! 6150: ** Check that there are at least nSavepoint savepoints open. If there are
! 6151: ** currently less than nSavepoints open, then open one or more savepoints
! 6152: ** to make up the difference. If the number of savepoints is already
! 6153: ** equal to nSavepoint, then this function is a no-op.
! 6154: **
! 6155: ** If a memory allocation fails, SQLITE_NOMEM is returned. If an error
! 6156: ** occurs while opening the sub-journal file, then an IO error code is
! 6157: ** returned. Otherwise, SQLITE_OK.
! 6158: */
! 6159: int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){
! 6160: int rc = SQLITE_OK; /* Return code */
! 6161: int nCurrent = pPager->nSavepoint; /* Current number of savepoints */
! 6162:
! 6163: assert( pPager->eState>=PAGER_WRITER_LOCKED );
! 6164: assert( assert_pager_state(pPager) );
! 6165:
! 6166: if( nSavepoint>nCurrent && pPager->useJournal ){
! 6167: int ii; /* Iterator variable */
! 6168: PagerSavepoint *aNew; /* New Pager.aSavepoint array */
! 6169:
! 6170: /* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM
! 6171: ** if the allocation fails. Otherwise, zero the new portion in case a
! 6172: ** malloc failure occurs while populating it in the for(...) loop below.
! 6173: */
! 6174: aNew = (PagerSavepoint *)sqlite3Realloc(
! 6175: pPager->aSavepoint, sizeof(PagerSavepoint)*nSavepoint
! 6176: );
! 6177: if( !aNew ){
! 6178: return SQLITE_NOMEM;
! 6179: }
! 6180: memset(&aNew[nCurrent], 0, (nSavepoint-nCurrent) * sizeof(PagerSavepoint));
! 6181: pPager->aSavepoint = aNew;
! 6182:
! 6183: /* Populate the PagerSavepoint structures just allocated. */
! 6184: for(ii=nCurrent; ii<nSavepoint; ii++){
! 6185: aNew[ii].nOrig = pPager->dbSize;
! 6186: if( isOpen(pPager->jfd) && pPager->journalOff>0 ){
! 6187: aNew[ii].iOffset = pPager->journalOff;
! 6188: }else{
! 6189: aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager);
! 6190: }
! 6191: aNew[ii].iSubRec = pPager->nSubRec;
! 6192: aNew[ii].pInSavepoint = sqlite3BitvecCreate(pPager->dbSize);
! 6193: if( !aNew[ii].pInSavepoint ){
! 6194: return SQLITE_NOMEM;
! 6195: }
! 6196: if( pagerUseWal(pPager) ){
! 6197: sqlite3WalSavepoint(pPager->pWal, aNew[ii].aWalData);
! 6198: }
! 6199: pPager->nSavepoint = ii+1;
! 6200: }
! 6201: assert( pPager->nSavepoint==nSavepoint );
! 6202: assertTruncateConstraint(pPager);
! 6203: }
! 6204:
! 6205: return rc;
! 6206: }
! 6207:
! 6208: /*
! 6209: ** This function is called to rollback or release (commit) a savepoint.
! 6210: ** The savepoint to release or rollback need not be the most recently
! 6211: ** created savepoint.
! 6212: **
! 6213: ** Parameter op is always either SAVEPOINT_ROLLBACK or SAVEPOINT_RELEASE.
! 6214: ** If it is SAVEPOINT_RELEASE, then release and destroy the savepoint with
! 6215: ** index iSavepoint. If it is SAVEPOINT_ROLLBACK, then rollback all changes
! 6216: ** that have occurred since the specified savepoint was created.
! 6217: **
! 6218: ** The savepoint to rollback or release is identified by parameter
! 6219: ** iSavepoint. A value of 0 means to operate on the outermost savepoint
! 6220: ** (the first created). A value of (Pager.nSavepoint-1) means operate
! 6221: ** on the most recently created savepoint. If iSavepoint is greater than
! 6222: ** (Pager.nSavepoint-1), then this function is a no-op.
! 6223: **
! 6224: ** If a negative value is passed to this function, then the current
! 6225: ** transaction is rolled back. This is different to calling
! 6226: ** sqlite3PagerRollback() because this function does not terminate
! 6227: ** the transaction or unlock the database, it just restores the
! 6228: ** contents of the database to its original state.
! 6229: **
! 6230: ** In any case, all savepoints with an index greater than iSavepoint
! 6231: ** are destroyed. If this is a release operation (op==SAVEPOINT_RELEASE),
! 6232: ** then savepoint iSavepoint is also destroyed.
! 6233: **
! 6234: ** This function may return SQLITE_NOMEM if a memory allocation fails,
! 6235: ** or an IO error code if an IO error occurs while rolling back a
! 6236: ** savepoint. If no errors occur, SQLITE_OK is returned.
! 6237: */
! 6238: int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){
! 6239: int rc = pPager->errCode; /* Return code */
! 6240:
! 6241: assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK );
! 6242: assert( iSavepoint>=0 || op==SAVEPOINT_ROLLBACK );
! 6243:
! 6244: if( rc==SQLITE_OK && iSavepoint<pPager->nSavepoint ){
! 6245: int ii; /* Iterator variable */
! 6246: int nNew; /* Number of remaining savepoints after this op. */
! 6247:
! 6248: /* Figure out how many savepoints will still be active after this
! 6249: ** operation. Store this value in nNew. Then free resources associated
! 6250: ** with any savepoints that are destroyed by this operation.
! 6251: */
! 6252: nNew = iSavepoint + (( op==SAVEPOINT_RELEASE ) ? 0 : 1);
! 6253: for(ii=nNew; ii<pPager->nSavepoint; ii++){
! 6254: sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint);
! 6255: }
! 6256: pPager->nSavepoint = nNew;
! 6257:
! 6258: /* If this is a release of the outermost savepoint, truncate
! 6259: ** the sub-journal to zero bytes in size. */
! 6260: if( op==SAVEPOINT_RELEASE ){
! 6261: if( nNew==0 && isOpen(pPager->sjfd) ){
! 6262: /* Only truncate if it is an in-memory sub-journal. */
! 6263: if( sqlite3IsMemJournal(pPager->sjfd) ){
! 6264: rc = sqlite3OsTruncate(pPager->sjfd, 0);
! 6265: assert( rc==SQLITE_OK );
! 6266: }
! 6267: pPager->nSubRec = 0;
! 6268: }
! 6269: }
! 6270: /* Else this is a rollback operation, playback the specified savepoint.
! 6271: ** If this is a temp-file, it is possible that the journal file has
! 6272: ** not yet been opened. In this case there have been no changes to
! 6273: ** the database file, so the playback operation can be skipped.
! 6274: */
! 6275: else if( pagerUseWal(pPager) || isOpen(pPager->jfd) ){
! 6276: PagerSavepoint *pSavepoint = (nNew==0)?0:&pPager->aSavepoint[nNew-1];
! 6277: rc = pagerPlaybackSavepoint(pPager, pSavepoint);
! 6278: assert(rc!=SQLITE_DONE);
! 6279: }
! 6280: }
! 6281:
! 6282: return rc;
! 6283: }
! 6284:
! 6285: /*
! 6286: ** Return the full pathname of the database file.
! 6287: */
! 6288: const char *sqlite3PagerFilename(Pager *pPager){
! 6289: return pPager->zFilename;
! 6290: }
! 6291:
! 6292: /*
! 6293: ** Return the VFS structure for the pager.
! 6294: */
! 6295: const sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){
! 6296: return pPager->pVfs;
! 6297: }
! 6298:
! 6299: /*
! 6300: ** Return the file handle for the database file associated
! 6301: ** with the pager. This might return NULL if the file has
! 6302: ** not yet been opened.
! 6303: */
! 6304: sqlite3_file *sqlite3PagerFile(Pager *pPager){
! 6305: return pPager->fd;
! 6306: }
! 6307:
! 6308: /*
! 6309: ** Return the full pathname of the journal file.
! 6310: */
! 6311: const char *sqlite3PagerJournalname(Pager *pPager){
! 6312: return pPager->zJournal;
! 6313: }
! 6314:
! 6315: /*
! 6316: ** Return true if fsync() calls are disabled for this pager. Return FALSE
! 6317: ** if fsync()s are executed normally.
! 6318: */
! 6319: int sqlite3PagerNosync(Pager *pPager){
! 6320: return pPager->noSync;
! 6321: }
! 6322:
! 6323: #ifdef SQLITE_HAS_CODEC
! 6324: /*
! 6325: ** Set or retrieve the codec for this pager
! 6326: */
! 6327: void sqlite3PagerSetCodec(
! 6328: Pager *pPager,
! 6329: void *(*xCodec)(void*,void*,Pgno,int),
! 6330: void (*xCodecSizeChng)(void*,int,int),
! 6331: void (*xCodecFree)(void*),
! 6332: void *pCodec
! 6333: ){
! 6334: if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec);
! 6335: pPager->xCodec = pPager->memDb ? 0 : xCodec;
! 6336: pPager->xCodecSizeChng = xCodecSizeChng;
! 6337: pPager->xCodecFree = xCodecFree;
! 6338: pPager->pCodec = pCodec;
! 6339: pagerReportSize(pPager);
! 6340: }
! 6341: void *sqlite3PagerGetCodec(Pager *pPager){
! 6342: return pPager->pCodec;
! 6343: }
! 6344: #endif
! 6345:
! 6346: #ifndef SQLITE_OMIT_AUTOVACUUM
! 6347: /*
! 6348: ** Move the page pPg to location pgno in the file.
! 6349: **
! 6350: ** There must be no references to the page previously located at
! 6351: ** pgno (which we call pPgOld) though that page is allowed to be
! 6352: ** in cache. If the page previously located at pgno is not already
! 6353: ** in the rollback journal, it is not put there by by this routine.
! 6354: **
! 6355: ** References to the page pPg remain valid. Updating any
! 6356: ** meta-data associated with pPg (i.e. data stored in the nExtra bytes
! 6357: ** allocated along with the page) is the responsibility of the caller.
! 6358: **
! 6359: ** A transaction must be active when this routine is called. It used to be
! 6360: ** required that a statement transaction was not active, but this restriction
! 6361: ** has been removed (CREATE INDEX needs to move a page when a statement
! 6362: ** transaction is active).
! 6363: **
! 6364: ** If the fourth argument, isCommit, is non-zero, then this page is being
! 6365: ** moved as part of a database reorganization just before the transaction
! 6366: ** is being committed. In this case, it is guaranteed that the database page
! 6367: ** pPg refers to will not be written to again within this transaction.
! 6368: **
! 6369: ** This function may return SQLITE_NOMEM or an IO error code if an error
! 6370: ** occurs. Otherwise, it returns SQLITE_OK.
! 6371: */
! 6372: int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){
! 6373: PgHdr *pPgOld; /* The page being overwritten. */
! 6374: Pgno needSyncPgno = 0; /* Old value of pPg->pgno, if sync is required */
! 6375: int rc; /* Return code */
! 6376: Pgno origPgno; /* The original page number */
! 6377:
! 6378: assert( pPg->nRef>0 );
! 6379: assert( pPager->eState==PAGER_WRITER_CACHEMOD
! 6380: || pPager->eState==PAGER_WRITER_DBMOD
! 6381: );
! 6382: assert( assert_pager_state(pPager) );
! 6383:
! 6384: /* In order to be able to rollback, an in-memory database must journal
! 6385: ** the page we are moving from.
! 6386: */
! 6387: if( MEMDB ){
! 6388: rc = sqlite3PagerWrite(pPg);
! 6389: if( rc ) return rc;
! 6390: }
! 6391:
! 6392: /* If the page being moved is dirty and has not been saved by the latest
! 6393: ** savepoint, then save the current contents of the page into the
! 6394: ** sub-journal now. This is required to handle the following scenario:
! 6395: **
! 6396: ** BEGIN;
! 6397: ** <journal page X, then modify it in memory>
! 6398: ** SAVEPOINT one;
! 6399: ** <Move page X to location Y>
! 6400: ** ROLLBACK TO one;
! 6401: **
! 6402: ** If page X were not written to the sub-journal here, it would not
! 6403: ** be possible to restore its contents when the "ROLLBACK TO one"
! 6404: ** statement were is processed.
! 6405: **
! 6406: ** subjournalPage() may need to allocate space to store pPg->pgno into
! 6407: ** one or more savepoint bitvecs. This is the reason this function
! 6408: ** may return SQLITE_NOMEM.
! 6409: */
! 6410: if( pPg->flags&PGHDR_DIRTY
! 6411: && subjRequiresPage(pPg)
! 6412: && SQLITE_OK!=(rc = subjournalPage(pPg))
! 6413: ){
! 6414: return rc;
! 6415: }
! 6416:
! 6417: PAGERTRACE(("MOVE %d page %d (needSync=%d) moves to %d\n",
! 6418: PAGERID(pPager), pPg->pgno, (pPg->flags&PGHDR_NEED_SYNC)?1:0, pgno));
! 6419: IOTRACE(("MOVE %p %d %d\n", pPager, pPg->pgno, pgno))
! 6420:
! 6421: /* If the journal needs to be sync()ed before page pPg->pgno can
! 6422: ** be written to, store pPg->pgno in local variable needSyncPgno.
! 6423: **
! 6424: ** If the isCommit flag is set, there is no need to remember that
! 6425: ** the journal needs to be sync()ed before database page pPg->pgno
! 6426: ** can be written to. The caller has already promised not to write to it.
! 6427: */
! 6428: if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){
! 6429: needSyncPgno = pPg->pgno;
! 6430: assert( pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize );
! 6431: assert( pPg->flags&PGHDR_DIRTY );
! 6432: }
! 6433:
! 6434: /* If the cache contains a page with page-number pgno, remove it
! 6435: ** from its hash chain. Also, if the PGHDR_NEED_SYNC flag was set for
! 6436: ** page pgno before the 'move' operation, it needs to be retained
! 6437: ** for the page moved there.
! 6438: */
! 6439: pPg->flags &= ~PGHDR_NEED_SYNC;
! 6440: pPgOld = pager_lookup(pPager, pgno);
! 6441: assert( !pPgOld || pPgOld->nRef==1 );
! 6442: if( pPgOld ){
! 6443: pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC);
! 6444: if( MEMDB ){
! 6445: /* Do not discard pages from an in-memory database since we might
! 6446: ** need to rollback later. Just move the page out of the way. */
! 6447: sqlite3PcacheMove(pPgOld, pPager->dbSize+1);
! 6448: }else{
! 6449: sqlite3PcacheDrop(pPgOld);
! 6450: }
! 6451: }
! 6452:
! 6453: origPgno = pPg->pgno;
! 6454: sqlite3PcacheMove(pPg, pgno);
! 6455: sqlite3PcacheMakeDirty(pPg);
! 6456:
! 6457: /* For an in-memory database, make sure the original page continues
! 6458: ** to exist, in case the transaction needs to roll back. Use pPgOld
! 6459: ** as the original page since it has already been allocated.
! 6460: */
! 6461: if( MEMDB ){
! 6462: assert( pPgOld );
! 6463: sqlite3PcacheMove(pPgOld, origPgno);
! 6464: sqlite3PagerUnref(pPgOld);
! 6465: }
! 6466:
! 6467: if( needSyncPgno ){
! 6468: /* If needSyncPgno is non-zero, then the journal file needs to be
! 6469: ** sync()ed before any data is written to database file page needSyncPgno.
! 6470: ** Currently, no such page exists in the page-cache and the
! 6471: ** "is journaled" bitvec flag has been set. This needs to be remedied by
! 6472: ** loading the page into the pager-cache and setting the PGHDR_NEED_SYNC
! 6473: ** flag.
! 6474: **
! 6475: ** If the attempt to load the page into the page-cache fails, (due
! 6476: ** to a malloc() or IO failure), clear the bit in the pInJournal[]
! 6477: ** array. Otherwise, if the page is loaded and written again in
! 6478: ** this transaction, it may be written to the database file before
! 6479: ** it is synced into the journal file. This way, it may end up in
! 6480: ** the journal file twice, but that is not a problem.
! 6481: */
! 6482: PgHdr *pPgHdr;
! 6483: rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr);
! 6484: if( rc!=SQLITE_OK ){
! 6485: if( needSyncPgno<=pPager->dbOrigSize ){
! 6486: assert( pPager->pTmpSpace!=0 );
! 6487: sqlite3BitvecClear(pPager->pInJournal, needSyncPgno, pPager->pTmpSpace);
! 6488: }
! 6489: return rc;
! 6490: }
! 6491: pPgHdr->flags |= PGHDR_NEED_SYNC;
! 6492: sqlite3PcacheMakeDirty(pPgHdr);
! 6493: sqlite3PagerUnref(pPgHdr);
! 6494: }
! 6495:
! 6496: return SQLITE_OK;
! 6497: }
! 6498: #endif
! 6499:
! 6500: /*
! 6501: ** Return a pointer to the data for the specified page.
! 6502: */
! 6503: void *sqlite3PagerGetData(DbPage *pPg){
! 6504: assert( pPg->nRef>0 || pPg->pPager->memDb );
! 6505: return pPg->pData;
! 6506: }
! 6507:
! 6508: /*
! 6509: ** Return a pointer to the Pager.nExtra bytes of "extra" space
! 6510: ** allocated along with the specified page.
! 6511: */
! 6512: void *sqlite3PagerGetExtra(DbPage *pPg){
! 6513: return pPg->pExtra;
! 6514: }
! 6515:
! 6516: /*
! 6517: ** Get/set the locking-mode for this pager. Parameter eMode must be one
! 6518: ** of PAGER_LOCKINGMODE_QUERY, PAGER_LOCKINGMODE_NORMAL or
! 6519: ** PAGER_LOCKINGMODE_EXCLUSIVE. If the parameter is not _QUERY, then
! 6520: ** the locking-mode is set to the value specified.
! 6521: **
! 6522: ** The returned value is either PAGER_LOCKINGMODE_NORMAL or
! 6523: ** PAGER_LOCKINGMODE_EXCLUSIVE, indicating the current (possibly updated)
! 6524: ** locking-mode.
! 6525: */
! 6526: int sqlite3PagerLockingMode(Pager *pPager, int eMode){
! 6527: assert( eMode==PAGER_LOCKINGMODE_QUERY
! 6528: || eMode==PAGER_LOCKINGMODE_NORMAL
! 6529: || eMode==PAGER_LOCKINGMODE_EXCLUSIVE );
! 6530: assert( PAGER_LOCKINGMODE_QUERY<0 );
! 6531: assert( PAGER_LOCKINGMODE_NORMAL>=0 && PAGER_LOCKINGMODE_EXCLUSIVE>=0 );
! 6532: assert( pPager->exclusiveMode || 0==sqlite3WalHeapMemory(pPager->pWal) );
! 6533: if( eMode>=0 && !pPager->tempFile && !sqlite3WalHeapMemory(pPager->pWal) ){
! 6534: pPager->exclusiveMode = (u8)eMode;
! 6535: }
! 6536: return (int)pPager->exclusiveMode;
! 6537: }
! 6538:
! 6539: /*
! 6540: ** Set the journal-mode for this pager. Parameter eMode must be one of:
! 6541: **
! 6542: ** PAGER_JOURNALMODE_DELETE
! 6543: ** PAGER_JOURNALMODE_TRUNCATE
! 6544: ** PAGER_JOURNALMODE_PERSIST
! 6545: ** PAGER_JOURNALMODE_OFF
! 6546: ** PAGER_JOURNALMODE_MEMORY
! 6547: ** PAGER_JOURNALMODE_WAL
! 6548: **
! 6549: ** The journalmode is set to the value specified if the change is allowed.
! 6550: ** The change may be disallowed for the following reasons:
! 6551: **
! 6552: ** * An in-memory database can only have its journal_mode set to _OFF
! 6553: ** or _MEMORY.
! 6554: **
! 6555: ** * Temporary databases cannot have _WAL journalmode.
! 6556: **
! 6557: ** The returned indicate the current (possibly updated) journal-mode.
! 6558: */
! 6559: int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){
! 6560: u8 eOld = pPager->journalMode; /* Prior journalmode */
! 6561:
! 6562: #ifdef SQLITE_DEBUG
! 6563: /* The print_pager_state() routine is intended to be used by the debugger
! 6564: ** only. We invoke it once here to suppress a compiler warning. */
! 6565: print_pager_state(pPager);
! 6566: #endif
! 6567:
! 6568:
! 6569: /* The eMode parameter is always valid */
! 6570: assert( eMode==PAGER_JOURNALMODE_DELETE
! 6571: || eMode==PAGER_JOURNALMODE_TRUNCATE
! 6572: || eMode==PAGER_JOURNALMODE_PERSIST
! 6573: || eMode==PAGER_JOURNALMODE_OFF
! 6574: || eMode==PAGER_JOURNALMODE_WAL
! 6575: || eMode==PAGER_JOURNALMODE_MEMORY );
! 6576:
! 6577: /* This routine is only called from the OP_JournalMode opcode, and
! 6578: ** the logic there will never allow a temporary file to be changed
! 6579: ** to WAL mode.
! 6580: */
! 6581: assert( pPager->tempFile==0 || eMode!=PAGER_JOURNALMODE_WAL );
! 6582:
! 6583: /* Do allow the journalmode of an in-memory database to be set to
! 6584: ** anything other than MEMORY or OFF
! 6585: */
! 6586: if( MEMDB ){
! 6587: assert( eOld==PAGER_JOURNALMODE_MEMORY || eOld==PAGER_JOURNALMODE_OFF );
! 6588: if( eMode!=PAGER_JOURNALMODE_MEMORY && eMode!=PAGER_JOURNALMODE_OFF ){
! 6589: eMode = eOld;
! 6590: }
! 6591: }
! 6592:
! 6593: if( eMode!=eOld ){
! 6594:
! 6595: /* Change the journal mode. */
! 6596: assert( pPager->eState!=PAGER_ERROR );
! 6597: pPager->journalMode = (u8)eMode;
! 6598:
! 6599: /* When transistioning from TRUNCATE or PERSIST to any other journal
! 6600: ** mode except WAL, unless the pager is in locking_mode=exclusive mode,
! 6601: ** delete the journal file.
! 6602: */
! 6603: assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 );
! 6604: assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 );
! 6605: assert( (PAGER_JOURNALMODE_DELETE & 5)==0 );
! 6606: assert( (PAGER_JOURNALMODE_MEMORY & 5)==4 );
! 6607: assert( (PAGER_JOURNALMODE_OFF & 5)==0 );
! 6608: assert( (PAGER_JOURNALMODE_WAL & 5)==5 );
! 6609:
! 6610: assert( isOpen(pPager->fd) || pPager->exclusiveMode );
! 6611: if( !pPager->exclusiveMode && (eOld & 5)==1 && (eMode & 1)==0 ){
! 6612:
! 6613: /* In this case we would like to delete the journal file. If it is
! 6614: ** not possible, then that is not a problem. Deleting the journal file
! 6615: ** here is an optimization only.
! 6616: **
! 6617: ** Before deleting the journal file, obtain a RESERVED lock on the
! 6618: ** database file. This ensures that the journal file is not deleted
! 6619: ** while it is in use by some other client.
! 6620: */
! 6621: sqlite3OsClose(pPager->jfd);
! 6622: if( pPager->eLock>=RESERVED_LOCK ){
! 6623: sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
! 6624: }else{
! 6625: int rc = SQLITE_OK;
! 6626: int state = pPager->eState;
! 6627: assert( state==PAGER_OPEN || state==PAGER_READER );
! 6628: if( state==PAGER_OPEN ){
! 6629: rc = sqlite3PagerSharedLock(pPager);
! 6630: }
! 6631: if( pPager->eState==PAGER_READER ){
! 6632: assert( rc==SQLITE_OK );
! 6633: rc = pagerLockDb(pPager, RESERVED_LOCK);
! 6634: }
! 6635: if( rc==SQLITE_OK ){
! 6636: sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
! 6637: }
! 6638: if( rc==SQLITE_OK && state==PAGER_READER ){
! 6639: pagerUnlockDb(pPager, SHARED_LOCK);
! 6640: }else if( state==PAGER_OPEN ){
! 6641: pager_unlock(pPager);
! 6642: }
! 6643: assert( state==pPager->eState );
! 6644: }
! 6645: }
! 6646: }
! 6647:
! 6648: /* Return the new journal mode */
! 6649: return (int)pPager->journalMode;
! 6650: }
! 6651:
! 6652: /*
! 6653: ** Return the current journal mode.
! 6654: */
! 6655: int sqlite3PagerGetJournalMode(Pager *pPager){
! 6656: return (int)pPager->journalMode;
! 6657: }
! 6658:
! 6659: /*
! 6660: ** Return TRUE if the pager is in a state where it is OK to change the
! 6661: ** journalmode. Journalmode changes can only happen when the database
! 6662: ** is unmodified.
! 6663: */
! 6664: int sqlite3PagerOkToChangeJournalMode(Pager *pPager){
! 6665: assert( assert_pager_state(pPager) );
! 6666: if( pPager->eState>=PAGER_WRITER_CACHEMOD ) return 0;
! 6667: if( NEVER(isOpen(pPager->jfd) && pPager->journalOff>0) ) return 0;
! 6668: return 1;
! 6669: }
! 6670:
! 6671: /*
! 6672: ** Get/set the size-limit used for persistent journal files.
! 6673: **
! 6674: ** Setting the size limit to -1 means no limit is enforced.
! 6675: ** An attempt to set a limit smaller than -1 is a no-op.
! 6676: */
! 6677: i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){
! 6678: if( iLimit>=-1 ){
! 6679: pPager->journalSizeLimit = iLimit;
! 6680: sqlite3WalLimit(pPager->pWal, iLimit);
! 6681: }
! 6682: return pPager->journalSizeLimit;
! 6683: }
! 6684:
! 6685: /*
! 6686: ** Return a pointer to the pPager->pBackup variable. The backup module
! 6687: ** in backup.c maintains the content of this variable. This module
! 6688: ** uses it opaquely as an argument to sqlite3BackupRestart() and
! 6689: ** sqlite3BackupUpdate() only.
! 6690: */
! 6691: sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){
! 6692: return &pPager->pBackup;
! 6693: }
! 6694:
! 6695: #ifndef SQLITE_OMIT_VACUUM
! 6696: /*
! 6697: ** Unless this is an in-memory or temporary database, clear the pager cache.
! 6698: */
! 6699: void sqlite3PagerClearCache(Pager *pPager){
! 6700: if( !MEMDB && pPager->tempFile==0 ) pager_reset(pPager);
! 6701: }
! 6702: #endif
! 6703:
! 6704: #ifndef SQLITE_OMIT_WAL
! 6705: /*
! 6706: ** This function is called when the user invokes "PRAGMA wal_checkpoint",
! 6707: ** "PRAGMA wal_blocking_checkpoint" or calls the sqlite3_wal_checkpoint()
! 6708: ** or wal_blocking_checkpoint() API functions.
! 6709: **
! 6710: ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART.
! 6711: */
! 6712: int sqlite3PagerCheckpoint(Pager *pPager, int eMode, int *pnLog, int *pnCkpt){
! 6713: int rc = SQLITE_OK;
! 6714: if( pPager->pWal ){
! 6715: rc = sqlite3WalCheckpoint(pPager->pWal, eMode,
! 6716: pPager->xBusyHandler, pPager->pBusyHandlerArg,
! 6717: pPager->ckptSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace,
! 6718: pnLog, pnCkpt
! 6719: );
! 6720: }
! 6721: return rc;
! 6722: }
! 6723:
! 6724: int sqlite3PagerWalCallback(Pager *pPager){
! 6725: return sqlite3WalCallback(pPager->pWal);
! 6726: }
! 6727:
! 6728: /*
! 6729: ** Return true if the underlying VFS for the given pager supports the
! 6730: ** primitives necessary for write-ahead logging.
! 6731: */
! 6732: int sqlite3PagerWalSupported(Pager *pPager){
! 6733: const sqlite3_io_methods *pMethods = pPager->fd->pMethods;
! 6734: return pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap);
! 6735: }
! 6736:
! 6737: /*
! 6738: ** Attempt to take an exclusive lock on the database file. If a PENDING lock
! 6739: ** is obtained instead, immediately release it.
! 6740: */
! 6741: static int pagerExclusiveLock(Pager *pPager){
! 6742: int rc; /* Return code */
! 6743:
! 6744: assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK );
! 6745: rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
! 6746: if( rc!=SQLITE_OK ){
! 6747: /* If the attempt to grab the exclusive lock failed, release the
! 6748: ** pending lock that may have been obtained instead. */
! 6749: pagerUnlockDb(pPager, SHARED_LOCK);
! 6750: }
! 6751:
! 6752: return rc;
! 6753: }
! 6754:
! 6755: /*
! 6756: ** Call sqlite3WalOpen() to open the WAL handle. If the pager is in
! 6757: ** exclusive-locking mode when this function is called, take an EXCLUSIVE
! 6758: ** lock on the database file and use heap-memory to store the wal-index
! 6759: ** in. Otherwise, use the normal shared-memory.
! 6760: */
! 6761: static int pagerOpenWal(Pager *pPager){
! 6762: int rc = SQLITE_OK;
! 6763:
! 6764: assert( pPager->pWal==0 && pPager->tempFile==0 );
! 6765: assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK || pPager->noReadlock);
! 6766:
! 6767: /* If the pager is already in exclusive-mode, the WAL module will use
! 6768: ** heap-memory for the wal-index instead of the VFS shared-memory
! 6769: ** implementation. Take the exclusive lock now, before opening the WAL
! 6770: ** file, to make sure this is safe.
! 6771: */
! 6772: if( pPager->exclusiveMode ){
! 6773: rc = pagerExclusiveLock(pPager);
! 6774: }
! 6775:
! 6776: /* Open the connection to the log file. If this operation fails,
! 6777: ** (e.g. due to malloc() failure), return an error code.
! 6778: */
! 6779: if( rc==SQLITE_OK ){
! 6780: rc = sqlite3WalOpen(pPager->pVfs,
! 6781: pPager->fd, pPager->zWal, pPager->exclusiveMode,
! 6782: pPager->journalSizeLimit, &pPager->pWal
! 6783: );
! 6784: }
! 6785:
! 6786: return rc;
! 6787: }
! 6788:
! 6789:
! 6790: /*
! 6791: ** The caller must be holding a SHARED lock on the database file to call
! 6792: ** this function.
! 6793: **
! 6794: ** If the pager passed as the first argument is open on a real database
! 6795: ** file (not a temp file or an in-memory database), and the WAL file
! 6796: ** is not already open, make an attempt to open it now. If successful,
! 6797: ** return SQLITE_OK. If an error occurs or the VFS used by the pager does
! 6798: ** not support the xShmXXX() methods, return an error code. *pbOpen is
! 6799: ** not modified in either case.
! 6800: **
! 6801: ** If the pager is open on a temp-file (or in-memory database), or if
! 6802: ** the WAL file is already open, set *pbOpen to 1 and return SQLITE_OK
! 6803: ** without doing anything.
! 6804: */
! 6805: int sqlite3PagerOpenWal(
! 6806: Pager *pPager, /* Pager object */
! 6807: int *pbOpen /* OUT: Set to true if call is a no-op */
! 6808: ){
! 6809: int rc = SQLITE_OK; /* Return code */
! 6810:
! 6811: assert( assert_pager_state(pPager) );
! 6812: assert( pPager->eState==PAGER_OPEN || pbOpen );
! 6813: assert( pPager->eState==PAGER_READER || !pbOpen );
! 6814: assert( pbOpen==0 || *pbOpen==0 );
! 6815: assert( pbOpen!=0 || (!pPager->tempFile && !pPager->pWal) );
! 6816:
! 6817: if( !pPager->tempFile && !pPager->pWal ){
! 6818: if( !sqlite3PagerWalSupported(pPager) ) return SQLITE_CANTOPEN;
! 6819:
! 6820: /* Close any rollback journal previously open */
! 6821: sqlite3OsClose(pPager->jfd);
! 6822:
! 6823: rc = pagerOpenWal(pPager);
! 6824: if( rc==SQLITE_OK ){
! 6825: pPager->journalMode = PAGER_JOURNALMODE_WAL;
! 6826: pPager->eState = PAGER_OPEN;
! 6827: }
! 6828: }else{
! 6829: *pbOpen = 1;
! 6830: }
! 6831:
! 6832: return rc;
! 6833: }
! 6834:
! 6835: /*
! 6836: ** This function is called to close the connection to the log file prior
! 6837: ** to switching from WAL to rollback mode.
! 6838: **
! 6839: ** Before closing the log file, this function attempts to take an
! 6840: ** EXCLUSIVE lock on the database file. If this cannot be obtained, an
! 6841: ** error (SQLITE_BUSY) is returned and the log connection is not closed.
! 6842: ** If successful, the EXCLUSIVE lock is not released before returning.
! 6843: */
! 6844: int sqlite3PagerCloseWal(Pager *pPager){
! 6845: int rc = SQLITE_OK;
! 6846:
! 6847: assert( pPager->journalMode==PAGER_JOURNALMODE_WAL );
! 6848:
! 6849: /* If the log file is not already open, but does exist in the file-system,
! 6850: ** it may need to be checkpointed before the connection can switch to
! 6851: ** rollback mode. Open it now so this can happen.
! 6852: */
! 6853: if( !pPager->pWal ){
! 6854: int logexists = 0;
! 6855: rc = pagerLockDb(pPager, SHARED_LOCK);
! 6856: if( rc==SQLITE_OK ){
! 6857: rc = sqlite3OsAccess(
! 6858: pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &logexists
! 6859: );
! 6860: }
! 6861: if( rc==SQLITE_OK && logexists ){
! 6862: rc = pagerOpenWal(pPager);
! 6863: }
! 6864: }
! 6865:
! 6866: /* Checkpoint and close the log. Because an EXCLUSIVE lock is held on
! 6867: ** the database file, the log and log-summary files will be deleted.
! 6868: */
! 6869: if( rc==SQLITE_OK && pPager->pWal ){
! 6870: rc = pagerExclusiveLock(pPager);
! 6871: if( rc==SQLITE_OK ){
! 6872: rc = sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags,
! 6873: pPager->pageSize, (u8*)pPager->pTmpSpace);
! 6874: pPager->pWal = 0;
! 6875: }
! 6876: }
! 6877: return rc;
! 6878: }
! 6879:
! 6880: #ifdef SQLITE_HAS_CODEC
! 6881: /*
! 6882: ** This function is called by the wal module when writing page content
! 6883: ** into the log file.
! 6884: **
! 6885: ** This function returns a pointer to a buffer containing the encrypted
! 6886: ** page content. If a malloc fails, this function may return NULL.
! 6887: */
! 6888: void *sqlite3PagerCodec(PgHdr *pPg){
! 6889: void *aData = 0;
! 6890: CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData);
! 6891: return aData;
! 6892: }
! 6893: #endif /* SQLITE_HAS_CODEC */
! 6894:
! 6895: #endif /* !SQLITE_OMIT_WAL */
! 6896:
! 6897: #endif /* SQLITE_OMIT_DISKIO */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>