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, &currentSize);
        !          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>