/ Hex Artifact Content
Login

Artifact d18d56247c40bf4006ca7761c457b7d76af5c62a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 31 30  : pager.c,v 1.10
0350: 33 20 32 30 30 34 2f 30 35 2f 30 37 20 31 37 3a  3 2004/05/07 17:
0360: 35 37 3a 35 30 20 64 72 68 20 45 78 70 20 24 0a  57:50 drh Exp $.
0370: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  */.#include "os.
0380: 68 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  h"         /* Mu
0390: 73 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65  st be first to e
03a0: 6e 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65  nable large file
03b0: 20 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63   support */.#inc
03c0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
03d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  h".#include "pag
03e0: 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  er.h".#include <
03f0: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
0400: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f  de <string.h>../
0410: 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20  *.** Macros for 
0420: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e  troubleshooting.
0430: 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65    Normally turne
0440: 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73  d off.*/.#if 0.s
0450: 74 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69  tatic Pager *mai
0460: 6e 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66  nPager = 0;.#def
0470: 69 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29  ine SET_PAGER(X)
0480: 20 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d    if( mainPager=
0490: 3d 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d  =0 ) mainPager =
04a0: 20 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52   (X).#define CLR
04b0: 5f 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d  _PAGER(X)  if( m
04c0: 61 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20  ainPager==(X) ) 
04d0: 6d 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64  mainPager = 0.#d
04e0: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
04f0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d      if( pPager==
0500: 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69  mainPager ) fpri
0510: 6e 74 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64  ntf(stderr,X).#d
0520: 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59  efine TRACE2(X,Y
0530: 29 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  )   if( pPager==
0540: 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70 72 69  mainPager ) fpri
0550: 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a  ntf(stderr,X,Y).
0560: 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58  #define TRACE3(X
0570: 2c 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72  ,Y,Z) if( pPager
0580: 3d 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 66 70  ==mainPager ) fp
0590: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 58 2c 59  rintf(stderr,X,Y
05a0: 2c 5a 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ,Z).#else.#defin
05b0: 65 20 53 45 54 5f 50 41 47 45 52 28 58 29 0a 23  e SET_PAGER(X).#
05c0: 64 65 66 69 6e 65 20 43 4c 52 5f 50 41 47 45 52  define CLR_PAGER
05d0: 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (X).#define TRAC
05e0: 45 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52  E1(X).#define TR
05f0: 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e  ACE2(X,Y).#defin
0600: 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a  e TRACE3(X,Y,Z).
0610: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 51  ates:.**.**   SQ
0670: 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20  LITE_UNLOCK     
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
0760: 5f 52 45 41 44 4c 4f 43 4b 20 20 20 20 20 54 68  _READLOCK     Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 53 51 4c 49 54 45 5f 57 52 49 54  **   SQLITE_WRIT
0860: 45 4c 4f 43 4b 20 20 20 20 54 68 65 20 70 61 67  ELOCK    The pag
0870: 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69  e cache is writi
0880: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
0890: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08a0: 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73            Access
08b0: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
08c0: 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  No other process
08d0: 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  es or.**        
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
08f0: 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65  hreads can be re
0900: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
0910: 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20   while one.**   
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77      process is w
0940: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  riting..**.** Th
0950: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0960: 65 73 20 75 70 20 69 6e 20 53 51 4c 49 54 45 5f  es up in SQLITE_
0970: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0980: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0990: 69 74 65 5f 70 61 67 65 5f 67 65 74 28 29 20 6f  ite_page_get() o
09a0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
09b0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
09c0: 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b 2e  SQLITE_READLOCK.
09d0: 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61  .** After all pa
09e0: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ges have been re
09f0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
0a00: 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29  ite_page_unref()
0a10: 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74  ,.** the state t
0a20: 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20  ransitions back 
0a30: 74 6f 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b  to SQLITE_UNLOCK
0a40: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0a50: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
0a60: 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20 69 73  _page_write() is
0a70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0a80: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0a90: 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 57 52 49 54  o.** SQLITE_WRIT
0aa0: 45 4c 4f 43 4b 2e 20 20 28 4e 6f 74 65 20 74 68  ELOCK.  (Note th
0ab0: 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77  at sqlite_page_w
0ac0: 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20  rite() can only 
0ad0: 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20  be.** called on 
0ae0: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  an outstanding p
0af0: 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20  age which means 
0b00: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d  that the pager m
0b10: 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 53 51 4c  ust.** be in SQL
0b20: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 20 62 65 66  ITE_READLOCK bef
0b30: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0b40: 6e 73 20 74 6f 20 53 51 4c 49 54 45 5f 57 52 49  ns to SQLITE_WRI
0b50: 54 45 4c 4f 43 4b 2e 29 0a 2a 2a 20 54 68 65 20  TELOCK.).** The 
0b60: 73 71 6c 69 74 65 5f 70 61 67 65 5f 72 6f 6c 6c  sqlite_page_roll
0b70: 62 61 63 6b 28 29 20 61 6e 64 20 73 71 6c 69 74  back() and sqlit
0b80: 65 5f 70 61 67 65 5f 63 6f 6d 6d 69 74 28 29 20  e_page_commit() 
0b90: 66 75 6e 63 74 69 6f 6e 73 20 0a 2a 2a 20 74 72  functions .** tr
0ba0: 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 73 74 61  ansition the sta
0bb0: 74 65 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 57  te from SQLITE_W
0bc0: 52 49 54 45 4c 4f 43 4b 20 62 61 63 6b 20 74 6f  RITELOCK back to
0bd0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
0be0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  ..*/.#define SQL
0bf0: 49 54 45 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  ITE_UNLOCK      
0c00: 30 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  0.#define SQLITE
0c10: 5f 52 45 41 44 4c 4f 43 4b 20 20 20 20 31 0a 23  _READLOCK    1.#
0c20: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 52  define SQLITE_WR
0c30: 49 54 45 4c 4f 43 4b 20 20 20 32 0a 0a 0a 2f 2a  ITELOCK   2.../*
0c40: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
0c50: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
0c60: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
0c70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
0c80: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
0c90: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
0ca0: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
0cb0: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
0cc0: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
0cd0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
0ce0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
0cf0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
0d00: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
0d10: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
0d20: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
0d30: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e  pager_write() on
0d40: 20 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f   a page prior to
0d50: 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d   making.** any m
0d60: 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20  odifications to 
0d70: 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20  that page.  The 
0d80: 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74  first time sqlit
0d90: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a  e3pager_write().
0da0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ** is called, th
0db0: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
0dc0: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69  contents are wri
0dd0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f  tten into the ro
0de0: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0df0: 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f  l and PgHdr.inJo
0e00: 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e  urnal and PgHdr.
0e10: 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73 65 74  needSync are set
0e20: 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a  .  Later, once.*
0e30: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  * the journal pa
0e40: 67 65 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f  ge has made it o
0e50: 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72  nto the disk sur
0e60: 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64  face, PgHdr.need
0e70: 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72  Sync.** is clear
0e80: 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65  ed.  The modifie
0e90: 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  d page cannot be
0ea0: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
0eb0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  to the original.
0ec0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
0ed0: 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e   until the journ
0ee0: 61 6c 20 70 61 67 65 73 20 68 61 73 20 62 65 65  al pages has bee
0ef0: 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
0f00: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64   and the.** PgHd
0f10: 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62  r.needSync has b
0f20: 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  een cleared..**.
0f30: 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69 72  ** The PgHdr.dir
0f40: 74 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  ty flag is set w
0f50: 68 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72  hen sqlite3pager
0f60: 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  _write() is call
0f70: 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65  ed and.** is cle
0f80: 61 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20  ared again when 
0f90: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
0fa0: 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b   is written back
0fb0: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
0fc0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
0fd0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0fe0: 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72  ruct PgHdr PgHdr
0ff0: 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b  ;.struct PgHdr {
1000: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1020: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
1030: 6f 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67  o which this pag
1040: 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50  e belongs */.  P
1050: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1070: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1080: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
1090: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
10a0: 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68  Hash, *pPrevHash
10b0: 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69  ;  /* Hash colli
10c0: 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50  sion chain for P
10d0: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 69  gHdr.pgno */.  i
10e0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1100: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73   Number of users
1110: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f   of this page */
1120: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46  .  PgHdr *pNextF
1130: 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b  ree, *pPrevFree;
1140: 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66    /* Freelist of
1150: 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
1160: 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  f==0 */.  PgHdr 
1170: 2a 70 4e 65 78 74 41 6c 6c 2c 20 2a 70 50 72 65  *pNextAll, *pPre
1180: 76 41 6c 6c 3b 20 20 20 20 2f 2a 20 41 20 6c 69  vAll;    /* A li
1190: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
11a0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
11b0: 74 43 6b 70 74 2c 20 2a 70 50 72 65 76 43 6b 70  tCkpt, *pPrevCkp
11c0: 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70  t;  /* List of p
11d0: 61 67 65 73 20 69 6e 20 74 68 65 20 63 68 65 63  ages in the chec
11e0: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  kpoint journal *
11f0: 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c  /.  u8 inJournal
1200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1210: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61     /* TRUE if ha
1220: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
1230: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  o journal */.  u
1240: 38 20 69 6e 43 6b 70 74 3b 20 20 20 20 20 20 20  8 inCkpt;       
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1260: 20 54 52 55 45 20 69 66 20 77 72 69 74 74 65 6e   TRUE if written
1270: 20 74 6f 20 74 68 65 20 63 68 65 63 6b 70 6f 69   to the checkpoi
1280: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
1290: 75 38 20 64 69 72 74 79 3b 20 20 20 20 20 20 20  u8 dirty;       
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12b0: 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e 65 65  * TRUE if we nee
12c0: 64 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20  d to write back 
12d0: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20  changes */.  u8 
12e0: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1300: 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  ync journal befo
1310: 72 65 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  re writing this 
1320: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77  page */.  u8 alw
1330: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
1340: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
1350: 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ble dont_rollbac
1360: 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67  k() for this pag
1370: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44  e */.  PgHdr *pD
1380: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1390: 20 20 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70        /* Dirty p
13a0: 61 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50  ages sorted by P
13b0: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 2f  gHdr.pgno */.  /
13c0: 2a 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  * SQLITE_PAGE_SI
13d0: 5a 45 20 62 79 74 65 73 20 6f 66 20 70 61 67 65  ZE bytes of page
13e0: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69   data follow thi
13f0: 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a  s header */.  /*
1400: 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
1410: 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74  tes of local dat
1420: 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67  a follow the pag
1430: 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  e data */.};.../
1440: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1450: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1460: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1470: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1480: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1490: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
14a0: 45 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  EC(P,D,N,X) if( 
14b0: 50 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e  P->xCodec ){ P->
14c0: 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63  xCodec(P->pCodec
14d0: 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65  Arg,D,N,X); }.#e
14e0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  lse.# define COD
14f0: 45 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64  EC(P,D,N,X).#end
1500: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
1510: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
1520: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
1530: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
1540: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
1550: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
1560: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
1570: 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b    ((void*)(&(P)[
1580: 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54  1])).#define DAT
1590: 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28  A_TO_PGHDR(D)  (
15a0: 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d  &((PgHdr*)(D))[-
15b0: 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  1]).#define PGHD
15c0: 52 5f 54 4f 5f 45 58 54 52 41 28 50 29 20 28 28  R_TO_EXTRA(P) ((
15d0: 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28  void*)&((char*)(
15e0: 26 28 50 29 5b 31 5d 29 29 5b 53 51 4c 49 54 45  &(P)[1]))[SQLITE
15f0: 5f 50 41 47 45 5f 53 49 5a 45 5d 29 0a 0a 2f 2a  _PAGE_SIZE])../*
1600: 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20 6d  .** How big to m
1610: 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
1620: 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 61  le used for loca
1630: 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  ting in-memory p
1640: 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65 20  ages.** by page 
1650: 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66 69  number..*/.#defi
1660: 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32 30 34  ne N_PG_HASH 204
1670: 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20  8../*.** Hash a 
1680: 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23  page number.*/.#
1690: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73  define pager_has
16a0: 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e 5f  h(PN)  ((PN)&(N_
16b0: 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a 0a  PG_HASH-1))../*.
16c0: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
16d0: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
16e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
16f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1700: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
1710: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
1720: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1730: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1740: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1750: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
1760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1770: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
1780: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
1790: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
17a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
17b0: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
17c0: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
17d0: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46  l files */.  OsF
17e0: 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20 20 20  ile fd, jfd;    
17f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1800: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
1810: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
1820: 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c  urnal */.  OsFil
1830: 65 20 63 70 66 64 3b 20 20 20 20 20 20 20 20 20  e cpfd;         
1840: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1850: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
1860: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e checkpoint jou
1870: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rnal */.  int db
1880: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1890: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18a0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18b0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
18c0: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
18d0: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
18e0: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
18f0: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
1900: 6e 74 20 63 6b 70 74 53 69 7a 65 3b 20 20 20 20  nt ckptSize;    
1910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1920: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
1930: 69 6e 20 70 61 67 65 73 29 20 61 74 20 63 6b 70  in pages) at ckp
1940: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 6f  t_begin() */.  o
1950: 66 66 5f 74 20 63 6b 70 74 4a 53 69 7a 65 3b 20  ff_t ckptJSize; 
1960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1970: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74  ze of journal at
1980: 20 63 6b 70 74 5f 62 65 67 69 6e 28 29 20 2a 2f   ckpt_begin() */
1990: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19c0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
19d0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
19e0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
19f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
1a00: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
1a10: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
1a20: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74  hecksum */.  int
1a30: 20 63 6b 70 74 4e 52 65 63 3b 20 20 20 20 20 20   ckptNRec;      
1a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a50: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
1a60: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
1a70: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
1a80: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
1a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1aa0: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1ab0: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
1ac0: 79 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64  y page */.  void
1ad0: 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28   (*xDestructor)(
1ae0: 76 6f 69 64 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20  void*); /* Call 
1af0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1b00: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
1b10: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1b40: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
1b50: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ges */.  int nRe
1b60: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1b70: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b80: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
1b90: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
1ba0: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
1bb0: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1bc0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
1bd0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1be0: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
1bf0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20   */.  int nHit, 
1c00: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
1c10: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
1c20: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
1c30: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
1c40: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
1c50: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
1c60: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
1c70: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
1c80: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
1c90: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
1ca0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1cb0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
1cc0: 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f  dec() */.  u8 jo
1cd0: 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20  urnalOpen;      
1ce0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1cf0: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  f journal file d
1d00: 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61  escriptors is va
1d10: 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  lid */.  u8 jour
1d20: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
1d30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1d40: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
1d50: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
1d60: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d80: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
1d90: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
1da0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ile */.  u8 ckpt
1db0: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
1dc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1dd0: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a  the checkpoint j
1de0: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
1df0: 2f 0a 20 20 75 38 20 63 6b 70 74 49 6e 55 73 65  /.  u8 ckptInUse
1e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e10: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
1e20: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a  n a checkpoint *
1e30: 2f 0a 20 20 75 38 20 63 6b 70 74 41 75 74 6f 6f  /.  u8 ckptAutoo
1e40: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
1e50: 2f 2a 20 4f 70 65 6e 20 63 6b 70 74 20 6a 6f 75  /* Open ckpt jou
1e60: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
1e70: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
1e80: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
1eb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
1ec0: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
1ed0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
1ee0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
1ef0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
1f00: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
1f10: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61  ness */.  u8 sta
1f20: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1f30: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
1f40: 55 4e 4c 4f 43 4b 2c 20 5f 52 45 41 44 4c 4f 43  UNLOCK, _READLOC
1f50: 4b 20 6f 72 20 5f 57 52 49 54 45 4c 4f 43 4b 20  K or _WRITELOCK 
1f60: 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b  */.  u8 errMask;
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
1f90: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
1fa0: 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  rs */.  u8 tempF
1fb0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
1fc0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
1fd0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
1fe0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
1ff0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2000: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2010: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2020: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2030: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2040: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2050: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2060: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2070: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2080: 69 72 74 79 46 69 6c 65 3b 20 20 20 20 20 20 20  irtyFile;       
2090: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20a0: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
20b0: 20 68 61 73 20 63 68 61 6e 67 65 64 20 69 6e 20   has changed in 
20c0: 61 6e 79 20 77 61 79 20 2a 2f 0a 20 20 75 38 20  any way */.  u8 
20d0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20  alwaysRollback; 
20e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
20f0: 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ble dont_rollbac
2100: 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  k() for all page
2110: 73 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f  s */.  u8 *aInJo
2120: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2130: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
2140: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
2150: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2160: 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 43 6b 70   */.  u8 *aInCkp
2170: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2180: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
2190: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
21a0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
21b0: 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a  PgHdr *pFirst, *
21c0: 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  pLast;      /* L
21d0: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
21e0: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  s */.  PgHdr *pF
21f0: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20  irstSynced;     
2200: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65     /* First free
2210: 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64 72   page with PgHdr
2220: 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a  .needSync==0 */.
2230: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2250: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
2260: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
2270: 43 6b 70 74 3b 20 20 20 20 20 20 20 20 20 20 20  Ckpt;           
2280: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
2290: 61 67 65 73 20 69 6e 20 74 68 65 20 63 68 65 63  ages in the chec
22a0: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  kpoint journal *
22b0: 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61 73 68  /.  PgHdr *aHash
22c0: 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20 20 20  [N_PG_HASH];    
22d0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
22e0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
22f0: 20 6f 66 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a   of PgHdr */.};.
2300: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
2310: 20 62 69 74 73 20 74 68 61 74 20 63 61 6e 20 62   bits that can b
2320: 65 20 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65  e set in Pager.e
2330: 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69  rrMask..*/.#defi
2340: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  ne PAGER_ERR_FUL
2350: 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61  L     0x01  /* a
2360: 20 77 72 69 74 65 28 29 20 66 61 69 6c 65 64 20   write() failed 
2370: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
2380: 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78  _ERR_MEM      0x
2390: 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20  02  /* malloc() 
23a0: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
23b0: 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b  e PAGER_ERR_LOCK
23c0: 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72       0x04  /* er
23d0: 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ror in the locki
23e0: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23  ng protocol */.#
23f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
2400: 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38 20 20  _CORRUPT  0x08  
2410: 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a  /* database or j
2420: 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
2430: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  n */.#define PAG
2440: 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20  ER_ERR_DISK     
2450: 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c  0x10  /* general
2460: 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
2470: 2d 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65  - bad hard drive
2480: 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ? */../*.** The 
2490: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
24a0: 74 61 69 6e 73 20 70 61 67 65 20 72 65 63 6f 72  tains page recor
24b0: 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ds in the follow
24c0: 69 6e 67 0a 2a 2a 20 66 6f 72 6d 61 74 2e 0a 2a  ing.** format..*
24d0: 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74  *.** Actually, t
24e0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
24f0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 61   the complete pa
2500: 67 65 20 72 65 63 6f 72 64 20 66 6f 72 20 70 61  ge record for pa
2510: 67 65 72 0a 2a 2a 20 66 6f 72 6d 61 74 73 20 6c  ger.** formats l
2520: 65 73 73 20 74 68 61 6e 20 33 2e 20 20 42 65 67  ess than 3.  Beg
2530: 69 6e 6e 69 6e 67 20 77 69 74 68 20 66 6f 72 6d  inning with form
2540: 61 74 20 33 2c 20 74 68 69 73 20 72 65 63 6f 72  at 3, this recor
2550: 64 20 69 73 20 73 75 72 72 6f 75 6e 64 65 64 0a  d is surrounded.
2560: 2a 2a 20 62 79 20 74 77 6f 20 63 68 65 63 6b 73  ** by two checks
2570: 75 6d 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ums..*/.typedef 
2580: 73 74 72 75 63 74 20 50 61 67 65 52 65 63 6f 72  struct PageRecor
2590: 64 20 50 61 67 65 52 65 63 6f 72 64 3b 0a 73 74  d PageRecord;.st
25a0: 72 75 63 74 20 50 61 67 65 52 65 63 6f 72 64 20  ruct PageRecord 
25b0: 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  {.  Pgno pgno;  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
25e0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
25f0: 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 50 41   aData[SQLITE_PA
2600: 47 45 5f 53 49 5a 45 5d 3b 20 20 20 2f 2a 20 4f  GE_SIZE];   /* O
2610: 72 69 67 69 6e 61 6c 20 64 61 74 61 20 66 6f 72  riginal data for
2620: 20 70 61 67 65 20 70 67 6e 6f 20 2a 2f 0a 7d 3b   page pgno */.};
2630: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
2640: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
2650: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
2660: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
2670: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
2680: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
2690: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
26a0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
26b0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
26c0: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72  ** There are thr
26d0: 65 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ee journal forma
26e0: 74 73 20 28 73 6f 20 66 61 72 29 2e 20 54 68 65  ts (so far). The
26f0: 20 31 73 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   1st journal for
2700: 6d 61 74 20 77 72 69 74 65 73 0a 2a 2a 20 33 32  mat writes.** 32
2710: 2d 62 69 74 20 69 6e 74 65 67 65 72 73 20 69 6e  -bit integers in
2720: 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72 20   the byte-order 
2730: 6f 66 20 74 68 65 20 68 6f 73 74 20 6d 61 63 68  of the host mach
2740: 69 6e 65 2e 20 20 4e 65 77 0a 2a 2a 20 66 6f 72  ine.  New.** for
2750: 6d 61 74 73 20 77 72 69 74 65 73 20 69 6e 74 65  mats writes inte
2760: 67 65 72 73 20 61 73 20 62 69 67 2d 65 6e 64 69  gers as big-endi
2770: 61 6e 2e 20 20 41 6c 6c 20 6e 65 77 20 6a 6f 75  an.  All new jou
2780: 72 6e 61 6c 73 20 75 73 65 20 74 68 65 0a 2a 2a  rnals use the.**
2790: 20 6e 65 77 20 66 6f 72 6d 61 74 2c 20 62 75 74   new format, but
27a0: 20 77 65 20 68 61 76 65 20 74 6f 20 62 65 20 61   we have to be a
27b0: 62 6c 65 20 74 6f 20 72 65 61 64 20 61 6e 20 6f  ble to read an o
27c0: 6c 64 65 72 20 6a 6f 75 72 6e 61 6c 20 69 6e 20  lder journal in 
27d0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 72 6f 6c 6c  order.** to roll
27e0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 73 20 63 72  back journals cr
27f0: 65 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76  eated by older v
2800: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c  ersions of the l
2810: 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  ibrary..**.** Th
2820: 65 20 33 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  e 3rd journal fo
2830: 72 6d 61 74 20 28 61 64 64 65 64 20 66 6f 72 20  rmat (added for 
2840: 32 2e 38 2e 30 29 20 61 64 64 73 20 61 64 64 69  2.8.0) adds addi
2850: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
2860: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
2870: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 6a 6f 75  ation to the jou
2880: 72 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 70 6f  rnal.  If the po
2890: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
28a0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  the.** journal i
28b0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
28c0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
28d0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
28e0: 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65  appear in.** the
28f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 66   journal file af
2900: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
2910: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
2920: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
2930: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
2940: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
2950: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
2960: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
2970: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
2980: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
2990: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
29a0: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
29b0: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
29c0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
29d0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
29e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
29f0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
2a00: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 33 72  ation for the 3r
2a10: 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
2a20: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
2a30: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
2a40: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
2a50: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
2a60: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
2a70: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
2a80: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 53 51 4c  mber and the SQL
2a90: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 62 79  ITE_PAGE_SIZE by
2aa0: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
2ab0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
2ac0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
2ad0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
2ae0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
2af0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
2b00: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2b10: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
2b20: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
2b30: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
2b40: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
2b50: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
2b60: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
2b70: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
2b80: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
2b90: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
2ba0: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
2bb0: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
2bc0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
2bd0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
2be0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
2bf0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
2c00: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
2c10: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
2c20: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
2c30: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
2c40: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
2c50: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
2c60: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
2c70: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
2c80: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
2c90: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
2ca0: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
2cb0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
2cc0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
2cd0: 6c 4d 61 67 69 63 31 5b 5d 20 3d 20 7b 0a 20 20  lMagic1[] = {.  
2ce0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
2cf0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
2d00: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 34 2c 0a  a1, 0x63, 0xd4,.
2d10: 7d 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  };.static const 
2d20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
2d30: 6f 75 72 6e 61 6c 4d 61 67 69 63 32 5b 5d 20 3d  ournalMagic2[] =
2d40: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
2d50: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
2d60: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
2d70: 78 64 35 2c 0a 7d 3b 0a 73 74 61 74 69 63 20 63  xd5,.};.static c
2d80: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2d90: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
2da0: 33 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  3[] = {.  0xd9, 
2db0: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
2dc0: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
2dd0: 36 33 2c 20 30 78 64 36 2c 0a 7d 3b 0a 23 64 65  63, 0xd6,.};.#de
2de0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 46 4f 52  fine JOURNAL_FOR
2df0: 4d 41 54 5f 31 20 31 0a 23 64 65 66 69 6e 65 20  MAT_1 1.#define 
2e00: 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 32  JOURNAL_FORMAT_2
2e10: 20 32 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e   2.#define JOURN
2e20: 41 4c 5f 46 4f 52 4d 41 54 5f 33 20 33 0a 0a 2f  AL_FORMAT_3 3../
2e30: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2e40: 6e 67 20 69 6e 74 65 67 65 72 20 64 65 74 65 72  ng integer deter
2e50: 6d 69 6e 65 73 20 77 68 61 74 20 66 6f 72 6d 61  mines what forma
2e60: 74 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  t to use when cr
2e70: 65 61 74 69 6e 67 0a 2a 2a 20 6e 65 77 20 70 72  eating.** new pr
2e80: 69 6d 61 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  imary journal fi
2e90: 6c 65 73 2e 20 20 42 79 20 64 65 66 61 75 6c 74  les.  By default
2ea0: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 66   we always use f
2eb0: 6f 72 6d 61 74 20 33 2e 0a 2a 2a 20 57 68 65 6e  ormat 3..** When
2ec0: 20 74 65 73 74 69 6e 67 2c 20 77 65 20 63 61 6e   testing, we can
2ed0: 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20   set this value 
2ee0: 74 6f 20 6f 6c 64 65 72 20 6a 6f 75 72 6e 61 6c  to older journal
2ef0: 20 66 6f 72 6d 61 74 73 20 69 6e 20 6f 72 64 65   formats in orde
2f00: 72 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72  r to.** make sur
2f10: 65 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  e that newer ver
2f20: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 69 62  sions of the lib
2f30: 72 61 72 79 20 61 72 65 20 61 62 6c 65 20 74 6f  rary are able to
2f40: 20 72 6f 6c 6c 62 61 63 6b 20 6f 6c 64 65 72 0a   rollback older.
2f50: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
2f60: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2f70: 74 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  t checkpoint jou
2f80: 72 6e 61 6c 73 20 61 6c 77 61 79 73 20 75 73 65  rnals always use
2f90: 20 66 6f 72 6d 61 74 20 32 20 61 6e 64 20 6f 6d   format 2 and om
2fa0: 69 74 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  it the header..*
2fb0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2fc0: 54 45 53 54 0a 69 6e 74 20 6a 6f 75 72 6e 61 6c  TEST.int journal
2fd0: 5f 66 6f 72 6d 61 74 20 3d 20 33 3b 0a 23 65 6c  _format = 3;.#el
2fe0: 73 65 0a 23 20 64 65 66 69 6e 65 20 6a 6f 75 72  se.# define jour
2ff0: 6e 61 6c 5f 66 6f 72 6d 61 74 20 33 0a 23 65 6e  nal_format 3.#en
3000: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  dif../*.** The s
3010: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
3020: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
3030: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
3040: 6c 20 76 61 72 69 65 73 20 61 63 63 6f 72 64 69  l varies accordi
3050: 6e 67 0a 2a 2a 20 74 6f 20 77 68 69 63 68 20 6a  ng.** to which j
3060: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 69 73  ournal format is
3070: 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 54 68   being used.  Th
3080: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
3090: 6f 73 20 66 69 67 75 72 65 20 6f 75 74 0a 2a 2a  os figure out.**
30a0: 20 74 68 65 20 73 69 7a 65 73 20 62 61 73 65 64   the sizes based
30b0: 20 6f 6e 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65   on format numbe
30c0: 72 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  rs..*/.#define J
30d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 58 29  OURNAL_HDR_SZ(X)
30e0: 20 5c 0a 20 20 20 28 73 69 7a 65 6f 66 28 61 4a   \.   (sizeof(aJ
30f0: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 29 20 2b 20  ournalMagic1) + 
3100: 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 2b 20 28  sizeof(Pgno) + (
3110: 28 58 29 3e 3d 33 29 2a 32 2a 73 69 7a 65 6f 66  (X)>=3)*2*sizeof
3120: 28 75 33 32 29 29 0a 23 64 65 66 69 6e 65 20 4a  (u32)).#define J
3130: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 58 29 20  OURNAL_PG_SZ(X) 
3140: 5c 0a 20 20 20 28 53 51 4c 49 54 45 5f 50 41 47  \.   (SQLITE_PAG
3150: 45 5f 53 49 5a 45 20 2b 20 73 69 7a 65 6f 66 28  E_SIZE + sizeof(
3160: 50 67 6e 6f 29 20 2b 20 28 28 58 29 3e 3d 33 29  Pgno) + ((X)>=3)
3170: 2a 73 69 7a 65 6f 66 28 75 33 32 29 29 0a 0a 2f  *sizeof(u32))../
3180: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65  *.** Enable refe
3190: 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63  rence count trac
31a0: 6b 69 6e 67 20 68 65 72 65 3a 0a 2a 2f 0a 23 69  king here:.*/.#i
31b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
31c0: 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65  .  int pager3_re
31d0: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
31e0: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
31f0: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
3200: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
3210: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
3220: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33  .    if( !pager3
3230: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
3240: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 72  ) return;.    pr
3250: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45  intf(.       "RE
3260: 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 30  FCNT: %4d addr=0
3270: 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22  x%08x nRef=%d\n"
3280: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f  ,.       p->pgno
3290: 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f  , (int)PGHDR_TO_
32a0: 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66  DATA(p), p->nRef
32b0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b  .    );.    cnt+
32c0: 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  +;   /* Somethin
32d0: 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  g to set a break
32e0: 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a  point on */.  }.
32f0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
3300: 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e  (X)  pager_refin
3310: 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  fo(X).#else.# de
3320: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a  fine REFINFO(X).
3330: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
3340: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
3350: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76  ger from the giv
3360: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
3370: 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69  or.  Store the i
3380: 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69  nteger.** that i
3390: 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e  s read in *pRes.
33a0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
33b0: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
33c0: 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a   worked, or an.*
33d0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
33e0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
33f0: 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rong..**.** If t
3400: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
3410: 74 20 69 73 20 32 20 6f 72 20 33 2c 20 72 65 61  t is 2 or 3, rea
3420: 64 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  d a big-endian i
3430: 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65 0a  nteger.  If the.
3440: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ** journal forma
3450: 74 20 69 73 20 31 2c 20 72 65 61 64 20 61 6e 20  t is 1, read an 
3460: 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 6e  integer in the n
3470: 61 74 69 76 65 20 62 79 74 65 2d 6f 72 64 65 72  ative byte-order
3480: 20 6f 66 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20   of the.** host 
3490: 6d 61 63 68 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  machine..*/.stat
34a0: 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74  ic int read32bit
34b0: 73 28 69 6e 74 20 66 6f 72 6d 61 74 2c 20 4f 73  s(int format, Os
34c0: 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70  File *fd, u32 *p
34d0: 52 65 73 29 7b 0a 20 20 75 33 32 20 72 65 73 3b  Res){.  u32 res;
34e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
34f0: 3d 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 66  = sqliteOsRead(f
3500: 64 2c 20 26 72 65 73 2c 20 73 69 7a 65 6f 66 28  d, &res, sizeof(
3510: 72 65 73 29 29 3b 0a 20 20 69 66 28 20 72 63 3d  res));.  if( rc=
3520: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
3530: 72 6d 61 74 3e 4a 4f 55 52 4e 41 4c 5f 46 4f 52  rmat>JOURNAL_FOR
3540: 4d 41 54 5f 31 20 29 7b 0a 20 20 20 20 75 6e 73  MAT_1 ){.    uns
3550: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
3560: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c  ;.    memcpy(ac,
3570: 20 26 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72   &res, 4);.    r
3580: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
3590: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
35a0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
35b0: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  [3];.  }.  *pRes
35c0: 20 3d 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e   = res;.  return
35d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
35e0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
35f0: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
3600: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
3610: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
3620: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
3630: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
3640: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
3650: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
3660: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
3670: 6e 61 6c 20 66 6f 72 6d 61 74 20 69 73 20 32 20  nal format is 2 
3680: 6f 72 20 33 2c 20 77 72 69 74 65 20 74 68 65 20  or 3, write the 
3690: 69 6e 74 65 67 65 72 20 61 73 20 34 20 62 69 67  integer as 4 big
36a0: 2d 65 6e 64 69 61 6e 0a 2a 2a 20 62 79 74 65 73  -endian.** bytes
36b0: 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
36c0: 6c 20 66 6f 72 6d 61 74 20 69 73 20 31 2c 20 77  l format is 1, w
36d0: 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  rite the integer
36e0: 20 69 6e 20 74 68 65 20 6e 61 74 69 76 65 0a 2a   in the native.*
36f0: 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 49  * byte order.  I
3700: 6e 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69  n normal operati
3710: 6f 6e 2c 20 6f 6e 6c 79 20 66 6f 72 6d 61 74 73  on, only formats
3720: 20 32 20 61 6e 64 20 33 20 61 72 65 20 75 73 65   2 and 3 are use
3730: 64 2e 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 6f  d..** Journal fo
3740: 72 6d 61 74 20 31 20 69 73 20 6f 6e 6c 79 20 75  rmat 1 is only u
3750: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e  sed for testing.
3760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
3770: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
3780: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
3790: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
37a0: 20 61 63 5b 34 5d 3b 0a 20 20 69 66 28 20 6a 6f   ac[4];.  if( jo
37b0: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3c 3d 31 20  urnal_format<=1 
37c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
37d0: 6c 69 74 65 4f 73 57 72 69 74 65 28 66 64 2c 20  liteOsWrite(fd, 
37e0: 26 76 61 6c 2c 20 34 29 3b 0a 20 20 7d 0a 20 20  &val, 4);.  }.  
37f0: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
3800: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
3810: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
3820: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
3830: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
3840: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
3850: 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   0xff;.  return 
3860: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 66 64  sqliteOsWrite(fd
3870: 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a  , ac, 4);.}../*.
3880: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
3890: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
38a0: 20 70 61 67 65 20 68 65 61 64 65 72 20 72 69 67   page header rig
38b0: 68 74 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a  ht before the.**
38c0: 20 70 61 67 65 20 64 61 74 61 2e 20 20 54 68 69   page data.  Thi
38d0: 73 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  s will overwrite
38e0: 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
38f0: 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  y pointer..**.**
3900: 20 54 68 65 20 69 6e 74 65 67 65 72 20 69 73 20   The integer is 
3910: 62 69 67 2d 65 6e 64 69 61 6e 20 66 6f 72 20 66  big-endian for f
3920: 6f 72 6d 61 74 73 20 32 20 61 6e 64 20 33 20 61  ormats 2 and 3 a
3930: 6e 64 20 6e 61 74 69 76 65 20 62 79 74 65 20 6f  nd native byte o
3940: 72 64 65 72 0a 2a 2a 20 66 6f 72 20 6a 6f 75 72  rder.** for jour
3950: 6e 61 6c 20 66 6f 72 6d 61 74 20 31 2e 0a 2a 2f  nal format 1..*/
3960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f  .static void sto
3970: 72 65 33 32 62 69 74 73 28 75 33 32 20 76 61 6c  re32bits(u32 val
3980: 2c 20 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20  , PgHdr *p, int 
3990: 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67  offset){.  unsig
39a0: 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20  ned char *ac;.  
39b0: 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64  ac = &((unsigned
39c0: 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f   char*)PGHDR_TO_
39d0: 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d  DATA(p))[offset]
39e0: 3b 0a 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f  ;.  if( journal_
39f0: 66 6f 72 6d 61 74 3c 3d 31 20 29 7b 0a 20 20 20  format<=1 ){.   
3a00: 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 76 61 6c   memcpy(ac, &val
3a10: 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 4);.  }else{. 
3a20: 20 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e     ac[0] = (val>
3a30: 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 20  >24) & 0xff;.   
3a40: 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31   ac[1] = (val>>1
3a50: 36 29 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61  6) & 0xff;.    a
3a60: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
3a70: 26 20 30 78 66 66 3b 0a 20 20 20 20 61 63 5b 33  & 0xff;.    ac[3
3a80: 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a  ] = val & 0xff;.
3a90: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f    }.}.../*.** Co
3aa0: 6e 76 65 72 74 20 74 68 65 20 62 69 74 73 20 69  nvert the bits i
3ab0: 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72  n the pPager->er
3ac0: 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70  rMask into an ap
3ad0: 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75  proprate.** retu
3ae0: 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  rn code..*/.stat
3af0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
3b00: 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  code(Pager *pPag
3b10: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
3b20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
3b30: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3b40: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43   & PAGER_ERR_LOC
3b50: 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K )    rc = SQLI
3b60: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69  TE_PROTOCOL;.  i
3b70: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
3b80: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44  sk & PAGER_ERR_D
3b90: 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51  ISK )    rc = SQ
3ba0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66  LITE_IOERR;.  if
3bb0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
3bc0: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55  k & PAGER_ERR_FU
3bd0: 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  LL )    rc = SQL
3be0: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20  ITE_FULL;.  if( 
3bf0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
3c00: 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20  & PAGER_ERR_MEM 
3c10: 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  )     rc = SQLIT
3c20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70  E_NOMEM;.  if( p
3c30: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
3c40: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
3c50: 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  PT ) rc = SQLITE
3c60: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75  _CORRUPT;.  retu
3c70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3c80: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
3c90: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
3ca0: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
3cb0: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
3cc0: 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  ** checkpoint jo
3cd0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
3ce0: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
3cf0: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
3d00: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
3d10: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
3d20: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
3d30: 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c  urnal.  This hel
3d40: 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61  ps the sqlite3pa
3d50: 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
3d60: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e  ).** routine run
3d70: 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72   MUCH faster for
3d80: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
3d90: 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65   where there are
3da0: 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69   many.** pages i
3db0: 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c  n memory but onl
3dc0: 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74  y a few are in t
3dd0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
3de0: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
3df0: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
3e00: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
3e10: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
3e20: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
3e30: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
3e40: 67 2d 3e 69 6e 43 6b 70 74 20 29 20 72 65 74 75  g->inCkpt ) retu
3e50: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rn;.  assert( pP
3e60: 67 2d 3e 70 50 72 65 76 43 6b 70 74 3d 3d 30 20  g->pPrevCkpt==0 
3e70: 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70  && pPg->pNextCkp
3e80: 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  t==0 );.  pPg->p
3e90: 50 72 65 76 43 6b 70 74 20 3d 20 30 3b 0a 20 20  PrevCkpt = 0;.  
3ea0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 43 6b 70  if( pPager->pCkp
3eb0: 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  t ){.    pPager-
3ec0: 3e 70 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b 70  >pCkpt->pPrevCkp
3ed0: 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  t = pPg;.  }.  p
3ee0: 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20  Pg->pNextCkpt = 
3ef0: 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 3b 0a 20  pPager->pCkpt;. 
3f00: 20 70 50 61 67 65 72 2d 3e 70 43 6b 70 74 20 3d   pPager->pCkpt =
3f10: 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 43   pPg;.  pPg->inC
3f20: 6b 70 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69  kpt = 1;.}.stati
3f30: 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f  c void page_remo
3f40: 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
3f50: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
3f60: 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 43 6b 70   if( !pPg->inCkp
3f70: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  t ) return;.  if
3f80: 28 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74  ( pPg->pPrevCkpt
3f90: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3fa0: 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 2d 3e  pPg->pPrevCkpt->
3fb0: 70 4e 65 78 74 43 6b 70 74 3d 3d 70 50 67 20 29  pNextCkpt==pPg )
3fc0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
3fd0: 43 6b 70 74 2d 3e 70 4e 65 78 74 43 6b 70 74 20  Ckpt->pNextCkpt 
3fe0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74  = pPg->pNextCkpt
3ff0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
4000: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
4010: 65 72 2d 3e 70 43 6b 70 74 3d 3d 70 50 67 20 29  er->pCkpt==pPg )
4020: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
4030: 72 2d 3e 70 43 6b 70 74 20 3d 20 70 50 67 2d 3e  r->pCkpt = pPg->
4040: 70 4e 65 78 74 43 6b 70 74 3b 0a 20 20 7d 0a 20  pNextCkpt;.  }. 
4050: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 43   if( pPg->pNextC
4060: 6b 70 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  kpt ){.    asser
4070: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70  t( pPg->pNextCkp
4080: 74 2d 3e 70 50 72 65 76 43 6b 70 74 3d 3d 70 50  t->pPrevCkpt==pP
4090: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  g );.    pPg->pN
40a0: 65 78 74 43 6b 70 74 2d 3e 70 50 72 65 76 43 6b  extCkpt->pPrevCk
40b0: 70 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 43  pt = pPg->pPrevC
40c0: 6b 70 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  kpt;.  }.  pPg->
40d0: 70 4e 65 78 74 43 6b 70 74 20 3d 20 30 3b 0a 20  pNextCkpt = 0;. 
40e0: 20 70 50 67 2d 3e 70 50 72 65 76 43 6b 70 74 20   pPg->pPrevCkpt 
40f0: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 43 6b  = 0;.  pPg->inCk
4100: 70 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pt = 0;.}../*.**
4110: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
4120: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
4130: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
4140: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
4150: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4160: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
4170: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
4180: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
4190: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
41a0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
41b0: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
41c0: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
41d0: 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f  [pager_hash(pgno
41e0: 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26  )];.  while( p &
41f0: 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20  & p->pgno!=pgno 
4200: 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  ){.    p = p->pN
4210: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72  extHash;.  }.  r
4220: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
4230: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
4240: 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20  abase and clear 
4250: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
4260: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
4270: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
4280: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
4290: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
42a0: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
42b0: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
42c0: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
42d0: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
42e0: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
42f0: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
4300: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
4310: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
4320: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
4330: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
4340: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
4350: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
4360: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
4370: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
4380: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
4390: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
43a0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
43b0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
43c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
43d0: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61  (pPg);.  }.  pPa
43e0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
43f0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
4400: 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70  tSynced = 0;.  p
4410: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
4420: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  ;.  pPager->pAll
4430: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70   = 0;.  memset(p
4440: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
4450: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
4460: 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65  aHash));.  pPage
4470: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
4480: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
4490: 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e>=SQLITE_WRITEL
44a0: 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  OCK ){.    sqlit
44b0: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
44c0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
44d0: 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26  sqliteOsUnlock(&
44e0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 70  pPager->fd);.  p
44f0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53  Pager->state = S
4500: 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  QLITE_UNLOCK;.  
4510: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
4520: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e   -1;.  pPager->n
4530: 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Ref = 0;.  asser
4540: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
4550: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a  alOpen==0 );.}..
4560: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
4570: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4580: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
4590: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
45a0: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
45b0: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
45c0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
45d0: 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65 61 73  s routine releas
45e0: 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
45f0: 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 61 6e  ** write lock an
4600: 64 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  d acquires a rea
4610: 64 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  d lock in its pl
4620: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
4630: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 64 65 6c  l file.** is del
4640: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
4650: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
4660: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
4670: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
4680: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
4690: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
46a0: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
46b0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
46c0: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
46d0: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
46e0: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
46f0: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
4700: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
4710: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
4720: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
4730: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
4740: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
4750: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
4760: 61 74 65 3c 53 51 4c 49 54 45 5f 57 52 49 54 45  ate<SQLITE_WRITE
4770: 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e 20 53 51  LOCK ) return SQ
4780: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
4790: 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
47a0: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
47b0: 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4f  f( pPager->ckptO
47c0: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
47d0: 65 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  eOsClose(&pPager
47e0: 2d 3e 63 70 66 64 29 3b 0a 20 20 20 20 70 50 61  ->cpfd);.    pPa
47f0: 67 65 72 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20  ger->ckptOpen = 
4800: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
4810: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
4820: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73   ){.    sqliteOs
4830: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
4840: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
4850: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
4860: 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 44 65  ;.    sqliteOsDe
4870: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
4880: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
4890: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
48a0: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
48b0: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
48c0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
48d0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
48e0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
48f0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
4900: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
4910: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
4920: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
4930: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
4940: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
4950: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
4960: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69   pPager->dirtyFi
4970: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4980: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
4990: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
49a0: 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70  iteOsReadLock(&p
49b0: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 69 66  Pager->fd);.  if
49c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
49d0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
49e0: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52 45  tate = SQLITE_RE
49f0: 41 44 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ADLOCK;.  }else{
4a00: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6e  .    /* This can
4a10: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
4a20: 61 20 70 72 6f 63 65 73 73 20 64 6f 65 73 20 61  a process does a
4a30: 20 42 45 47 49 4e 2c 20 74 68 65 6e 20 66 6f 72   BEGIN, then for
4a40: 6b 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ks and the.    *
4a50: 2a 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20  * child process 
4a60: 64 6f 65 73 20 74 68 65 20 43 4f 4d 4d 49 54 2e  does the COMMIT.
4a70: 20 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65    Because of the
4a80: 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 75 6e   semantics of un
4a90: 69 78 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6c  ix.    ** file l
4aa0: 6f 63 6b 69 6e 67 2c 20 74 68 65 20 75 6e 6c 6f  ocking, the unlo
4ab0: 63 6b 20 77 69 6c 6c 20 66 61 69 6c 2e 0a 20 20  ck will fail..  
4ac0: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
4ad0: 3e 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  >state = SQLITE_
4ae0: 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65  UNLOCK;.  }.  re
4af0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4b00: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
4b10: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
4b20: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
4b30: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
4b40: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
4b50: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
4b60: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
4b70: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
4b80: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
4b90: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
4ba0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 63 6f 6e   number.  We con
4bb0: 73 69 64 65 72 65 64 20 64 6f 20 61 20 63 68 65  sidered do a che
4bc0: 63 6b 73 75 6d 0a 2a 2a 20 6f 66 20 74 68 65 20  cksum.** of the 
4bd0: 64 61 74 61 62 61 73 65 2c 20 62 75 74 20 74 68  database, but th
4be0: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
4bf0: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2f 0a  be too slow..*/.
4c00: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
4c10: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
4c20: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
4c30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61   const char *aDa
4c40: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
4c50: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
4c60: 49 6e 69 74 20 2b 20 70 67 6e 6f 3b 0a 20 20 72  Init + pgno;.  r
4c70: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
4c80: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
4c90: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
4ca0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
4cb0: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
4cc0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
4cd0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
4ce0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
4cf0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
4d00: 64 69 66 66 65 72 65 6e 74 20 6a 6f 75 72 6e 61  different journa
4d10: 6c 20 66 6f 72 6d 61 74 73 2e 20 20 54 68 65 20  l formats.  The 
4d20: 66 6f 72 6d 61 74 20 70 61 72 61 6d 65 74 65 72  format parameter
4d30: 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77   determines.** w
4d40: 68 69 63 68 20 66 6f 72 6d 61 74 20 69 73 20 75  hich format is u
4d50: 73 65 64 20 62 79 20 74 68 65 20 6a 6f 75 72 6e  sed by the journ
4d60: 61 6c 20 74 68 61 74 20 69 73 20 70 6c 61 79 65  al that is playe
4d70: 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
4d80: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
4d90: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61  back_one_page(Pa
4da0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46  ger *pPager, OsF
4db0: 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 66 6f  ile *jfd, int fo
4dc0: 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rmat){.  int rc;
4dd0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4df0: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
4e00: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
4e10: 20 20 50 61 67 65 52 65 63 6f 72 64 20 70 67 52    PageRecord pgR
4e20: 65 63 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  ec;.  u32 cksum;
4e30: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
4e40: 69 74 73 28 66 6f 72 6d 61 74 2c 20 6a 66 64 2c  its(format, jfd,
4e50: 20 26 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20   &pgRec.pgno);. 
4e60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4e70: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
4e80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 52    rc = sqliteOsR
4e90: 65 61 64 28 6a 66 64 2c 20 26 70 67 52 65 63 2e  ead(jfd, &pgRec.
4ea0: 61 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 70 67  aData, sizeof(pg
4eb0: 52 65 63 2e 61 44 61 74 61 29 29 3b 0a 20 20 69  Rec.aData));.  i
4ec0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4ed0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
4ee0: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
4ef0: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
4f00: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
4f10: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
4f20: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
4f30: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
4f40: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
4f50: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
4f60: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
4f70: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
4f80: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
4f90: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
4fa0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fb0: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
4fc0: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
4fd0: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
4fe0: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
4ff0: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
5000: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
5010: 20 69 66 28 20 70 67 52 65 63 2e 70 67 6e 6f 3d   if( pgRec.pgno=
5020: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5030: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
5040: 7d 0a 20 20 69 66 28 20 70 67 52 65 63 2e 70 67  }.  if( pgRec.pg
5050: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
5060: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
5070: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5080: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  _OK;.  }.  if( f
5090: 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46  ormat>=JOURNAL_F
50a0: 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 72  ORMAT_3 ){.    r
50b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66  c = read32bits(f
50c0: 6f 72 6d 61 74 2c 20 6a 66 64 2c 20 26 63 6b 73  ormat, jfd, &cks
50d0: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
50e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
50f0: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
5100: 28 70 50 61 67 65 72 2c 20 70 67 52 65 63 2e 70  (pPager, pgRec.p
5110: 67 6e 6f 2c 20 70 67 52 65 63 2e 61 44 61 74 61  gno, pgRec.aData
5120: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
5130: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5140: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
5150: 0a 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 74  .  /* Playback t
5160: 68 65 20 70 61 67 65 2e 20 20 55 70 64 61 74 65  he page.  Update
5170: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
5180: 6f 70 79 20 6f 66 20 74 68 65 20 70 61 67 65 0a  opy of the page.
5190: 20 20 2a 2a 20 61 74 20 74 68 65 20 73 61 6d 65    ** at the same
51a0: 20 74 69 6d 65 2c 20 69 66 20 74 68 65 72 65 20   time, if there 
51b0: 69 73 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 70  is one..  */.  p
51c0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
51d0: 70 28 70 50 61 67 65 72 2c 20 70 67 52 65 63 2e  p(pPager, pgRec.
51e0: 70 67 6e 6f 29 3b 0a 20 20 54 52 41 43 45 32 28  pgno);.  TRACE2(
51f0: 22 50 4c 41 59 42 41 43 4b 20 25 64 5c 6e 22 2c  "PLAYBACK %d\n",
5200: 20 70 67 52 65 63 2e 70 67 6e 6f 29 3b 0a 20 20   pgRec.pgno);.  
5210: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
5220: 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 52 65 63  ager->fd, (pgRec
5230: 2e 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29  .pgno-1)*(off_t)
5240: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
5250: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
5260: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
5270: 3e 66 64 2c 20 70 67 52 65 63 2e 61 44 61 74 61  >fd, pgRec.aData
5280: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
5290: 5a 45 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  ZE);.  if( pPg )
52a0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
52b0: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
52c0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
52d0: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
52e0: 70 74 20 66 6f 72 20 70 61 67 65 0a 20 20 20 20  pt for page.    
52f0: 2a 2a 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ** 1 which is he
5300: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
5310: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
5320: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
5330: 61 73 65 0a 20 20 20 20 2a 2a 20 61 63 74 69 76  ase.    ** activ
5340: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
5350: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
5360: 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d  =0 || pPg->pgno=
5370: 3d 31 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  =1 );.    memcpy
5380: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
5390: 50 67 29 2c 20 70 67 52 65 63 2e 61 44 61 74 61  Pg), pgRec.aData
53a0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
53b0: 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ZE);.    if( pPa
53c0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
53d0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
53e0: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 50 47  ->xDestructor(PG
53f0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
5400: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  );.    }.    pPg
5410: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
5420: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
5430: 20 30 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50   0;.    CODEC(pP
5440: 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
5450: 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
5460: 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72  gno, 3);.  }.  r
5470: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5480: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
5490: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
54a0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
54b0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
54c0: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
54d0: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
54e0: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
54f0: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
5500: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5510: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
5520: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 20  lows: .**.**    
5530: 2a 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  *  8 byte prefix
5540: 2e 20 20 4f 6e 65 20 6f 66 20 74 68 65 20 61 4a  .  One of the aJ
5550: 6f 75 72 6e 61 6c 4d 61 67 69 63 31 32 33 20 76  ournalMagic123 v
5560: 65 63 74 6f 72 73 20 64 65 66 69 6e 65 64 0a 2a  ectors defined.*
5570: 2a 20 20 20 20 20 20 20 61 62 6f 76 65 2e 20 20  *       above.  
5580: 54 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  The format of th
5590: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
55a0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
55b0: 77 68 69 63 68 0a 2a 2a 20 20 20 20 20 20 20 6f  which.**       o
55c0: 66 20 74 68 65 20 74 68 72 65 65 20 70 72 65 66  f the three pref
55d0: 69 78 20 76 65 63 74 6f 72 73 20 69 73 20 73 65  ix vectors is se
55e0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 20 34 20 62  en..**    *  4 b
55f0: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
5600: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
5610: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
5620: 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
5630: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
5640: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
5650: 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
5660: 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
5670: 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
5680: 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
5690: 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
56a0: 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 20  e journal size. 
56b0: 20 54 68 69 73 20 66 69 65 6c 64 20 61 70 70 65   This field appe
56c0: 61 72 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  ars.**       in 
56d0: 66 6f 72 6d 61 74 20 33 20 6f 6e 6c 79 2e 0a 2a  format 3 only..*
56e0: 2a 20 20 20 20 2a 20 20 34 20 62 79 74 65 20 62  *    *  4 byte b
56f0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
5700: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
5710: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
5720: 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
5730: 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 20  anity checksum. 
5740: 20 54 68 69 73 20 66 69 65 6c 64 20 61 70 70 65   This field appe
5750: 61 72 73 20 69 6e 20 66 6f 72 6d 61 74 20 33 20  ars in format 3 
5760: 6f 6e 6c 79 2e 0a 2a 2a 20 20 20 20 2a 20 20 34  only..**    *  4
5770: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
5780: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
5790: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
57a0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
57b0: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
57c0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
57d0: 6b 2e 0a 2a 2a 20 20 20 20 2a 20 20 5a 65 72 6f  k..**    *  Zero
57e0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
57f0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
5800: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
5810: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
5820: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
5830: 20 20 20 20 20 20 2b 20 20 53 51 4c 49 54 45 5f        +  SQLITE_
5840: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
5850: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
5860: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
5870: 63 6b 73 75 6d 20 28 66 6f 72 6d 61 74 20 33 20  cksum (format 3 
5880: 6f 6e 6c 79 29 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  only).**.** When
5890: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
58a0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
58b0: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
58c0: 73 74 20 34 20 62 75 6c 6c 65 74 73 20 61 62 6f  st 4 bullets abo
58d0: 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
58e0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
58f0: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5900: 6f 66 20 74 68 65 20 35 74 68 20 62 75 6c 6c 65  of the 5th bulle
5910: 74 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 2a 2a  t.  Note that.**
5920: 20 62 75 6c 6c 65 74 73 20 32 20 61 6e 64 20 33   bullets 2 and 3
5930: 20 6f 6e 6c 79 20 61 70 70 65 61 72 20 69 6e 20   only appear in 
5940: 66 6f 72 6d 61 74 2d 33 20 6a 6f 75 72 6e 61 6c  format-3 journal
5950: 73 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  s..**.** Call th
5960: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
5970: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
5980: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
5990: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
59a0: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
59b0: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
59c0: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
59d0: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
59e0: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
59f0: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
5a00: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
5a10: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
5a20: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
5a30: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
5a40: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
5a50: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
5a60: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
5a70: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
5a80: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
5a90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
5aa0: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
5ab0: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
5ac0: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
5ad0: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
5ae0: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
5af0: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
5b00: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
5b10: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
5b20: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
5b30: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
5b40: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
5b50: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
5b60: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
5b70: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
5b80: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
5b90: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
5ba0: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
5bb0: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
5bc0: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
5bd0: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
5be0: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
5bf0: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
5c00: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
5c10: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
5c20: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
5c30: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
5c40: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
5c50: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
5c60: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
5c70: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
5c80: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
5c90: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
5ca0: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
5cb0: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
5cc0: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
5cd0: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
5ce0: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 4a   care.  .**.** J
5cf0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 73 20 31  ournal formats 1
5d00: 20 61 6e 64 20 32 20 64 6f 20 6e 6f 74 20 68 61   and 2 do not ha
5d10: 76 65 20 61 6e 20 6e 52 65 63 20 76 61 6c 75 65  ve an nRec value
5d20: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 73   in the header s
5d30: 6f 20 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20  o we.** have to 
5d40: 63 6f 6d 70 75 74 65 20 6e 52 65 63 20 66 72 6f  compute nRec fro
5d50: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
5d60: 20 20 54 68 69 73 20 68 61 73 20 72 69 73 6b 73    This has risks
5d70: 20 28 61 73 20 64 65 73 63 72 69 62 65 64 0a 2a   (as described.*
5d80: 2a 20 61 62 6f 76 65 29 20 77 68 69 63 68 20 69  * above) which i
5d90: 73 20 77 68 79 20 61 6c 6c 20 70 65 72 73 69 73  s why all persis
5da0: 74 65 6e 74 20 74 61 62 6c 65 73 20 68 61 76 65  tent tables have
5db0: 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 74 6f   been changed to
5dc0: 20 75 73 65 0a 2a 2a 20 66 6f 72 6d 61 74 20 33   use.** format 3
5dd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
5de0: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
5df0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5e00: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
5e10: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
5e20: 69 6c 65 20 74 68 65 6e 20 74 68 65 20 64 61 74  ile then the dat
5e30: 61 62 61 73 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  abase will likel
5e40: 79 20 61 6c 72 65 61 64 79 20 62 65 0a 2a 2a 20  y already be.** 
5e50: 63 6f 72 72 75 70 74 65 64 2c 20 73 6f 20 74 68  corrupted, so th
5e60: 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  e PAGER_ERR_CORR
5e70: 55 50 54 20 62 69 74 20 69 73 20 73 65 74 20 69  UPT bit is set i
5e80: 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  n pPager->errMas
5e90: 6b 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  k.** and SQLITE_
5ea0: 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
5eb0: 6e 65 64 2e 20 20 49 66 20 69 74 20 61 6c 6c 20  ned.  If it all 
5ec0: 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74 68 69 73  works, then this
5ed0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
5ee0: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
5ef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
5f00: 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
5f10: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 75  r *pPager, int u
5f20: 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65 29 7b 0a  seJournalSize){.
5f30: 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20    off_t szJ;    
5f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
5f50: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
5f60: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
5f70: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f90: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
5fa0: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
5fb0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fd0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
5fe0: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
5ff0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
6000: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
6010: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
6020: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6f 72  ges */.  int for
6030: 6d 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mat;            
6040: 20 20 2f 2a 20 46 6f 72 6d 61 74 20 6f 66 20 74    /* Format of t
6050: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
6060: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
6070: 68 61 72 20 61 4d 61 67 69 63 5b 73 69 7a 65 6f  har aMagic[sizeo
6080: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  f(aJournalMagic1
6090: 29 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  )];.  int rc;.. 
60a0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
60b0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
60c0: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
60d0: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
60e0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
60f0: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
6100: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
6110: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
6120: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53  n );.  sqliteOsS
6130: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
6140: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
6150: 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  iteOsFileSize(&p
6160: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
6170: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6180: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
6190: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
61a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
61b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
61c0: 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63  s too small to c
61d0: 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74  ontain a complet
61e0: 65 20 68 65 61 64 65 72 2c 0a 20 20 2a 2a 20 69  e header,.  ** i
61f0: 74 20 6d 75 73 74 20 6d 65 61 6e 20 74 68 61 74  t must mean that
6200: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
6210: 74 20 63 72 65 61 74 65 64 20 74 68 65 20 6a 6f  t created the jo
6220: 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 0a 20  urnal was just. 
6230: 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f   ** beginning to
6240: 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e   write the journ
6250: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  al file when it 
6260: 64 69 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63  died.  In that c
6270: 61 73 65 2c 0a 20 20 2a 2a 20 74 68 65 20 64 61  ase,.  ** the da
6280: 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
6290: 6c 64 20 68 61 76 65 20 73 74 69 6c 6c 20 62 65  ld have still be
62a0: 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  en completely un
62b0: 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e 6f  changed..  ** No
62c0: 74 68 69 6e 67 20 6e 65 65 64 73 20 74 6f 20 62  thing needs to b
62d0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
62e0: 57 65 20 63 61 6e 20 73 61 66 65 6c 79 20 69 67  We can safely ig
62f0: 6e 6f 72 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  nore this journa
6300: 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a  l..  */.  if( sz
6310: 4a 20 3c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  J < sizeof(aMagi
6320: 63 29 2b 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20  c)+sizeof(Pgno) 
6330: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
6340: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
6350: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 62 65 67   /* Read the beg
6360: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  inning of the jo
6370: 75 72 6e 61 6c 20 61 6e 64 20 74 72 75 6e 63 61  urnal and trunca
6380: 74 65 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  te the.  ** data
6390: 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
63a0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
63b0: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ize..  */.  rc =
63c0: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70   sqliteOsRead(&p
63d0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
63e0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
63f0: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  c));.  if( rc!=S
6400: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6410: 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54  rc = SQLITE_PROT
6420: 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f 20 65  OCOL;.    goto e
6430: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
6440: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
6450: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
6460: 67 69 63 33 2c 20 73 69 7a 65 6f 66 28 61 4d 61  gic3, sizeof(aMa
6470: 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  gic))==0 ){.    
6480: 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c  format = JOURNAL
6490: 5f 46 4f 52 4d 41 54 5f 33 3b 0a 20 20 7d 65 6c  _FORMAT_3;.  }el
64a0: 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  se if( memcmp(aM
64b0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
64c0: 67 69 63 32 2c 20 73 69 7a 65 6f 66 28 61 4d 61  gic2, sizeof(aMa
64d0: 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  gic))==0 ){.    
64e0: 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c  format = JOURNAL
64f0: 5f 46 4f 52 4d 41 54 5f 32 3b 0a 20 20 7d 65 6c  _FORMAT_2;.  }el
6500: 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  se if( memcmp(aM
6510: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
6520: 67 69 63 31 2c 20 73 69 7a 65 6f 66 28 61 4d 61  gic1, sizeof(aMa
6530: 67 69 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  gic))==0 ){.    
6540: 66 6f 72 6d 61 74 20 3d 20 4a 4f 55 52 4e 41 4c  format = JOURNAL
6550: 5f 46 4f 52 4d 41 54 5f 31 3b 0a 20 20 7d 65 6c  _FORMAT_1;.  }el
6560: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
6570: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
6580: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
6590: 61 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  ack;.  }.  if( f
65a0: 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46  ormat>=JOURNAL_F
65b0: 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 69  ORMAT_3 ){.    i
65c0: 66 28 20 73 7a 4a 20 3c 20 73 69 7a 65 6f 66 28  f( szJ < sizeof(
65d0: 61 4d 61 67 69 63 29 20 2b 20 33 2a 73 69 7a 65  aMagic) + 3*size
65e0: 6f 66 28 75 33 32 29 20 29 7b 0a 20 20 20 20 20  of(u32) ){.     
65f0: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 6a   /* Ignore the j
6600: 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
6610: 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 63 6f 6e  too small to con
6620: 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65 0a  tain a complete.
6630: 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 2e        ** header.
6640: 20 20 57 65 20 61 6c 72 65 61 64 79 20 64 69 64    We already did
6650: 20 74 68 69 73 20 74 65 73 74 20 6f 6e 63 65 20   this test once 
6660: 61 62 6f 76 65 2c 20 62 75 74 20 61 74 20 74 68  above, but at th
6670: 65 20 70 72 69 6f 72 0a 20 20 20 20 20 20 2a 2a  e prior.      **
6680: 20 74 65 73 74 2c 20 77 65 20 64 69 64 20 6e 6f   test, we did no
6690: 74 20 6b 6e 6f 77 20 74 68 65 20 6a 6f 75 72 6e  t know the journ
66a0: 61 6c 20 66 6f 72 6d 61 74 20 61 6e 64 20 73 6f  al format and so
66b0: 20 77 65 20 68 61 64 20 74 6f 20 61 73 73 75 6d   we had to assum
66c0: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  e.      ** the s
66d0: 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
66e0: 20 68 65 61 64 65 72 2e 20 20 4e 6f 77 20 77 65   header.  Now we
66f0: 20 6b 6e 6f 77 20 74 68 65 20 68 65 61 64 65 72   know the header
6700: 20 69 73 20 62 69 67 67 65 72 0a 20 20 20 20 20   is bigger.     
6710: 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 6d 69 6e   ** than the min
6720: 69 6d 75 6d 20 73 6f 20 77 65 20 74 65 73 74 20  imum so we test 
6730: 61 67 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  again..      */.
6740: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
6750: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
6760: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
6770: 74 73 28 66 6f 72 6d 61 74 2c 20 26 70 50 61 67  ts(format, &pPag
6780: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 2a 29 26  er->jfd, (u32*)&
6790: 6e 52 65 63 29 3b 0a 20 20 20 20 69 66 28 20 72  nRec);.    if( r
67a0: 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61  c ) goto end_pla
67b0: 79 62 61 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20  yback;.    rc = 
67c0: 72 65 61 64 33 32 62 69 74 73 28 66 6f 72 6d 61  read32bits(forma
67d0: 74 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  t, &pPager->jfd,
67e0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
67f0: 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
6800: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
6810: 62 61 63 6b 3b 0a 20 20 20 20 69 66 28 20 6e 52  back;.    if( nR
6820: 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 7c  ec==0xffffffff |
6830: 7c 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65  | useJournalSize
6840: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
6850: 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f   (szJ - JOURNAL_
6860: 48 44 52 5f 53 5a 28 33 29 29 2f 4a 4f 55 52 4e  HDR_SZ(3))/JOURN
6870: 41 4c 5f 50 47 5f 53 5a 28 33 29 3b 0a 20 20 20  AL_PG_SZ(3);.   
6880: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6890: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f  nRec = (szJ - JO
68a0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 32 29 29  URNAL_HDR_SZ(2))
68b0: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 32  /JOURNAL_PG_SZ(2
68c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
68d0: 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  Rec*JOURNAL_PG_S
68e0: 5a 28 32 29 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  Z(2)+JOURNAL_HDR
68f0: 5f 53 5a 28 32 29 3d 3d 73 7a 4a 20 29 3b 0a 20  _SZ(2)==szJ );. 
6900: 20 7d 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32   }.  rc = read32
6910: 62 69 74 73 28 66 6f 72 6d 61 74 2c 20 26 70 50  bits(format, &pP
6920: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6d 78 50 67  ager->jfd, &mxPg
6930: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6940: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
6950: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
6960: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
6970: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
6980: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
6990: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67  origDbSize==mxPg
69a0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
69b0: 65 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  eOsTruncate(&pPa
69c0: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
69d0: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
69e0: 29 6d 78 50 67 29 3b 0a 20 20 69 66 28 20 72 63  )mxPg);.  if( rc
69f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6a00: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
6a10: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
6a20: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
6a30: 67 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  g;.  .  /* Copy 
6a40: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
6a50: 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
6a60: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
6a70: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6a80: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
6a90: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
6aa0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
6ab0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
6ac0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
6ad0: 72 2d 3e 6a 66 64 2c 20 66 6f 72 6d 61 74 29 3b  r->jfd, format);
6ae0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
6af0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6b00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
6b10: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
6b20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6b30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6b40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
6b50: 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74 20 68   /* Pages that h
6b60: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
6b70: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
6b80: 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63 65 64  but never synced
6b90: 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f 74 20  .  ** where not 
6ba0: 72 65 73 74 6f 72 65 64 20 62 79 20 74 68 65 20  restored by the 
6bb0: 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57 65 20  loop above.  We 
6bc0: 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72 65 20  have to restore 
6bd0: 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  those.  ** pages
6be0: 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 6d   by reading them
6bf0: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6f   back from the o
6c00: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
6c10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
6c20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6c30: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
6c40: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
6c50: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
6c60: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
6c70: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66  .      char zBuf
6c80: 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  [SQLITE_PAGE_SIZ
6c90: 45 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  E];.      if( !p
6ca0: 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74  Pg->dirty ) cont
6cb0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
6cc0: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
6cd0: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
6ce0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
6cf0: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
6d00: 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
6d10: 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f  _PAGE_SIZE*(off_
6d20: 74 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29  t)(pPg->pgno-1))
6d30: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
6d40: 71 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50 61  qliteOsRead(&pPa
6d50: 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 53  ger->fd, zBuf, S
6d60: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
6d70: 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 32  ;.        TRACE2
6d80: 28 22 52 45 46 45 54 43 48 20 25 64 5c 6e 22 2c  ("REFETCH %d\n",
6d90: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
6da0: 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
6db0: 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67  r, zBuf, pPg->pg
6dc0: 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  no, 2);.        
6dd0: 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
6de0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6df0: 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66       memset(zBuf
6e00: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  , 0, SQLITE_PAGE
6e10: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 7d 0a  _SIZE);.      }.
6e20: 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e        if( pPg->n
6e30: 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  Ref==0 || memcmp
6e40: 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f  (zBuf, PGHDR_TO_
6e50: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
6e60: 45 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 7b 0a  E_PAGE_SIZE) ){.
6e70: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
6e80: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
6e90: 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54 45 5f  ), zBuf, SQLITE_
6ea0: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
6eb0: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
6ec0: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20  _TO_EXTRA(pPg), 
6ed0: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
6ee0: 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
6ef0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
6f00: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
6f10: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d  dirty = 0;.    }
6f20: 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  .  }..end_playba
6f30: 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ck:.  if( rc!=SQ
6f40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
6f50: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
6f60: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
6f70: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
6f80: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
6f90: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
6fa0: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ITE_CORRUPT;.  }
6fb0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
6fc0: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
6fd0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
6fe0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6ff0: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
7000: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   checkpoint jour
7010: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
7020: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c  is similar to pl
7030: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74  aying back the t
7040: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
7050: 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61  al but with.** a
7060: 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74   few extra twist
7070: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
7080: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
7090: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
70a0: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
70b0: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20   start of.**    
70c0: 20 20 20 20 20 74 68 65 20 63 68 65 63 6b 70 6f       the checkpo
70d0: 69 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  int is stored in
70e0: 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a   pPager->ckptSiz
70f0: 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
7100: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
7110: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
7120: 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
7130: 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
7140: 6e 67 20 62 61 63 6b 20 74 68 65 20 63 68 65 63  ng back the chec
7150: 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  kpoint journal, 
7160: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
7170: 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
7180: 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
7190: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
71a0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
71b0: 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
71c0: 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a 65 2e 0a  ger->ckptJSize..
71d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
71e0: 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
71f0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
7200: 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20  {.  off_t szJ;  
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7220: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
7230: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
7240: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7250: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7260: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
7270: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
7280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
7290: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
72a0: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 72 75  nt rc;..  /* Tru
72b0: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
72c0: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
72d0: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
72e0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
72f0: 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
7300: 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50  er->fd, SQLITE_P
7310: 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29  AGE_SIZE*(off_t)
7320: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
7330: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
7340: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  ize = pPager->ck
7350: 70 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69  ptSize;..  /* Fi
7360: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
7370: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
7380: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
7390: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
73a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
73b0: 63 6b 70 74 49 6e 55 73 65 20 26 26 20 70 50 61  ckptInUse && pPa
73c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
73d0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 53 65   );.  sqliteOsSe
73e0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64  ek(&pPager->cpfd
73f0: 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  , 0);.  nRec = p
7400: 50 61 67 65 72 2d 3e 63 6b 70 74 4e 52 65 63 3b  Pager->ckptNRec;
7410: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
7420: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
7430: 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
7440: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
7450: 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
7460: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
7470: 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
7480: 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  checkpoint journ
7490: 61 6c 20 61 6c 77 61 79 73 20 75 73 65 73 20 66  al always uses f
74a0: 6f 72 6d 61 74 0a 20 20 2a 2a 20 32 20 69 6e 73  ormat.  ** 2 ins
74b0: 74 65 61 64 20 6f 66 20 66 6f 72 6d 61 74 20 33  tead of format 3
74c0: 20 73 69 6e 63 65 20 69 74 20 64 6f 65 73 20 6e   since it does n
74d0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ot need to be co
74e0: 6e 63 65 72 6e 65 64 20 77 69 74 68 0a 20 20 2a  ncerned with.  *
74f0: 2a 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  * power failures
7500: 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
7510: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 63 61 6e 20  journal and can 
7520: 74 68 75 73 20 6f 6d 69 74 20 74 68 65 20 63 68  thus omit the ch
7530: 65 63 6b 73 75 6d 73 2e 0a 20 20 2a 2f 0a 20 20  ecksums..  */.  
7540: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
7550: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63  =0; i--){.    rc
7560: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
7570: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
7580: 72 2c 20 26 70 50 61 67 65 72 2d 3e 63 70 66 64  r, &pPager->cpfd
7590: 2c 20 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 2);.    assert
75a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
75b0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
75c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
75d0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
75e0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ack;.  }..  /* F
75f0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
7600: 6e 79 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ny pages need to
7610: 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 6f   be copied out o
7620: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
7630: 6e 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a  n.  ** journal..
7640: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
7650: 74 65 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  teOsSeek(&pPager
7660: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63  ->jfd, pPager->c
7670: 6b 70 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  kptJSize);.  if(
7680: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7690: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  {.    goto end_s
76a0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
76b0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f  }.  rc = sqliteO
76c0: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
76d0: 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
76e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
76f0: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
7700: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
7710: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28  ;.  }.  nRec = (
7720: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 63 6b  szJ - pPager->ck
7730: 70 74 4a 53 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c  ptJSize)/JOURNAL
7740: 5f 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66  _PG_SZ(journal_f
7750: 6f 72 6d 61 74 29 3b 0a 20 20 66 6f 72 28 69 3d  ormat);.  for(i=
7760: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
7770: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
7780: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
7790: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
77a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 6f 75 72 6e  ager->jfd, journ
77b0: 61 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20  al_format);.    
77c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
77d0: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
77e0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
77f0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
7800: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
7810: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
7820: 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
7830: 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ck:.  if( rc!=SQ
7840: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
7850: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
7860: 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
7870: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
7880: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
7890: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
78a0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
78b0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
78c0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
78d0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
78e0: 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lowed..**.** The
78f0: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
7900: 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20  is the absolute 
7910: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 78 50  value of the mxP
7920: 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  age parameter..*
7930: 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e  * If mxPage is n
7940: 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e 6f 53  egative, the noS
7950: 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  ync flag is also
7960: 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79   set.  noSync by
7970: 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20  passes.** calls 
7980: 74 6f 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28  to sqliteOsSync(
7990: 29 2e 20 20 54 68 65 20 70 61 67 65 72 20 72 75  ).  The pager ru
79a0: 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 77  ns much faster w
79b0: 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a  ith noSync on,.*
79c0: 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f 70 65  * but if the ope
79d0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
79e0: 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
79f0: 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  s an abrupt powe
7a00: 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74  r .** failure, t
7a10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7a20: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
7a30: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
7a40: 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69  t and.** unrepai
7a50: 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a  rable state.  .*
7a60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
7a70: 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a  ger_set_cachesiz
7a80: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
7a90: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
7aa0: 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b  if( mxPage>=0 ){
7ab0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
7ac0: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
7ad0: 6d 70 46 69 6c 65 3b 0a 20 20 20 20 69 66 28 20  mpFile;.    if( 
7ae0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
7af0: 30 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  0 ) pPager->need
7b00: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
7b10: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  e{.    pPager->n
7b20: 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d  oSync = 1;.    m
7b30: 78 50 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b  xPage = -mxPage;
7b40: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67  .  }.  if( mxPag
7b50: 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
7b60: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
7b70: 61 67 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  age;.  }.}../*.*
7b80: 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
7b90: 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
7ba0: 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
7bb0: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
7bc0: 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
7bd0: 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
7be0: 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
7bf0: 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
7c00: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
7c10: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
7c20: 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
7c30: 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
7c40: 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
7c50: 6c 69 74 65 4f 73 53 79 6e 63 28 29 20 69 73 20  liteOsSync() is 
7c60: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
7c70: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
7c80: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
7c90: 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
7ca0: 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
7cb0: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
7cc0: 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
7cd0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
7ce0: 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
7cf0: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
7d00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
7d10: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
7d20: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
7d30: 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
7d40: 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
7d50: 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
7d60: 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
7d70: 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
7d80: 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
7d90: 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
7da0: 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
7db0: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
7dc0: 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
7dd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7de0: 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
7df0: 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
7e00: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
7e10: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
7e20: 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
7e30: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
7e40: 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
7e50: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
7e60: 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
7e70: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
7e80: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
7e90: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
7ea0: 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
7eb0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
7ec0: 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
7ed0: 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
7ee0: 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
7ef0: 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
7f00: 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
7f10: 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
7f30: 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
7f40: 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
7f50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7f60: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
7f70: 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
7f80: 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
7f90: 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
7fa0: 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
7fb0: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
7fc0: 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
7fd0: 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
7fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
7ff0: 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
8000: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
8010: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
8020: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
8030: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
8040: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
8050: 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
8060: 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
8070: 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
8080: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
8090: 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c  ger_set_safety_l
80a0: 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
80b0: 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a  er, int level){.
80c0: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
80d0: 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
80e0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
80f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
8100: 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
8110: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
8120: 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
8130: 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 20  er->noSync==0 ) 
8140: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
8150: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f   = 0;.}../*.** O
8160: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
8170: 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
8180: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
8190: 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20  e into zName.** 
81a0: 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61  (zName must be a
81b0: 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54  t least SQLITE_T
81c0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74  EMPNAME_SIZE byt
81d0: 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65  es long.)  Write
81e0: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
81f0: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
8200: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
8210: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
8220: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
8230: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
8240: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   fail..**.** The
8250: 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
8260: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
8270: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
8280: 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63   when it is.** c
8290: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
82a0: 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65   int sqlite3page
82b0: 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20  r_opentemp(char 
82c0: 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a  *zFile, OsFile *
82d0: 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  fd){.  int cnt =
82e0: 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   8;.  int rc;.  
82f0: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
8300: 20 20 20 73 71 6c 69 74 65 4f 73 54 65 6d 70 46     sqliteOsTempF
8310: 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a  ileName(zFile);.
8320: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
8330: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
8340: 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20  File, fd, 1);.  
8350: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
8360: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8370: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8380: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
8390: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
83a0: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
83b0: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
83c0: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
83d0: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
83e0: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
83f0: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
8400: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
8410: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
8420: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
8430: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
8440: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
8450: 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
8460: 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
8470: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
8480: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
8490: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
84a0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
84b0: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
84c0: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
84d0: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
84e0: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
84f0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
8500: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
8510: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
8520: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
8530: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
8540: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8550: 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20  e3pager_open(.  
8560: 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
8570: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8580: 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
8590: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
85a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
85b0: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
85c0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
85d0: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
85e0: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 2c 20  /.  int mxPage, 
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8600: 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  Max number of in
8610: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
8620: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ges */.  int nEx
8630: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
8640: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
8650: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
8660: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
8670: 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  /.  int useJourn
8680: 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
8690: 54 52 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f  TRUE to use a ro
86a0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
86b0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  n this file */.)
86c0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
86d0: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  r;.  char *zFull
86e0: 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Pathname;.  int 
86f0: 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c  nameLen;.  OsFil
8700: 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 2c 20  e fd;.  int rc, 
8710: 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
8720: 65 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  e;.  int readOnl
8730: 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54  y = 0;.  char zT
8740: 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
8750: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70  AME_SIZE];..  *p
8760: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66  pPager = 0;.  if
8770: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
8780: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  failed ){.    re
8790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
87a0: 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69  M;.  }.  if( zFi
87b0: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
87c0: 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 7a 46  ame[0] ){.    zF
87d0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
87e0: 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61  liteOsFullPathna
87f0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
8800: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
8810: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
8820: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
8830: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
8840: 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a    tempFile = 0;.
8850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
8860: 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  = sqlite3pager_o
8870: 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
8880: 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  fd);.    zFilena
8890: 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  me = zTemp;.    
88a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
88b0: 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68  sqliteOsFullPath
88c0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
88d0: 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
88e0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
88f0: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  ite_malloc_faile
8900: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
8910: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8920: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
8930: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
8940: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
8950: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
8960: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
8970: 45 4e 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65  EN;.  }.  nameLe
8980: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c  n = strlen(zFull
8990: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
89a0: 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ger = sqliteMall
89b0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67  oc( sizeof(*pPag
89c0: 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20  er) + nameLen*3 
89d0: 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50  + 30 );.  if( pP
89e0: 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ager==0 ){.    s
89f0: 71 6c 69 74 65 4f 73 43 6c 6f 73 65 28 26 66 64  qliteOsClose(&fd
8a00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
8a10: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
8a20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8a30: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
8a40: 20 53 45 54 5f 50 41 47 45 52 28 70 50 61 67 65   SET_PAGER(pPage
8a50: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  r);.  pPager->zF
8a60: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
8a70: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
8a80: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
8a90: 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
8aa0: 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31  lename[nameLen+1
8ab0: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
8ac0: 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
8ad0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65  >zDirectory[name
8ae0: 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  Len+1];.  strcpy
8af0: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
8b00: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
8b10: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  e);.  strcpy(pPa
8b20: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
8b30: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
8b40: 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e  .  for(i=nameLen
8b50: 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
8b60: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
8b70: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
8b80: 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
8b90: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
8ba0: 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28  ] = 0;.  strcpy(
8bb0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
8bc0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
8bd0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
8be0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
8bf0: 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d   strcpy(&pPager-
8c00: 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65  >zJournal[nameLe
8c10: 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b  n], "-journal");
8c20: 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
8c30: 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  fd;.  pPager->jo
8c40: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
8c50: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
8c60: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
8c70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  ;.  pPager->ckpt
8c80: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
8c90: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20 3d 20  er->ckptInUse = 
8ca0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
8cb0: 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
8cc0: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
8cd0: 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65  pPager->ckptSize
8ce0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8cf0: 63 6b 70 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20  ckptJSize = 0;. 
8d00: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
8d10: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   0;.  pPager->mx
8d20: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e 35 20  Page = mxPage>5 
8d30: 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a 20  ? mxPage : 10;. 
8d40: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
8d50: 20 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 3b 0a   SQLITE_UNLOCK;.
8d60: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
8d70: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
8d80: 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
8d90: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
8da0: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
8db0: 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nly;.  pPager->n
8dc0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
8dd0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
8de0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
8df0: 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
8e00: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
8e10: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
8e20: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
8e30: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
8e40: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
8e50: 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72  ->nExtra = nExtr
8e60: 61 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  a;.  memset(pPag
8e70: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
8e80: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
8e90: 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72  sh));.  *ppPager
8ea0: 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
8eb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8ec0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8ed0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
8ee0: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
8ef0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
8f00: 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
8f10: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
8f20: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
8f30: 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
8f40: 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
8f50: 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
8f60: 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
8f70: 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
8f80: 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
8f90: 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
8fa0: 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
8fb0: 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
8fc0: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
8fd0: 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
8fe0: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e  e3pager_close().
8ff0: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
9000: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
9010: 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65  d by sqlite3page
9020: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  r_unref()..*/.vo
9030: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
9040: 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50  set_destructor(P
9050: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
9060: 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64  id (*xDesc)(void
9070: 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  *)){.  pPager->x
9080: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
9090: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  sc;.}../*.** Ret
90a0: 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
90b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
90c0: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
90d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
90e0: 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  * pPager..*/.int
90f0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
9100: 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
9110: 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20  Pager){.  off_t 
9120: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
9130: 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
9140: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
9150: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9160: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
9170: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
9180: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
9190: 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c  er->fd, &n)!=SQL
91a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
91b0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
91c0: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b   PAGER_ERR_DISK;
91d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
91e0: 20 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45   }.  n /= SQLITE
91f0: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66  _PAGE_SIZE;.  if
9200: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
9210: 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29  =SQLITE_UNLOCK )
9220: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
9230: 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  Size = n;.  }.  
9240: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
9250: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
9260: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
9270: 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
9280: 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
9290: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
92a0: 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
92b0: 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
92c0: 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
92d0: 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
92e0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
92f0: 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
9300: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
9310: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29  ager->dbSize<0 )
9320: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
9330: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
9340: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
9350: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
9360: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
9370: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
9380: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
9390: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
93a0: 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
93b0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
93c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
93d0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 79  ITE_OK;.  }.  sy
93e0: 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
93f0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
9400: 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
9410: 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50  er->fd, SQLITE_P
9420: 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29  AGE_SIZE*(off_t)
9430: 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
9440: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9450: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
9460: 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20  e = nPage;.  }. 
9470: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9480: 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
9490: 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
94a0: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
94b0: 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
94c0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
94d0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
94e0: 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
94f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9500: 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
9510: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
9520: 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
9530: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
9540: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
9550: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
9560: 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
9570: 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
9580: 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
9590: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
95a0: 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
95b0: 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
95c0: 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
95d0: 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
95e0: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
95f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
9600: 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20  ger_close(Pager 
9610: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
9620: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
9630: 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72    switch( pPager
9640: 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63  ->state ){.    c
9650: 61 73 65 20 53 51 4c 49 54 45 5f 57 52 49 54 45  ase SQLITE_WRITE
9660: 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71  LOCK: {.      sq
9670: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
9680: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
9690: 20 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63     sqliteOsUnloc
96a0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  k(&pPager->fd);.
96b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
96c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
96d0: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  n==0 );.      br
96e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
96f0: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4c  ase SQLITE_READL
9700: 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  OCK: {.      sql
9710: 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  iteOsUnlock(&pPa
9720: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
9730: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9740: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
9750: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
9760: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
9770: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
9780: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
9790: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
97a0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
97b0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
97c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
97d0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f  );.  }.  sqliteO
97e0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
97f0: 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  fd);.  assert( p
9800: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
9810: 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65  en==0 );.  /* Te
9820: 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
9830: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
9840: 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
9850: 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
9860: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
9870: 20 73 71 6c 69 74 65 4f 73 44 65 6c 65 74 65 28   sqliteOsDelete(
9880: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
9890: 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
98a0: 20 20 43 4c 52 5f 50 41 47 45 52 28 70 50 61 67    CLR_PAGER(pPag
98b0: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
98c0: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28 63  r->zFilename!=(c
98d0: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 20  har*)&pPager[1] 
98e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  ){.    assert( 0
98f0: 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
9900: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c  appen */.    sql
9910: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
9920: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
9930: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
9940: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
9950: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
9960: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29  ger->zDirectory)
9970: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
9980: 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
9990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
99a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
99b0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
99c0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
99d0: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f  ge data..*/.Pgno
99e0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
99f0: 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70  genumber(void *p
9a00: 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
9a10: 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  p = DATA_TO_PGHD
9a20: 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
9a30: 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  rn p->pgno;.}../
9a40: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
9a50: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
9a60: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
9a70: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a  If the page is.*
9a80: 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  * currently on t
9a90: 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65  he freelist (the
9aa0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
9ab0: 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a   is zero) then.*
9ac0: 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * remove it from
9ad0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
9ae0: 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65 5f 72  /.#define page_r
9af0: 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
9b00: 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
9b10: 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
9b20: 65 66 2b 2b 29 0a 73 74 61 74 69 63 20 76 6f 69  ef++).static voi
9b30: 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64  d _page_ref(PgHd
9b40: 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
9b50: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
9b60: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69     /* The page i
9b70: 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
9b80: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
9b90: 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  move it. */.    
9ba0: 69 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50  if( pPg==pPg->pP
9bb0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
9bc0: 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ed ){.      PgHd
9bd0: 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
9be0: 74 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69  tFree;.      whi
9bf0: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
9c00: 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
9c10: 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
9c20: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
9c30: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
9c40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
9c50: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
9c60: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
9c70: 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
9c80: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
9c90: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
9ca0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
9cb0: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
9cc0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a  NextFree;.    }.
9cd0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
9ce0: 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  xtFree ){.      
9cf0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
9d00: 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
9d10: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
9d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
9d30: 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  ->pPager->pLast 
9d40: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
9d50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
9d60: 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b  >pPager->nRef++;
9d70: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66  .  }.  pPg->nRef
9d80: 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  ++;.  REFINFO(pP
9d90: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  g);.}../*.** Inc
9da0: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
9db0: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
9dc0: 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
9dd0: 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
9de0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
9df0: 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
9e00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
9e10: 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  r_ref(void *pDat
9e20: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
9e30: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
9e40: 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f  (pData);.  page_
9e50: 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
9e60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9e70: 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
9e80: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
9e90: 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
9ea0: 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
9eb0: 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
9ec0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
9ed0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
9ee0: 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
9ef0: 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
9f00: 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
9f10: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
9f20: 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
9f30: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
9f40: 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
9f50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
9f60: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
9f70: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
9f80: 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
9f90: 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
9fa0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
9fb0: 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
9fc0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
9fd0: 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
9fe0: 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
9ff0: 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
a000: 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
a010: 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
a020: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
a030: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
a040: 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
a050: 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
a060: 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
a070: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
a080: 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
a090: 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
a0a0: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
a0b0: 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
a0c0: 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
a0d0: 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
a0e0: 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
a0f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
a100: 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
a110: 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
a120: 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
a130: 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
a140: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
a150: 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
a160: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
a170: 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
a180: 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
a190: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
a1a0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
a1b0: 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
a1c0: 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
a1d0: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
a1e0: 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
a1f0: 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20  ailure, so sync 
a200: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
a210: 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
a220: 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  s the needSync f
a230: 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61  ield of every pa
a240: 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20  ge current held 
a250: 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  in.** memory..*/
a260: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
a270: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
a280: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
a290: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
a2a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
a2b0: 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
a2c0: 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
a2d0: 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
a2e0: 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
a2f0: 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
a300: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
a310: 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
a320: 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
a330: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
a340: 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
a350: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
a360: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
a380: 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73  n );.      /* as
a390: 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e  sert( !pPager->n
a3a0: 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79  oSync ); // noSy
a3b0: 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20  nc might be set 
a3c0: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  if synchronous. 
a3d0: 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e       ** was turn
a3e0: 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65  ed off after the
a3f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
a400: 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65   started.  Ticke
a410: 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65  t #615 */.#ifnde
a420: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b  f NDEBUG.      {
a430: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
a440: 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72   sure the pPager
a450: 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77  ->nRec counter w
a460: 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67  e are keeping ag
a470: 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  rees.        ** 
a480: 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f  with the nRec co
a490: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
a4a0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
a4b0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
a4c0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66    */.        off
a4d0: 5f 74 20 68 64 72 53 7a 2c 20 70 67 53 7a 2c 20  _t hdrSz, pgSz, 
a4e0: 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 68 64 72  jSz;.        hdr
a4f0: 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  Sz = JOURNAL_HDR
a500: 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d  _SZ(journal_form
a510: 61 74 29 3b 0a 20 20 20 20 20 20 20 20 70 67 53  at);.        pgS
a520: 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  z = JOURNAL_PG_S
a530: 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74  Z(journal_format
a540: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
a550: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
a560: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
a570: 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
a580: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
a590: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
a5a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
a5b0: 63 2a 70 67 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53  c*pgSz+hdrSz==jS
a5c0: 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
a5d0: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6a 6f  dif.      if( jo
a5e0: 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 3e 3d 33 20  urnal_format>=3 
a5f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ){.        /* Wr
a600: 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
a610: 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
a620: 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 20  nal file header 
a630: 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
a640: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 69 66   szJ;.        if
a650: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
a660: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
a670: 54 52 41 43 45 31 28 22 53 59 4e 43 5c 6e 22 29  TRACE1("SYNC\n")
a680: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
a690: 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26 70   sqliteOsSync(&p
a6a0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
a6b0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
a6c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a6d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a6e0: 73 71 6c 69 74 65 4f 73 53 65 65 6b 28 26 70 50  sqliteOsSeek(&pP
a6f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 73 69 7a 65 6f  ager->jfd, sizeo
a700: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 31  f(aJournalMagic1
a710: 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
a720: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
a730: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
a740: 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
a750: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a760: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 73 7a  n rc;.        sz
a770: 4a 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J = JOURNAL_HDR_
a780: 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  SZ(journal_forma
a790: 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  t) +.           
a7a0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
a7b0: 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ec*JOURNAL_PG_SZ
a7c0: 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29  (journal_format)
a7d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a7e0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
a7f0: 6a 66 64 2c 20 73 7a 4a 29 3b 0a 20 20 20 20 20  jfd, szJ);.     
a800: 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 31 28   }.      TRACE1(
a810: 22 53 59 4e 43 5c 6e 22 29 3b 0a 20 20 20 20 20  "SYNC\n");.     
a820: 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 53 79   rc = sqliteOsSy
a830: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
a840: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
a850: 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
a860: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
a870: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
a880: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
a890: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
a8a0: 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
a8b0: 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
a8c0: 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
a8d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
a8e0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
a8f0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
a900: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
a910: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
a920: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
a930: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
a940: 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
a950: 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
a960: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
a970: 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
a980: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
a990: 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
a9a0: 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
a9b0: 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
a9c0: 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
a9d0: 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
a9e0: 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
a9f0: 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
aa00: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
aa10: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
aa20: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
aa30: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
aa40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aa50: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
aa60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
aa70: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
aa80: 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
aa90: 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
aaa0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
aab0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
aac0: 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
aad0: 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
aae0: 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
aaf0: 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
ab00: 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
ab10: 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
ab20: 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
ab30: 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
ab40: 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
ab50: 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
ab60: 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
ab70: 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
ab80: 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
ab90: 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
aba0: 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
abb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
abc0: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
abd0: 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
abe0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
abf0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ac00: 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
ac10: 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65 65 6b      sqliteOsSeek
ac20: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
ac30: 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 6f  List->pgno-1)*(o
ac40: 66 66 5f 74 29 53 51 4c 49 54 45 5f 50 41 47 45  ff_t)SQLITE_PAGE
ac50: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45  _SIZE);.    CODE
ac60: 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
ac70: 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
ac80: 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
ac90: 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4f  .    TRACE2("STO
aca0: 52 45 20 25 64 5c 6e 22 2c 20 70 4c 69 73 74 2d  RE %d\n", pList-
acb0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d  >pgno);.    rc =
acc0: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26   sqliteOsWrite(&
acd0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
ace0: 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
acf0: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
ad00: 5a 45 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70  ZE);.    CODEC(p
ad10: 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
ad20: 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
ad30: 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  st->pgno, 0);.  
ad40: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
ad50: 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
ad60: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
ad70: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
ad80: 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Dirty;.  }.  ret
ad90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ada0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20  ../*.** Collect 
adb0: 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65  every dirty page
adc0: 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69   into a dirty li
add0: 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  st and.** return
ade0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
adf0: 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c  e head of that l
ae00: 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20  ist.  All pages 
ae10: 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64  are.** collected
ae20: 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
ae30: 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a  e still in use..
ae40: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
ae50: 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64  *pager_get_all_d
ae60: 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72  irty_pages(Pager
ae70: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
ae80: 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20  dr *p, *pList;. 
ae90: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f   pList = 0;.  fo
aea0: 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
aeb0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
aec0: 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ll){.    if( p->
aed0: 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  dirty ){.      p
aee0: 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74  ->pDirty = pList
aef0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
af00: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  p;.    }.  }.  r
af10: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
af20: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
af30: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
af40: 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
af50: 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
af60: 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
af70: 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75  rst page is acqu
af80: 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72  ired. .** This r
af90: 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70  ead lock is drop
afa0: 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ped when the las
afb0: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
afc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74  ed..**.** A _get
afd0: 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
afe0: 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
aff0: 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
b000: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
b010: 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
b020: 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
b030: 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
b040: 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
b050: 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
b060: 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
b070: 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
b080: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
b090: 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
b0a0: 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
b0b0: 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
b0c0: 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
b0d0: 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
b0e0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
b0f0: 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
b100: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
b110: 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
b120: 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
b130: 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
b140: 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
b150: 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
b160: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
b170: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
b180: 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
b190: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
b1a0: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61  e also sqlite3pa
b1b0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42  ger_lookup().  B
b1c0: 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
b1d0: 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61   and _lookup() a
b1e0: 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
b1f0: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
b200: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
b210: 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
b220: 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
b230: 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
b240: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
b250: 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
b260: 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
b270: 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75   _lookup().** ju
b280: 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
b290: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
b2a0: 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
b2b0: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
b2c0: 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
b2d0: 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
b2e0: 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
b2f0: 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
b300: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
b310: 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29   Since _lookup()
b320: 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
b330: 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
b340: 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
b350: 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
b360: 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
b370: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
b380: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
b390: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
b3a0: 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67   **ppPage){.  Pg
b3b0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
b3c0: 72 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  rc;..  /* Make s
b3d0: 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20  ure we have not 
b3e0: 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c  hit any critical
b3f0: 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20   errors..  */ . 
b400: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
b410: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b420: 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70 70  pgno!=0 );.  *pp
b430: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
b440: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
b450: 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55  & ~(PAGER_ERR_FU
b460: 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LL) ){.    retur
b470: 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
b480: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
b490: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
b4a0: 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
b4b0: 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
b4c0: 61 20 72 65 61 64 20 6c 6f 63 6b 0a 20 20 2a 2a  a read lock.  **
b4d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
b4e0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
b4f0: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
b500: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
b510: 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26  liteOsReadLock(&
b520: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
b530: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b540: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
b550: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
b560: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
b570: 20 53 51 4c 49 54 45 5f 52 45 41 44 4c 4f 43 4b   SQLITE_READLOCK
b580: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
b590: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
b5a0: 74 73 2c 20 74 72 79 20 74 6f 20 70 6c 61 79 20  ts, try to play 
b5b0: 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  it back..    */.
b5c0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b5d0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 73 71  useJournal && sq
b5e0: 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73  liteOsFileExists
b5f0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
b600: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74  l) ){.       int
b610: 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20   rc;..       /* 
b620: 47 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  Get a write lock
b630: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
b640: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
b650: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73 57    rc = sqliteOsW
b660: 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65 72  riteLock(&pPager
b670: 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66  ->fd);.       if
b680: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b690: 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66 28 20  ){.         if( 
b6a0: 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 26  sqliteOsUnlock(&
b6b0: 70 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c  pPager->fd)!=SQL
b6c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b6d0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
b6e0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
b6f0: 21 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ! */.           
b700: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
b710: 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 7d  RNAL;.         }
b720: 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
b730: 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20   rc;.       }.  
b740: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
b750: 74 65 20 3d 20 53 51 4c 49 54 45 5f 57 52 49 54  te = SQLITE_WRIT
b760: 45 4c 4f 43 4b 3b 0a 0a 20 20 20 20 20 20 20 2f  ELOCK;..       /
b770: 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
b780: 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  al for reading o
b790: 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  nly.  Return SQL
b7a0: 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20  ITE_BUSY if.    
b7b0: 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61     ** we are una
b7c0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
b7d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20  journal file. . 
b7e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
b7f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
b800: 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
b810: 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
b820: 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
b830: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
b840: 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e  le is never open
b850: 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e   unless the main
b860: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
b870: 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61  olds.       ** a
b880: 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20   write lock, so 
b890: 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
b8a0: 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f  ny chance of two
b8b0: 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20   or more.       
b8c0: 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65  ** processes ope
b8d0: 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
b8e0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
b8f0: 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e..       */.   
b900: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
b910: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50  sOpenReadOnly(pP
b920: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
b930: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
b940: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
b950: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
b970: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
b980: 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 61  >fd);.         a
b990: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
b9a0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
b9b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
b9c0: 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20  USY;.       }.  
b9d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
b9e0: 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
b9f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
ba00: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
ba10: 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  ..       /* Play
ba20: 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
ba30: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
ba40: 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
ba50: 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20  write.       ** 
ba60: 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
ba70: 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
ba80: 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
ba90: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
baa0: 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
bab0: 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
bac0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bad0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
bae0: 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  c;.       }.    
baf0: 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  }.    pPg = 0;. 
bb00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
bb10: 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69  earch for page i
bb20: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70  n cache */.    p
bb30: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
bb40: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
bb50: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
bb60: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
bb70: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
bb80: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
bb90: 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
bba0: 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65  int h;.    pPage
bbb0: 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20  r->nMiss++;.    
bbc0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
bbd0: 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
bbe0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72   || pPager->pFir
bbf0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  st==0 ){.      /
bc00: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
bc10: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  age */.      pPg
bc20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
bc30: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  aw( sizeof(*pPg)
bc40: 20 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53   + SQLITE_PAGE_S
bc50: 49 5a 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  IZE .           
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
bc80: 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
bc90: 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  a );.      if( p
bca0: 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
bcb0: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
bcc0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
bcd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
bce0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
bcf0: 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  _MEM;.        re
bd00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
bd10: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
bd20: 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
bd30: 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
bd40: 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
bd50: 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20   = pPager;.     
bd60: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d   pPg->pNextAll =
bd70: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20   pPager->pAll;. 
bd80: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
bd90: 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  >pAll ){.       
bda0: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70   pPager->pAll->p
bdb0: 50 72 65 76 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  PrevAll = pPg;. 
bdc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
bdd0: 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20 30 3b 0a  ->pPrevAll = 0;.
bde0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
bdf0: 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ll = pPg;.      
be00: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
be10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
be20: 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
be30: 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
be40: 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
be50: 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
be60: 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72  .      ** requir
be70: 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73  e us to do an fs
be80: 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75  ync() on the jou
be90: 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rnal..      */. 
bea0: 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
beb0: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r->pFirstSynced;
bec0: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65  ..      /* If we
bed0: 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
bee0: 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
bef0: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
bf00: 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a  fsync().      **
bf10: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
bf20: 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20  file then fsync 
bf30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bf40: 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 20  .  This is a.   
bf50: 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20     ** very slow 
bf60: 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65  operation, so we
bf70: 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76   work hard to av
bf80: 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d  oid it.  But som
bf90: 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20  etimes.      ** 
bfa0: 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70  it can't be help
bfb0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
bfc0: 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
bfd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
bfe0: 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
bff0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
c000: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
c010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
c020: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
c030: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
c040: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
c050: 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RR;.        }.  
c060: 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67        pPg = pPag
c070: 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20  er->pFirst;.    
c080: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
c090: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
c0a0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
c0b0: 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
c0c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c0d0: 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
c0e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
c0f0: 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
c100: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c110: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
c120: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  0 );.        pPg
c130: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
c140: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
c150: 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
c160: 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20   pPg );.        
c170: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c180: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
c190: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
c1a0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
c1b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c1c0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
c1d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c1e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
c1f0: 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
c200: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
c210: 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
c220: 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
c230: 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
c240: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
c250: 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61  set the global a
c260: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
c270: 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69  ag, thus disabli
c280: 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ng the.      ** 
c290: 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c  sqlite_dont_roll
c2a0: 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74  back() optimizat
c2b0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74  ion for the rest
c2c0: 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
c2d0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tion..      ** I
c2e0: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
c2f0: 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
c300: 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
c310: 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
c320: 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  .      ** might 
c330: 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
c340: 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
c350: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
c360: 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
c370: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
c380: 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61   was marked alwa
c390: 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69  ysRollback.  Thi
c3a0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c  s means that all
c3b0: 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20   pages must.    
c3c0: 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
c3d0: 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
c3e0: 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75   from here on ou
c3f0: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
c400: 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
c410: 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
c420: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77       pPager->alw
c430: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
c440: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c450: 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
c460: 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
c470: 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
c480: 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20  e hash table.   
c490: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c4a0: 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  pPg==pPager->pFi
c4b0: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
c4c0: 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
c4d0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
c4e0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
c4f0: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
c500: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
c510: 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 20 20 70  ree; }.        p
c520: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
c530: 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 20 20 7d  ced = p;.      }
c540: 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
c550: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
c560: 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
c570: 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
c580: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
c590: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c5a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c5b0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50  ager->pFirst==pP
c5c0: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  g );.        pPa
c5d0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
c5e0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
c5f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c600: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
c610: 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
c620: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
c630: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
c640: 46 72 65 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Free;.      }els
c650: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
c660: 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  t( pPager->pLast
c670: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ==pPg );.       
c680: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
c690: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
c6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c6b0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
c6c0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
c6d0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
c6e0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
c6f0: 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65          pPg->pNe
c700: 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
c710: 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
c720: 73 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sh;.      }.    
c730: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
c740: 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Hash ){.        
c750: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
c760: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
c770: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 20 20  >pNextHash;.    
c780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c790: 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
c7a0: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
c7b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c7c0: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50  er->aHash[h]==pP
c7d0: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  g );.        pPa
c7e0: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
c7f0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
c800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
c810: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
c820: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
c830: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
c840: 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  >nOvfl++;.    }.
c850: 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
c860: 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50  pgno;.    if( pP
c870: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
c880: 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
c890: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
c8a0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
c8b0: 65 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61  eCheckMemory(pPa
c8c0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->aInJournal,
c8d0: 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20   pgno/8);.      
c8e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c8f0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
c900: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
c910: 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
c920: 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
c930: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
c940: 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67  ))!=0;.      pPg
c950: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
c960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c970: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
c980: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
c990: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
c9a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
c9b0: 65 72 2d 3e 61 49 6e 43 6b 70 74 20 26 26 20 28  er->aInCkpt && (
c9c0: 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
c9d0: 2d 3e 63 6b 70 74 53 69 7a 65 0a 20 20 20 20 20  ->ckptSize.     
c9e0: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67          && (pPag
c9f0: 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 67 6e 6f  er->aInCkpt[pgno
ca00: 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
ca10: 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  7)))!=0 ){.     
ca20: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
ca30: 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
ca40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61   }else{.      pa
ca50: 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73  ge_remove_from_s
ca60: 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
ca70: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69     }.    pPg->di
ca80: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  rty = 0;.    pPg
ca90: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
caa0: 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20  REFINFO(pPg);.  
cab0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
cac0: 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f  ;.    h = pager_
cad0: 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20  hash(pgno);.    
cae0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
caf0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
cb00: 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
cb10: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
cb20: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
cb30: 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
cb40: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
cb50: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
cb60: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
cb70: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
cb80: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
cb90: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
cba0: 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
cbb0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
cbc0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
cbd0: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
cbe0: 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
cbf0: 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
cc00: 7a 65 3c 30 20 29 20 73 71 6c 69 74 65 33 70 61  ze<0 ) sqlite3pa
cc10: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
cc20: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
cc30: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
cc40: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
cc50: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
cc60: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
cc70: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
cc80: 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
cc90: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
cca0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
ccb0: 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
ccc0: 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a  ze<(int)pgno ){.
ccd0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
cce0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
ccf0: 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f   0, SQLITE_PAGE_
cd00: 53 49 5a 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65  SIZE);.    }else
cd10: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
cd20: 20 20 20 20 20 20 73 71 6c 69 74 65 4f 73 53 65        sqliteOsSe
cd30: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
cd40: 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29  (pgno-1)*(off_t)
cd50: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
cd60: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
cd70: 6c 69 74 65 4f 73 52 65 61 64 28 26 70 50 61 67  liteOsRead(&pPag
cd80: 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
cd90: 5f 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49  _DATA(pPg), SQLI
cda0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
cdb0: 20 20 20 20 20 54 52 41 43 45 32 28 22 46 45 54       TRACE2("FET
cdc0: 43 48 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  CH %d\n", pPg->p
cdd0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
cde0: 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
cdf0: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
ce00: 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20  g->pgno, 3);.   
ce10: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ce20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ce30: 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a 65 3b 0a  off_t fileSize;.
ce40: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
ce50: 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  teOsFileSize(&pP
ce60: 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69  ager->fd,&fileSi
ce70: 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ze)!=SQLITE_OK. 
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
ce90: 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a   fileSize>=pgno*
cea0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
ceb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
cec0: 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
ced0: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
cee0: 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg));.          
cef0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
cf00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cf10: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
cf20: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
cf30: 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
cf40: 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ZE);.        }. 
cf50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
cf60: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
cf70: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
cf80: 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
cf90: 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ache. */.    pPa
cfa0: 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20  ger->nHit++;.   
cfb0: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
cfc0: 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
cfd0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
cfe0: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
cff0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d000: 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
d010: 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
d020: 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
d030: 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
d040: 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
d050: 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
d060: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
d070: 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
d080: 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
d090: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
d0a0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
d0b0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
d0c0: 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
d0d0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
d0e0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
d0f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
d100: 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
d110: 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
d120: 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
d130: 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
d140: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
d150: 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
d160: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
d170: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
d180: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
d190: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
d1a0: 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
d1b0: 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
d1c0: 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f   happened..*/.vo
d1d0: 69 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  id *sqlite3pager
d1e0: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
d1f0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
d200: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
d210: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
d220: 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
d230: 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
d240: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
d250: 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52  ask & ~(PAGER_ER
d260: 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72  R_FULL) ){.    r
d270: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
d280: 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52  * if( pPager->nR
d290: 65 66 3d 3d 30 20 29 7b 0a 20 20 2a 2a 20 20 72  ef==0 ){.  **  r
d2a0: 65 74 75 72 6e 20 30 3b 0a 20 20 2a 2a 20 7d 0a  eturn 0;.  ** }.
d2b0: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
d2c0: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
d2d0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
d2e0: 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
d2f0: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
d300: 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  );.  return PGHD
d310: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
d320: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
d330: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
d340: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
d350: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
d360: 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
d370: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
d380: 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
d390: 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
d3a0: 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
d3b0: 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
d3c0: 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
d3d0: 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
d3e0: 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
d3f0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
d400: 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
d410: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
d420: 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20  ager_unref(void 
d430: 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
d440: 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
d450: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
d460: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
d470: 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
d480: 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
d490: 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
d4a0: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
d4b0: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
d4c0: 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
d4d0: 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
d4e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
d4f0: 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
d500: 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
d510: 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
d520: 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
d530: 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
d540: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
d550: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
d560: 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
d570: 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
d580: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
d590: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
d5a0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
d5b0: 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
d5c0: 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
d5d0: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
d5e0: 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
d5f0: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
d600: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
d610: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
d620: 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
d630: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
d640: 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
d650: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
d660: 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
d670: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
d680: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
d690: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
d6a0: 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
d6b0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
d6c0: 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
d6d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
d6e0: 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 29 3b  structor(pData);
d6f0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
d700: 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   When all pages 
d710: 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69  reach the freeli
d720: 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61  st, drop the rea
d730: 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20  d lock from.    
d740: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
d750: 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
d760: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
d770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
d780: 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a  ger->nRef>=0 );.
d790: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
d7a0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
d7b0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
d7c0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
d7d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d7e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
d7f0: 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
d800: 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
d810: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
d820: 65 61 64 79 20 62 65 20 61 20 77 72 69 74 65 0a  eady be a write.
d830: 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
d840: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
d850: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
d860: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
d870: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
d880: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
d890: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
d8a0: 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
d8b0: 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
d8c0: 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
d8d0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
d8e0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
d8f0: 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
d900: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d910: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
d920: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
d930: 53 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b  SQLITE_WRITELOCK
d940: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d950: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
d960: 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
d970: 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
d980: 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74 65  rnal );.  sqlite
d990: 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
d9a0: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
d9b0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
d9c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
d9d0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
d9e0: 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
d9f0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
da00: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
da10: 4f 73 52 65 61 64 4c 6f 63 6b 28 26 70 50 61 67  OsReadLock(&pPag
da20: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 70 50 61  er->fd);.    pPa
da30: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c  ger->state = SQL
da40: 49 54 45 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20  ITE_READLOCK;.  
da50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
da60: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
da70: 3d 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45 78  = sqliteOsOpenEx
da80: 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e  clusive(pPager->
da90: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
daa0: 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74  r->jfd,pPager->t
dab0: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
dac0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
dad0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
dae0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
daf0: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
db00: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
db10: 0a 20 20 20 20 73 71 6c 69 74 65 4f 73 52 65 61  .    sqliteOsRea
db20: 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
db30: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
db40: 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 52  state = SQLITE_R
db50: 45 41 44 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  EADLOCK;.    ret
db60: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
db70: 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PEN;.  }.  sqlit
db80: 65 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  eOsOpenDirectory
db90: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
dba0: 6f 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ory, &pPager->jf
dbb0: 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  d);.  pPager->jo
dbc0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
dbd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dbe0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70  Started = 0;.  p
dbf0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
dc00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
dc10: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
dc20: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
dc30: 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  c = 0;.  if( pPa
dc40: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
dc50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
dc60: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
dc70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
dc80: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
dc90: 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
dca0: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 69  ger->dbSize;.  i
dcb0: 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61  f( journal_forma
dcc0: 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f 52 4d 41  t==JOURNAL_FORMA
dcd0: 54 5f 33 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  T_3 ){.    rc = 
dce0: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70  sqliteOsWrite(&p
dcf0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
dd00: 72 6e 61 6c 4d 61 67 69 63 33 2c 20 73 69 7a 65  rnalMagic3, size
dd10: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
dd20: 33 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  3));.    if( rc=
dd30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dd40: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
dd50: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
dd60: 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  d, pPager->noSyn
dd70: 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  c ? 0xffffffff :
dd80: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
dd90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dda0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ddb0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
ddc0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
ddd0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
dde0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 20  ksumInit);.     
ddf0: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
de00: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
de10: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
de20: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
de30: 65 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f  e if( journal_fo
de40: 72 6d 61 74 3d 3d 4a 4f 55 52 4e 41 4c 5f 46 4f  rmat==JOURNAL_FO
de50: 52 4d 41 54 5f 32 20 29 7b 0a 20 20 20 20 72 63  RMAT_2 ){.    rc
de60: 20 3d 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65   = sqliteOsWrite
de70: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
de80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 32 2c 20 73  JournalMagic2, s
de90: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
dea0: 67 69 63 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  gic2));.  }else{
deb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 6f 75  .    assert( jou
dec0: 72 6e 61 6c 5f 66 6f 72 6d 61 74 3d 3d 4a 4f 55  rnal_format==JOU
ded0: 52 4e 41 4c 5f 46 4f 52 4d 41 54 5f 31 20 29 3b  RNAL_FORMAT_1 );
dee0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
def0: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
df00: 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
df10: 67 69 63 31 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  gic1, sizeof(aJo
df20: 75 72 6e 61 6c 4d 61 67 69 63 31 29 29 3b 0a 20  urnalMagic1));. 
df30: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
df40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
df50: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
df60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
df70: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
df80: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
df90: 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  ckptAutoopen && 
dfa0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dfb0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
dfc0: 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69  3pager_stmt_begi
dfd0: 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
dfe0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
dff0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
e000: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
e010: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
e020: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e030: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
e040: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
e050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e060: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  ;  .}../*.** Acq
e070: 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
e080: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
e090: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
e0a0: 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
e0b0: 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
e0c0: 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
e0d0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
e0e0: 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
e0f0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
e100: 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
e110: 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20  r_rollback() is 
e120: 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
e130: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
e140: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
e150: 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
e160: 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20  ager_unref() is 
e170: 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65  called to on eve
e180: 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ry outstanding p
e190: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
e1a0: 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
e1b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
e1c0: 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
e1d0: 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
e1e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
e1f0: 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
e200: 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
e210: 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
e220: 65 6c 79 0a 2a 2a 20 74 6f 20 61 63 71 75 69 72  ely.** to acquir
e230: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
e240: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e250: 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
e260: 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 69 73  that there.** is
e270: 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
e280: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
e290: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f  base..**.** A jo
e2a0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
e2b0: 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20  ened if this is 
e2c0: 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
e2d0: 66 69 6c 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 65  file.  For.** te
e2e0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74  mporary files, t
e2f0: 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68  he opening of th
e300: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
e310: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
e320: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 6e 20  .** there is an 
e330: 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77  actual need to w
e340: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
e350: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nal..**.** If th
e360: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
e370: 72 65 61 64 79 20 77 72 69 74 65 2d 6c 6f 63 6b  ready write-lock
e380: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
e390: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
e3a0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
e3b0: 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61  _begin(void *pDa
e3c0: 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
e3d0: 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
e3e0: 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
e3f0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
e400: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
e410: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e420: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
e430: 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
e440: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
e450: 3d 53 51 4c 49 54 45 5f 55 4e 4c 4f 43 4b 20 29  =SQLITE_UNLOCK )
e460: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
e470: 73 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 52 45  state==SQLITE_RE
e480: 41 44 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  ADLOCK ){.    as
e490: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
e4a0: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
e4b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f 73     rc = sqliteOs
e4c0: 57 72 69 74 65 4c 6f 63 6b 28 26 70 50 61 67 65  WriteLock(&pPage
e4d0: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20  r->fd);.    if( 
e4e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e4f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
e510: 65 72 2d 3e 73 74 61 74 65 20 3d 20 53 51 4c 49  er->state = SQLI
e520: 54 45 5f 57 52 49 54 45 4c 4f 43 4b 3b 0a 20 20  TE_WRITELOCK;.  
e530: 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46    pPager->dirtyF
e540: 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 54 52 41  ile = 0;.    TRA
e550: 43 45 31 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE1("TRANSACTION
e560: 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 50  \n");.    if( pP
e570: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
e580: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
e590: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  pFile ){.      r
e5a0: 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
e5b0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
e5c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
e5d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e5e0: 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
e5f0: 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20   as writeable.  
e600: 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
e610: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e620: 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69  rnal .** if it i
e630: 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
e640: 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ady.  This routi
e650: 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
e660: 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a  d before making.
e670: 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ** changes to a 
e680: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
e690: 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
e6a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e6b0: 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65  d, the pager cre
e6c0: 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f  ates a new.** jo
e6d0: 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72  urnal and acquir
e6e0: 65 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  es a write lock 
e6f0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
e700: 20 20 49 66 20 74 68 65 20 77 72 69 74 65 0a 2a    If the write.*
e710: 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
e720: 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
e730: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
e740: 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
e750: 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
e760: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
e770: 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
e780: 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
e790: 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
e7a0: 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
e7b0: 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
e7c0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
e7d0: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
e7e0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
e7f0: 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
e800: 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
e810: 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
e820: 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
e830: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
e840: 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
e850: 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
e860: 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
e870: 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
e880: 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
e890: 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
e8a0: 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
e8b0: 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
e8c0: 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
e8d0: 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
e8e0: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
e8f0: 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
e900: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e910: 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
e920: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
e930: 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
e940: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
e950: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
e960: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
e970: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e980: 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
e990: 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
e9a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
e9b0: 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65  rMask ){ .    re
e9c0: 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
e9d0: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
e9e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
e9f0: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
ea00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
ea10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  ;.  }..  /* Mark
ea20: 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
ea30: 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
ea40: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
ea50: 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
ea60: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
ea70: 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
ea80: 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
ea90: 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  /.  pPg->dirty =
eaa0: 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69   1;.  if( pPg->i
eab0: 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67  nJournal && (pPg
eac0: 2d 3e 69 6e 43 6b 70 74 20 7c 7c 20 70 50 61 67  ->inCkpt || pPag
ead0: 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 3d 3d 30  er->ckptInUse==0
eae0: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
eaf0: 3e 64 69 72 74 79 46 69 6c 65 20 3d 20 31 3b 0a  >dirtyFile = 1;.
eb00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eb10: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
eb20: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
eb30: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
eb40: 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
eb50: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74   to be.  ** writ
eb60: 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
eb70: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
eb80: 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
eb90: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72   journal.  ** or
eba0: 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
ebb0: 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
ebc0: 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
ebd0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
ebe0: 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a   exists and.  **
ebf0: 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
ec00: 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   does not..  */.
ec10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ec20: 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
ec30: 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  UNLOCK );.  rc =
ec40: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
ec50: 67 69 6e 28 70 44 61 74 61 29 3b 0a 20 20 69 66  gin(pData);.  if
ec60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ec70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
ec80: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
ec90: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 53  pPager->state==S
eca0: 51 4c 49 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20  QLITE_WRITELOCK 
ecb0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
ecc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
ecd0: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
ece0: 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
ecf0: 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
ed00: 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
ed10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ed20: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
ed30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
ed40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
ed50: 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65   || !pPager->use
ed60: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61  Journal );.  pPa
ed70: 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65 20 3d  ger->dirtyFile =
ed80: 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72   1;..  /* The tr
ed90: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
eda0: 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
edb0: 20 77 65 20 68 61 76 65 20 61 20 77 72 69 74 65   we have a write
edc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
edd0: 2a 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  * main database 
ede0: 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
edf0: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
ee00: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ee10: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69   .  ** journal i
ee20: 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
ee30: 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a 2f 0a  e already..  */.
ee40: 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
ee50: 75 72 6e 61 6c 20 26 26 20 70 50 61 67 65 72 2d  urnal && pPager-
ee60: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >useJournal ){. 
ee70: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
ee80: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
ee90: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
eea0: 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20       int szPg;. 
eeb0: 20 20 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a       u32 saved;.
eec0: 20 20 20 20 20 20 69 66 28 20 6a 6f 75 72 6e 61        if( journa
eed0: 6c 5f 66 6f 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41  l_format>=JOURNA
eee0: 4c 5f 46 4f 52 4d 41 54 5f 33 20 29 7b 0a 20 20  L_FORMAT_3 ){.  
eef0: 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 20        u32 cksum 
ef00: 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
ef10: 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
ef20: 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
ef30: 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
ef40: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
ef50: 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  Pg);.        sto
ef60: 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20  re32bits(cksum, 
ef70: 70 50 67 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  pPg, SQLITE_PAGE
ef80: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
ef90: 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f 50 41  szPg = SQLITE_PA
efa0: 47 45 5f 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20  GE_SIZE+8;.     
efb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
efc0: 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f 50 41  szPg = SQLITE_PA
efd0: 47 45 5f 53 49 5a 45 2b 34 3b 0a 20 20 20 20 20  GE_SIZE+4;.     
efe0: 20 7d 0a 20 20 20 20 20 20 73 74 6f 72 65 33 32   }.      store32
eff0: 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20  bits(pPg->pgno, 
f000: 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20  pPg, -4);.      
f010: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
f020: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
f030: 37 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  7);.      rc = s
f040: 71 6c 69 74 65 4f 73 57 72 69 74 65 28 26 70 50  qliteOsWrite(&pP
f050: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68  ager->jfd, &((ch
f060: 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20  ar*)pData)[-4], 
f070: 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 54 52 41  szPg);.      TRA
f080: 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE3("JOURNAL %d 
f090: 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
f0a0: 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
f0b0: 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
f0c0: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
f0d0: 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
f0e0: 20 20 69 66 28 20 6a 6f 75 72 6e 61 6c 5f 66 6f    if( journal_fo
f0f0: 72 6d 61 74 3e 3d 4a 4f 55 52 4e 41 4c 5f 46 4f  rmat>=JOURNAL_FO
f100: 52 4d 41 54 5f 33 20 29 7b 0a 20 20 20 20 20 20  RMAT_3 ){.      
f110: 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54    *(u32*)PGHDR_T
f120: 4f 5f 45 58 54 52 41 28 70 50 67 29 20 3d 20 73  O_EXTRA(pPg) = s
f130: 61 76 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  aved;.      }.  
f140: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f150: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f160: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
f170: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
f180: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
f190: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
f1a0: 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  _ERR_FULL;.     
f1b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f1c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
f1d0: 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
f1e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f1f0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
f200: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
f210: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
f220: 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
f230: 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
f240: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
f250: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
f260: 79 6e 63 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ync;.      pPg->
f270: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
f280: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
f290: 3e 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20  >ckptInUse ){.  
f2a0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
f2b0: 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nCkpt[pPg->pgno/
f2c0: 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
f2d0: 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
f2e0: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
f2f0: 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
f300: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
f310: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
f320: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f  nc = !pPager->jo
f330: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
f340: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
f350: 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 41  .      TRACE3("A
f360: 50 50 45 4e 44 20 25 64 20 25 64 5c 6e 22 2c 20  PPEND %d %d\n", 
f370: 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
f380: 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d  needSync);.    }
f390: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
f3a0: 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
f3b0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
f3c0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
f3d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65  .  /* If the che
f3e0: 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 20  ckpoint journal 
f3f0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
f400: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
f410: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  t,.  ** then wri
f420: 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
f430: 61 67 65 20 74 6f 20 74 68 65 20 63 68 65 63 6b  age to the check
f440: 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  point journal.  
f450: 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  Note that.  ** t
f460: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6a 6f  he checkpoint jo
f470: 75 72 6e 61 6c 20 61 6c 77 61 79 73 20 75 73 65  urnal always use
f480: 73 20 74 68 65 20 73 69 6d 70 6c 69 65 72 20 66  s the simplier f
f490: 6f 72 6d 61 74 20 32 20 74 68 61 74 20 6c 61 63  ormat 2 that lac
f4a0: 6b 73 0a 20 20 2a 2a 20 63 68 65 63 6b 73 75 6d  ks.  ** checksum
f4b0: 73 2e 20 20 54 68 65 20 68 65 61 64 65 72 20 69  s.  The header i
f4c0: 73 20 61 6c 73 6f 20 6f 6d 69 74 74 65 64 20 66  s also omitted f
f4d0: 72 6f 6d 20 74 68 65 20 63 68 65 63 6b 70 6f 69  rom the checkpoi
f4e0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
f4f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 63  .  if( pPager->c
f500: 6b 70 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  kptInUse && !pPg
f510: 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28 69 6e 74  ->inCkpt && (int
f520: 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
f530: 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 29 7b 0a  er->ckptSize ){.
f540: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
f550: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
f560: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
f570: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
f580: 29 3b 0a 20 20 20 20 73 74 6f 72 65 33 32 62 69  );.    store32bi
f590: 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ts(pPg->pgno, pP
f5a0: 67 2c 20 2d 34 29 3b 0a 20 20 20 20 43 4f 44 45  g, -4);.    CODE
f5b0: 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
f5c0: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
f5d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 4f      rc = sqliteO
f5e0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
f5f0: 63 70 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70  cpfd, &((char*)p
f600: 44 61 74 61 29 5b 2d 34 5d 2c 20 53 51 4c 49 54  Data)[-4], SQLIT
f610: 45 5f 50 41 47 45 5f 53 49 5a 45 2b 34 29 3b 0a  E_PAGE_SIZE+4);.
f620: 20 20 20 20 54 52 41 43 45 32 28 22 43 4b 50 54      TRACE2("CKPT
f630: 2d 4a 4f 55 52 4e 41 4c 20 25 64 5c 6e 22 2c 20  -JOURNAL %d\n", 
f640: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
f650: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
f660: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
f670: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
f680: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f690: 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
f6a0: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
f6b0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
f6c0: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
f6d0: 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  _ERR_FULL;.     
f6e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f6f0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  }.    pPager->ck
f700: 70 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  ptNRec++;.    as
f710: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
f720: 6e 43 6b 70 74 21 3d 30 20 29 3b 0a 20 20 20 20  nCkpt!=0 );.    
f730: 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 5b  pPager->aInCkpt[
f740: 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
f750: 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
f760: 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  ;.    page_add_t
f770: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
f780: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
f790: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
f7a0: 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
f7b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
f7c0: 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
f7d0: 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
f7e0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f7f0: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d  = pPg->pgno;.  }
f800: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f810: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
f820: 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
f830: 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
f840: 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
f850: 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
f860: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
f870: 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
f880: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
f890: 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
f8a0: 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
f8b0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
f8c0: 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  page..*/.int sql
f8d0: 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
f8e0: 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74  eable(void *pDat
f8f0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
f900: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
f910: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
f920: 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
f930: 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
f940: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
f950: 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
f960: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
f970: 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
f980: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
f990: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  t sqlite3pager_o
f9a0: 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
f9b0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
f9c0: 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
f9d0: 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a  .  void *pPage;.
f9e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
f9f0: 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
fa00: 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
fa10: 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
fa20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
fa30: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fa40: 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
fa50: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
fa60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fa70: 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
fa80: 2c 20 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , pData, SQLITE_
fa90: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
faa0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
fab0: 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
fac0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
fad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  ;.}../*.** A cal
fae0: 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
faf0: 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
fb00: 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
fb10: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
fb20: 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
fb30: 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22  mation on page "
fb40: 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68  pgno" back to th
fb50: 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
fb60: 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
fb70: 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
fb80: 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
fb90: 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
fba0: 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
fbb0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
fbc0: 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
fbd0: 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
fbe0: 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
fbf0: 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
fc00: 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
fc10: 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
fc20: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
fc30: 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
fc40: 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
fc50: 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
fc60: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
fc70: 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
fc80: 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
fc90: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
fca0: 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
fcb0: 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
fcc0: 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
fcd0: 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
fce0: 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
fcf0: 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
fd00: 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
fd10: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
fd20: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
fd30: 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
fd40: 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
fd50: 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
fd60: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
fd70: 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
fd80: 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
fd90: 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
fda0: 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
fdb0: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
fdc0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
fdd0: 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
fde0: 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
fdf0: 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
fe00: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
fe10: 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
fe20: 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
fe30: 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
fe40: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
fe50: 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
fe60: 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
fe70: 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
fe80: 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
fe90: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
fea0: 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
feb0: 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
fec0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
fed0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
fee0: 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
fef0: 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f  eused,.** the do
ff00: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  nt_rollback() ro
ff10: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
ff20: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
ff30: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a  e page contains.
ff40: 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ** critical data
ff50: 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
ff60: 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
ff70: 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ts rolled back i
ff80: 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68  n spite.** of th
ff90: 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
ffa0: 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
ffb0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
ffc0: 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  t_write(Pager *p
ffd0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
ffe0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
fff0: 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
10000 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
10010 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77  gno);.  pPg->alw
10020 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
10030 0a 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50  .  if( pPg && pP
10040 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
10050 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
10060 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
10070 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
10080 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
10090 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
100a0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
100b0 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
100c0 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
100d0 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
100e0 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
100f0 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
10100 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
10110 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
10120 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
10130 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
10140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10150 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
10160 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
10170 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
10180 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
10190 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
101a0 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
101b0 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
101c0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
101d0 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
101e0 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
101f0 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
10200 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
10210 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
10220 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
10230 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
10240 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
10250 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
10260 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
10270 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
10280 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
10290 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
102a0 20 20 20 20 20 20 54 52 41 43 45 32 28 22 44 4f        TRACE2("DO
102b0 4e 54 5f 57 52 49 54 45 20 25 64 5c 6e 22 2c 20  NT_WRITE %d\n", 
102c0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50 67  pgno);.      pPg
102d0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
102e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
102f0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
10300 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
10310 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
10320 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
10330 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
10340 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
10350 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
10360 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
10370 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
10380 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
10390 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
103a0 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
103b0 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
103c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
103d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
103e0 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
103f0 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
10400 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
10410 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
10420 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
10430 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
10440 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
10450 67 65 72 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49  ger->state!=SQLI
10460 54 45 5f 57 52 49 54 45 4c 4f 43 4b 20 7c 7c 20  TE_WRITELOCK || 
10470 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10480 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
10490 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
104a0 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
104b0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
104c0 62 61 63 6b 20 29 20 72 65 74 75 72 6e 3b 0a 20  back ) return;. 
104d0 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
104e0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
104f0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
10500 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
10510 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10520 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
10530 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
10540 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
10550 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
10560 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
10570 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
10580 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
10590 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65 20  ager->ckptInUse 
105a0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
105b0 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d 3e 70 67  >aInCkpt[pPg->pg
105c0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
105d0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
105e0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
105f0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
10600 20 7d 0a 20 20 20 20 54 52 41 43 45 32 28 22 44   }.    TRACE2("D
10610 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  ONT_ROLLBACK %d\
10620 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
10630 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
10640 2d 3e 63 6b 70 74 49 6e 55 73 65 20 26 26 20 21  ->ckptInUse && !
10650 70 50 67 2d 3e 69 6e 43 6b 70 74 20 26 26 20 28  pPg->inCkpt && (
10660 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
10670 50 61 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20  Pager->ckptSize 
10680 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10690 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
106a0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
106b0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
106c0 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
106d0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b 70  ( pPager->aInCkp
106e0 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
106f0 65 72 2d 3e 61 49 6e 43 6b 70 74 5b 70 50 67 2d  er->aInCkpt[pPg-
10700 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
10710 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
10720 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
10730 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
10740 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  }.}../*.** Commi
10750 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
10760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
10770 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
10780 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
10790 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
107a0 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
107b0 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
107c0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
107d0 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
107e0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
107f0 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
10800 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
10810 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
10820 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10830 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67  pager_commit(Pag
10840 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
10850 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
10860 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  pPg;..  if( pPag
10870 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47  er->errMask==PAG
10880 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
10890 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
108a0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
108b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
108c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
108d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
108e0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
108f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10900 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10910 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
10920 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
10930 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
10940 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10950 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10960 61 74 65 21 3d 53 51 4c 49 54 45 5f 57 52 49 54  ate!=SQLITE_WRIT
10970 45 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74  ELOCK ){.    ret
10980 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10990 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 31 28 22  ;.  }.  TRACE1("
109a0 43 4f 4d 4d 49 54 5c 6e 22 29 3b 0a 20 20 69 66  COMMIT\n");.  if
109b0 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 46  ( pPager->dirtyF
109c0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ile==0 ){.    /*
109d0 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74   Exit early (wit
109e0 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74  hout doing the t
109f0 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71  ime-consuming sq
10a00 6c 69 74 65 4f 73 53 79 6e 63 28 29 20 63 61 6c  liteOsSync() cal
10a10 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ls).    ** if th
10a20 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
10a30 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
10a40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
10a50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
10a60 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d  ager->needSync==
10a70 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 );.    rc = pa
10a80 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
10a90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
10aa0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
10ab0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
10ac0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10ad0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
10ae0 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 79 6e  en );.  rc = syn
10af0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
10b00 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10b10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
10b20 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a  o commit_abort;.
10b30 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65    }.  pPg = page
10b40 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
10b50 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
10b60 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
10b70 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
10b80 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
10b90 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 28 21      if( rc || (!
10ba0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
10bb0 26 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 26  & sqliteOsSync(&
10bc0 70 50 61 67 65 72 2d 3e 66 64 29 21 3d 53 51 4c  pPager->fd)!=SQL
10bd0 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  ITE_OK) ){.     
10be0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f   goto commit_abo
10bf0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rt;.    }.  }.  
10c00 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
10c10 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
10c20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10c30 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
10c40 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  rc;..  /* Jump h
10c50 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ere if anything 
10c60 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e  goes wrong durin
10c70 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
10c80 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69  cess..  */.commi
10c90 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20  t_abort:.  rc = 
10ca0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
10cb0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
10cc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10cd0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
10ce0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
10cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10d00 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
10d10 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65  ll changes.  The
10d20 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
10d30 62 61 63 6b 20 74 6f 20 72 65 61 64 2d 6f 6e 6c  back to read-onl
10d40 79 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  y mode..** All i
10d50 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
10d60 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
10d70 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
10d80 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
10d90 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
10da0 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
10db0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
10dc0 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
10dd0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
10de0 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
10df0 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
10e00 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
10e10 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  l (SQLITE_PROTOC
10e20 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  OL) or unless so
10e30 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
10e40 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
10e50 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
10e60 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
10e70 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
10e80 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
10e90 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
10ea0 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
10eb0 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
10ec0 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
10ed0 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
10ee0 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
10ef0 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
10f00 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
10f10 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
10f20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
10f30 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
10f40 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
10f50 20 20 54 52 41 43 45 31 28 22 52 4f 4c 4c 42 41    TRACE1("ROLLBA
10f60 43 4b 5c 6e 22 29 3b 0a 20 20 69 66 28 20 21 70  CK\n");.  if( !p
10f70 50 61 67 65 72 2d 3e 64 69 72 74 79 46 69 6c 65  Pager->dirtyFile
10f80 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
10f90 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
10fa0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
10fb0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
10fc0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10fd0 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
10fe0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
10ff0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
11000 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d  sk!=0 && pPager-
11010 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f  >errMask!=PAGER_
11020 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
11030 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
11040 65 3e 3d 53 51 4c 49 54 45 5f 57 52 49 54 45 4c  e>=SQLITE_WRITEL
11050 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  OCK ){.      pag
11060 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
11070 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
11080 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
11090 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
110a0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
110b0 2d 3e 73 74 61 74 65 21 3d 53 51 4c 49 54 45 5f  ->state!=SQLITE_
110c0 57 52 49 54 45 4c 4f 43 4b 20 29 7b 0a 20 20 20  WRITELOCK ){.   
110d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
110e0 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61  K;.  }.  rc = pa
110f0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
11100 67 65 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72  ger, 1);.  if( r
11110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11120 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11130 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 70 50 61  CORRUPT;.    pPa
11140 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
11150 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
11160 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  T;.  }.  pPager-
11170 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
11180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11190 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
111a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
111b0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
111c0 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
111d0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
111e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
111f0 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
11200 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
11210 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e  e3pager_isreadon
11220 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
11230 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
11240 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
11250 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11260 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
11270 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
11280 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
11290 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t *sqlite3pager_
112a0 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  stats(Pager *pPa
112b0 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
112c0 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20  nt a[9];.  a[0] 
112d0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  = pPager->nRef;.
112e0 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d    a[1] = pPager-
112f0 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d  >nPage;.  a[2] =
11300 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b   pPager->mxPage;
11310 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
11320 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d  ->dbSize;.  a[4]
11330 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
11340 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
11350 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b  r->errMask;.  a[
11360 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
11370 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
11380 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
11390 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66  ] = pPager->nOvf
113a0 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  l;.  return a;.}
113b0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
113c0 63 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  checkpoint..**.*
113d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
113e0 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
113f0 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
11400 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
11410 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
11420 20 6e 65 77 20 63 68 65 63 6b 70 6f 69 6e 74 20   new checkpoint 
11430 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
11440 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
11450 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
11460 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
11470 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
11480 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
11490 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
114a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
114b0 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50  ger_stmt_begin(P
114c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
114d0 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
114e0 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
114f0 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 69  PNAME_SIZE];.  i
11500 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
11510 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
11520 50 61 67 65 72 2d 3e 63 6b 70 74 41 75 74 6f 6f  Pager->ckptAutoo
11530 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
11540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11550 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
11560 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
11570 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
11580 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73 65  Pager->ckptInUse
11590 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49   );.  pPager->aI
115a0 6e 43 6b 70 74 20 3d 20 73 71 6c 69 74 65 4d 61  nCkpt = sqliteMa
115b0 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
115c0 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
115d0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 43  if( pPager->aInC
115e0 6b 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  kpt==0 ){.    sq
115f0 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 26  liteOsReadLock(&
11600 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
11610 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11620 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  OMEM;.  }.#ifnde
11630 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20  f NDEBUG.  rc = 
11640 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
11650 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
11660 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69 7a  pPager->ckptJSiz
11670 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
11680 6f 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66  oto ckpt_begin_f
11690 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ailed;.  assert(
116a0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69   pPager->ckptJSi
116b0 7a 65 20 3d 3d 20 0a 20 20 20 20 70 50 61 67 65  ze == .    pPage
116c0 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f  r->nRec*JOURNAL_
116d0 50 47 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f  PG_SZ(journal_fo
116e0 72 6d 61 74 29 2b 4a 4f 55 52 4e 41 4c 5f 48 44  rmat)+JOURNAL_HD
116f0 52 5f 53 5a 28 6a 6f 75 72 6e 61 6c 5f 66 6f 72  R_SZ(journal_for
11700 6d 61 74 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  mat) );.#endif. 
11710 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 4a 53 69   pPager->ckptJSi
11720 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ze = pPager->nRe
11730 63 2a 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  c*JOURNAL_PG_SZ(
11740 6a 6f 75 72 6e 61 6c 5f 66 6f 72 6d 61 74 29 0a  journal_format).
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 20 20 20 20 20 20 20 20 20 2b 20 4a 4f 55 52 4e           + JOURN
11770 41 4c 5f 48 44 52 5f 53 5a 28 6a 6f 75 72 6e 61  AL_HDR_SZ(journa
11780 6c 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 70 50 61  l_format);.  pPa
11790 67 65 72 2d 3e 63 6b 70 74 53 69 7a 65 20 3d 20  ger->ckptSize = 
117a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
117b0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
117c0 6b 70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  kptOpen ){.    r
117d0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
117e0 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
117f0 20 26 70 50 61 67 65 72 2d 3e 63 70 66 64 29 3b   &pPager->cpfd);
11800 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
11810 74 6f 20 63 6b 70 74 5f 62 65 67 69 6e 5f 66 61  to ckpt_begin_fa
11820 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72  iled;.    pPager
11830 2d 3e 63 6b 70 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->ckptOpen = 1;.
11840 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
11850 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
11860 70 50 61 67 65 72 2d 3e 63 6b 70 74 49 6e 55 73  pPager->ckptInUs
11870 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
11880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 63 6b 70  SQLITE_OK;. .ckp
11890 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
118a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
118b0 6e 43 6b 70 74 20 29 7b 0a 20 20 20 20 73 71 6c  nCkpt ){.    sql
118c0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
118d0 61 49 6e 43 6b 70 74 29 3b 0a 20 20 20 20 70 50  aInCkpt);.    pP
118e0 61 67 65 72 2d 3e 61 49 6e 43 6b 70 74 20 3d 20  ager->aInCkpt = 
118f0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
11900 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
11910 6d 69 74 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  mit a checkpoint
11920 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11930 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
11940 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
11950 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
11960 63 6b 70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  ckptInUse ){.   
11970 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
11980 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f  ext;.    sqliteO
11990 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 63  sSeek(&pPager->c
119a0 70 66 64 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  pfd, 0);.    /* 
119b0 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65  sqliteOsTruncate
119c0 28 26 70 50 61 67 65 72 2d 3e 63 70 66 64 2c 20  (&pPager->cpfd, 
119d0 30 29 3b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  0); */.    pPage
119e0 72 2d 3e 63 6b 70 74 4e 52 65 63 20 3d 20 30 3b  r->ckptNRec = 0;
119f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
11a00 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
11a10 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
11a20 65 72 2d 3e 61 49 6e 43 6b 70 74 20 29 3b 0a 20  er->aInCkpt );. 
11a30 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 43 6b     pPager->aInCk
11a40 70 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  pt = 0;.    for(
11a50 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 43 6b 70  pPg=pPager->pCkp
11a60 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
11a70 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
11a80 3d 20 70 50 67 2d 3e 70 4e 65 78 74 43 6b 70 74  = pPg->pNextCkpt
11a90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11aa0 70 50 67 2d 3e 69 6e 43 6b 70 74 20 29 3b 0a 20  pPg->inCkpt );. 
11ab0 20 20 20 20 20 70 50 67 2d 3e 69 6e 43 6b 70 74       pPg->inCkpt
11ac0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
11ad0 3e 70 50 72 65 76 43 6b 70 74 20 3d 20 70 50 67  >pPrevCkpt = pPg
11ae0 2d 3e 70 4e 65 78 74 43 6b 70 74 20 3d 20 30 3b  ->pNextCkpt = 0;
11af0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
11b00 72 2d 3e 70 43 6b 70 74 20 3d 20 30 3b 0a 20 20  r->pCkpt = 0;.  
11b10 7d 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  }.  pPager->ckpt
11b20 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
11b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
11b50 61 63 6b 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  ack a checkpoint
11b60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11b70 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62  pager_stmt_rollb
11b80 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
11b90 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
11ba0 69 66 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  if( pPager->ckpt
11bb0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 72 63 20  InUse ){.    rc 
11bc0 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  = pager_stmt_pla
11bd0 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
11be0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
11bf0 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
11c00 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
11c10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11c20 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
11c30 63 6b 70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  ckptAutoopen = 0
11c40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11c50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11c60 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
11c70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11c80 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
11c90 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
11ca0 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
11cb0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
11cc0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
11cd0 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
11ce0 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
11cf0 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
11d00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
11d10 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20  er_set_codec(.  
11d20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
11d30 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
11d40 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
11d50 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
11d60 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
11d70 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
11d80 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
11d90 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
11da0 64 65 63 41 72 67 3b 0a 7d 0a 0a 23 69 66 64 65  decArg;.}..#ifde
11db0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
11dc0 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
11dd0 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
11de0 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
11df0 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
11e00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11e10 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61  pager_refdump(Pa
11e20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11e30 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
11e40 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
11e50 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
11e60 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
11e70 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
11e80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
11e90 20 20 70 72 69 6e 74 66 28 22 50 41 47 45 20 25    printf("PAGE %
11ea0 33 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e  3d addr=0x%08x n
11eb0 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
11ec0 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69     pPg->pgno, (i
11ed0 6e 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  nt)PGHDR_TO_DATA
11ee0 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
11ef0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.