/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact d627c5e46084b0c757a16cec2c17adcc8046f8ee:


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 33  : pager.c,v 1.13
0350: 32 20 32 30 30 34 2f 30 36 2f 31 38 20 32 33 3a  2 2004/06/18 23:
0360: 32 31 3a 34 37 20 64 6f 75 67 63 75 72 72 69 65  21:47 dougcurrie
0370: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0380: 64 65 20 22 6f 73 2e 68 22 20 20 20 20 20 20 20  de "os.h"       
0390: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 66 69 72    /* Must be fir
03a0: 73 74 20 74 6f 20 65 6e 61 62 6c 65 20 6c 61 72  st to enable lar
03b0: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  ge file support 
03c0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
03d0: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
03e0: 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e  de "pager.h".#in
03f0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0400: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0410: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g.h>../*.** Macr
0420: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
0430: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
0440: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
0450: 23 69 66 20 30 0a 73 74 61 74 69 63 20 50 61 67  #if 0.static Pag
0460: 65 72 20 2a 6d 61 69 6e 50 61 67 65 72 20 3d 20  er *mainPager = 
0470: 30 3b 0a 23 64 65 66 69 6e 65 20 53 45 54 5f 50  0;.#define SET_P
0480: 41 47 45 52 28 58 29 20 20 69 66 28 20 6d 61 69  AGER(X)  if( mai
0490: 6e 50 61 67 65 72 3d 3d 30 20 29 20 6d 61 69 6e  nPager==0 ) main
04a0: 50 61 67 65 72 20 3d 20 28 58 29 0a 23 64 65 66  Pager = (X).#def
04b0: 69 6e 65 20 43 4c 52 5f 50 41 47 45 52 28 58 29  ine CLR_PAGER(X)
04c0: 20 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d    if( mainPager=
04d0: 3d 28 58 29 20 29 20 6d 61 69 6e 50 61 67 65 72  =(X) ) mainPager
04e0: 20 3d 20 30 0a 23 64 65 66 69 6e 65 20 54 52 41   = 0.#define TRA
04f0: 43 45 31 28 58 29 20 20 20 20 20 69 66 28 20 70  CE1(X)     if( p
0500: 50 61 67 65 72 3d 3d 6d 61 69 6e 50 61 67 65 72  Pager==mainPager
0510: 20 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50   ) sqlite3DebugP
0520: 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69 6e 65  rintf(X).#define
0530: 20 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 69   TRACE2(X,Y)   i
0540: 66 28 20 70 50 61 67 65 72 3d 3d 6d 61 69 6e 50  f( pPager==mainP
0550: 61 67 65 72 20 29 20 73 71 6c 69 74 65 33 44 65  ager ) sqlite3De
0560: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0580: 59 2c 5a 29 20 69 66 28 20 70 50 61 67 65 72 3d  Y,Z) if( pPager=
0590: 3d 6d 61 69 6e 50 61 67 65 72 20 29 20 73 71 6c  =mainPager ) sql
05a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
05b0: 58 2c 59 2c 5a 29 0a 23 65 6c 73 65 0a 23 64 65  X,Y,Z).#else.#de
05c0: 66 69 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58  fine SET_PAGER(X
05d0: 29 0a 23 64 65 66 69 6e 65 20 43 4c 52 5f 50 41  ).#define CLR_PA
05e0: 47 45 52 28 58 29 0a 23 64 65 66 69 6e 65 20 54  GER(X).#define T
05f0: 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e 65  RACE1(X).#define
0600: 20 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65   TRACE2(X,Y).#de
0610: 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c  fine TRACE3(X,Y,
0620: 5a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  Z).#endif.../*.*
0630: 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65  * The page cache
0640: 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61   as a whole is a
0650: 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20  lways in one of 
0660: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
0670: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
0680: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
0690: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
06a0: 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  che is not curre
06b0: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
06c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
06d0: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e            writin
06e0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
06f0: 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ile.  There is n
0700: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
0710: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
0720: 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  held in memory. 
0730: 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   This is the ini
0740: 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  tial.**         
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
0760: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ate..**.**   PAG
0770: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20  ER_SHARED       
0780: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0790: 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  is reading the d
07a0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07c0: 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74    Writing is not
07d0: 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65   permitted.  The
07e0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20  re can be.**    
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0800: 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64     multiple read
0810: 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68  ers accessing th
0820: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a  e same database.
0830: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0840: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74           file at
0850: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
0860: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45  **.**   PAGER_RE
0870: 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73  SERVED      This
0880: 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73   process has res
0890: 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61  erved the databa
08a0: 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  se for writing.*
08b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
08c0: 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20          but has 
08d0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79  not yet made any
08e0: 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20   changes.  Only 
08f0: 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20  one process.**  
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63       at a time c
0920: 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64  an reserve the d
0930: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72  atabase.  The or
0940: 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  iginal.**       
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
0970: 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  s not been modif
0980: 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20  ied so other.** 
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20        processes 
09b0: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
09c0: 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b  ding the on-disk
09d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09e0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
09f0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  se file..**.**  
0a00: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
0a10: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0a20: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0a30: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0a60: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0a70: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0a80: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0a90: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
0aa0: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
0ab0: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
0ac0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0af0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  ng..**.**   PAGE
0b00: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20  R_SYNCED        
0b10: 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  The pager moves 
0b20: 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72  to this state fr
0b30: 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  om PAGER_EXCLUSI
0b40: 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  VE.**           
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65              afte
0b60: 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
0b70: 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
0b80: 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ten to the.**   
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0bb0: 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
0bc0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
0bd0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
0be0: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e             disk.
0bf0: 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e   All that remain
0c00: 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65  s to do is to re
0c10: 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  move the.**     
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61    journal file a
0c40: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
0c50: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20  on will be.**   
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a      committed..*
0c80: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61  *.** The page ca
0c90: 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20  che comes up in 
0ca0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0cb0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a  he first time a.
0cc0: 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
0cd0: 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  get() occurs, th
0ce0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0cf0: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0d00: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0d10: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0d20: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0d30: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0d40: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0d50: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0d60: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0d70: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0d80: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0d90: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
0da0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0db0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0dc0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0dd0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0de0: 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65  that sqlite_page
0df0: 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  _write() can onl
0e00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0e10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0e20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0e30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0e40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0e50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0e60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0e70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0e80: 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61  VED.).** The tra
0e90: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0ea0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0eb0: 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e  s when before an
0ec0: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
0ed0: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
0ee0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74  abase file.  Aft
0ef0: 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67  er an sqlite3pag
0f00: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  er_rollback().**
0f10: 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72   or sqlite_pager
0f20: 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73  _commit(), the s
0f30: 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74  tate goes back t
0f40: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
0f50: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
0f60: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
0f70: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
0f80: 52 45 44 20 20 20 20 20 20 31 0a 23 64 65 66 69  RED      1.#defi
0f90: 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ne PAGER_RESERVE
0fa0: 44 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 50  D    2.#define P
0fb0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
0fc0: 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   3.#define PAGER
0fd0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 34 0a 0a  _SYNCED      4..
0fe0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d  ./*.** Each in-m
0ff0: 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61  emory image of a
1000: 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74   page begins wit
1010: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
1020: 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20  header..** This 
1030: 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76  header is only v
1040: 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70  isible to this p
1050: 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68  ager module.  Th
1060: 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65  e client.** code
1070: 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65   that calls page
1080: 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20  r sees only the 
1090: 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
10a0: 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  s the header..**
10b0: 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20  .** Client code 
10c0: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69  should call sqli
10d0: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
10e0: 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72   on a page prior
10f0: 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e   to making.** an
1100: 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  y modifications 
1110: 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  to that page.  T
1120: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71  he first time sq
1130: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1140: 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  ().** is called,
1150: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
1160: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1170: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1180: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1190: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69  rnal and PgHdr.i
11a0: 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48  nJournal and PgH
11b0: 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20  dr.needSync are 
11c0: 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63  set.  Later, onc
11d0: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
11e0: 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69   page has made i
11f0: 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  t onto the disk 
1200: 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e  surface, PgHdr.n
1210: 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c  eedSync.** is cl
1220: 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69  eared.  The modi
1230: 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74  fied page cannot
1240: 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b   be written back
1250: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1260: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1270: 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f  ile until the jo
1280: 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20  urnal pages has 
1290: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
12a0: 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50  isk and the.** P
12b0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61  gHdr.needSync ha
12c0: 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a  s been cleared..
12d0: 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e  **.** The PgHdr.
12e0: 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65  dirty flag is se
12f0: 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 70 61  t when sqlite3pa
1300: 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63  ger_write() is c
1310: 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20  alled and.** is 
1320: 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68  cleared again wh
1330: 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  en the page cont
1340: 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62  ent is written b
1350: 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ack to the origi
1360: 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
1370: 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  file..*/.typedef
1380: 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67   struct PgHdr Pg
1390: 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64  Hdr;.struct PgHd
13a0: 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  r {.  Pager *pPa
13b0: 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
13c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
13d0: 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  r to which this 
13e0: 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  page belongs */.
13f0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
1420: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
1430: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
1440: 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48  extHash, *pPrevH
1450: 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f  ash;  /* Hash co
1460: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f  llision chain fo
1470: 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a  r PgHdr.pgno */.
1480: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72    PgHdr *pNextFr
1490: 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20  ee, *pPrevFree; 
14a0: 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20   /* Freelist of 
14b0: 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66  pages where nRef
14c0: 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ==0 */.  PgHdr *
14d0: 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20  pNextAll;       
14e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73          /* A lis
14f0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
1500: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1510: 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74  Stmt, *pPrevStmt
1520: 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61  ;  /* List of pa
1530: 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  ges in the state
1540: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ment journal */.
1550: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
1580: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1590: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
15a0: 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  inStmt;         
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15c0: 52 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74  RUE if in the st
15d0: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
15e0: 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79  al */.  u8 dirty
15f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1600: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
1610: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69  f we need to wri
1620: 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20  te back changes 
1630: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
1640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1650: 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72      /* Sync jour
1660: 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69  nal before writi
1670: 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  ng this page */.
1680: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
1690: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ack;            
16a0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74   /* Disable dont
16b0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
16c0: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73  this page */.  s
16d0: 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20  hort int nRef;  
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73   Number of users
1700: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f   of this page */
1710: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
1720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1730: 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73    /* Dirty pages
1740: 20 73 6f 72 74 65 64 20 62 79 20 50 67 48 64 72   sorted by PgHdr
1750: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 53 51  .pgno */.  /* SQ
1760: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 20 62  LITE_PAGE_SIZE b
1770: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
1780: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
1790: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
17a0: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
17b0: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
17c0: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
17d0: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
17e0: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
17f0: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
1800: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
1810: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
1820: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
1830: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
1840: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
1850: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
1860: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
1870: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
1880: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1890: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
18a0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
18b0: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
18c0: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
18d0: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
18e0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
18f0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
1900: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
1910: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
1920: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1930: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
1940: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
1950: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
1960: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
1970: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
1980: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
1990: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
19a0: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
19b0: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
19c0: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
19d0: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
19e0: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
19f0: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
1a00: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
1a10: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1a20: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
1a30: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
1a40: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
1a50: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
1a60: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
1a70: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
1a80: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
1a90: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
1aa0: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
1ab0: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
1ac0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1ad0: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
1ae0: 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ent */.};../*.**
1af0: 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f   A macro used fo
1b00: 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63  r invoking the c
1b10: 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73  odec if there is
1b20: 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53   one.*/.#ifdef S
1b30: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
1b40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
1b50: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
1b60: 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64  Codec ){ P->xCod
1b70: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
1b80: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a  D,N,X); }.#else.
1b90: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
1ba0: 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a  ,D,N,X).#endif..
1bb0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1bc0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
1bd0: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
1be0: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
1bf0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
1c00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
1c10: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28  R_TO_DATA(P)  ((
1c20: 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29  void*)(&(P)[1]))
1c30: 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f  .#define DATA_TO
1c40: 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50  _PGHDR(D)  (&((P
1c50: 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a  gHdr*)(D))[-1]).
1c60: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
1c70: 5f 45 58 54 52 41 28 50 29 20 28 28 76 6f 69 64  _EXTRA(P) ((void
1c80: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
1c90: 5b 31 5d 29 29 5b 53 51 4c 49 54 45 5f 50 41 47  [1]))[SQLITE_PAG
1ca0: 45 5f 53 49 5a 45 5d 29 0a 23 64 65 66 69 6e 65  E_SIZE]).#define
1cb0: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50   PGHDR_TO_HIST(P
1cc0: 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20  ,PGR)  \.       
1cd0: 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79       ((PgHistory
1ce0: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
1cf0: 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67  [1]))[(PGR)->pag
1d00: 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78  eSize+(PGR)->nEx
1d10: 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77  tra])../*.** How
1d20: 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68 65   big to make the
1d30: 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65 64   hash table used
1d40: 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e   for locating in
1d50: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a  -memory pages.**
1d60: 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e   by page number.
1d70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47  .*/.#define N_PG
1d80: 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a  _HASH 2048../*.*
1d90: 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e 75  * Hash a page nu
1da0: 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mber.*/.#define 
1db0: 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20  pager_hash(PN)  
1dc0: 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48  ((PN)&(N_PG_HASH
1dd0: 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  -1))../*.** A op
1de0: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
1df0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1e00: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1e10: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
1e20: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68 61  ct Pager {.  cha
1e30: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
1e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1e50: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e60: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
1e70: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
1e80: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1e90: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1ea0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
1eb0: 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20  irectory;       
1ec0: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
1ed0: 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61   hold database a
1ee0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
1ef0: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64 2c   */.  OsFile fd,
1f00: 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20   jfd;           
1f10: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1f20: 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61  ptors for databa
1f30: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a  se and journal *
1f40: 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66 64 3b  /.  OsFile stfd;
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1f70: 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  or for the state
1f80: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a  ment subjournal*
1f90: 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20  /.  int dbSize; 
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1fc0: 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a  es in the file *
1fd0: 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69  /.  int origDbSi
1fe0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1ff0: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
2000: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
2010: 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  nge */.  int stm
2020: 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
2030: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2040: 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67  database (in pag
2050: 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69  es) at stmt_begi
2060: 6e 28 29 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 73  n() */.  off_t s
2070: 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20  tmtJSize;       
2080: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2090: 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f  journal at stmt_
20a0: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
20b0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
20c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20d0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
20e0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
20f0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
2100: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
2110: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
2120: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
2130: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
2140: 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e  m */.  int stmtN
2150: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
2160: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2170: 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20  records in stmt 
2180: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
2190: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21b0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
21c0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
21d0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76  mory page */.  v
21e0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
21f0: 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f  r)(void*,int); /
2200: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
2210: 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67  ine when freeing
2220: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
2230: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76 6f   (*xReiniter)(vo
2240: 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43  id*,int);   /* C
2250: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
2260: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
2270: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 70  pages */.  int p
2280: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
2290: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22a0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
22b0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  age */.  int nPa
22c0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
22d0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
22e0: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
22f0: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  y pages */.  int
2300: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2310: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2320: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2330: 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72  pages with PgHdr
2340: 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74  .nRef>0 */.  int
2350: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
2360: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2370: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
2380: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
2390: 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  ache */.  int nH
23a0: 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c  it, nMiss, nOvfl
23b0: 3b 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68  ;     /* Cache h
23c0: 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e  its, missing, an
23d0: 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20  d LRU overflows 
23e0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
23f0: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
2400: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
2410: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
2420: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
2430: 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b  void *pCodecArg;
2440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2450: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
2460: 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 75   xCodec() */.  u
2470: 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20  8 journalOpen;  
2480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2490: 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ue if journal fi
24a0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69  le descriptors i
24b0: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20  s valid */.  u8 
24c0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20  journalStarted; 
24d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
24e0: 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f   if header of jo
24f0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
2500: 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e  */.  u8 useJourn
2510: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2520: 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61   /* Use a rollba
2530: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ck journal on th
2540: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  is file */.  u8 
2550: 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20  stmtOpen;       
2560: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2570: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
2580: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20  t subjournal is 
2590: 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d  open */.  u8 stm
25a0: 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20  tInUse;         
25b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65        /* True we
25c0: 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d   are in a statem
25d0: 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
25e0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41  on */.  u8 stmtA
25f0: 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20  utoopen;        
2600: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74      /* Open stmt
2610: 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61   journal when ma
2620: 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  in journal is op
2630: 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ened*/.  u8 noSy
2640: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2650: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
2660: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2670: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
2680: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
2690: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
26a0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
26b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
26c0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
26d0: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
26e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
26f0: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2700: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
2710: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d  tc. */.  u8 errM
2720: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
2730: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
2740: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
2750: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74  errors */.  u8 t
2760: 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20  empFile;        
2770: 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2780: 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72  name is a tempor
2790: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ary file */.  u8
27a0: 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20   readOnly;      
27b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
27c0: 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
27d0: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
27e0: 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20  u8 needSync;    
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2800: 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28  rue if an fsync(
2810: 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74  ) is needed on t
2820: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2830: 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20  u8 dirtyCache;  
2840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2850: 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61  rue if cached pa
2860: 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  ges have changed
2870: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2880: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
2890: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e    /* Disable don
28a0: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
28b0: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
28c0: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28e0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
28f0: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
2900: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2920: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2930: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2940: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2950: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
2960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2970: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2980: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2990: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  base */.  int nM
29a0: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
29b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29c0: 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 73 65  of bytes to rese
29d0: 72 76 65 20 66 6f 72 20 6d 61 73 74 65 72 20 6a  rve for master j
29e0: 2e 70 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64  .p */.  BusyHand
29f0: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
2a00: 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  r;  /* Pointer t
2a10: 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e  o sqlite.busyHan
2a20: 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20  dler */.  PgHdr 
2a30: 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b  *pFirst, *pLast;
2a40: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2a50: 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
2a60: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53 79   PgHdr *pFirstSy
2a70: 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  nced;        /* 
2a80: 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  First free page 
2a90: 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53  with PgHdr.needS
2aa0: 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64  ync==0 */.  PgHd
2ab0: 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20  r *pAll;        
2ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
2ad0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2ae0: 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20    PgHdr *pStmt; 
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b00: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
2b10: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
2b20: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
2b30: 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50  PgHdr *aHash[N_P
2b40: 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48  G_HASH];    /* H
2b50: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
2b60: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
2b70: 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  PgHdr */.};../*.
2b80: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69 74  ** These are bit
2b90: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65  s that can be se
2ba0: 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61  t in Pager.errMa
2bb0: 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  sk..*/.#define P
2bc0: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20  AGER_ERR_FULL   
2bd0: 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72 69    0x01  /* a wri
2be0: 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23  te() failed */.#
2bf0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
2c00: 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20 20  _MEM      0x02  
2c10: 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  /* malloc() fail
2c20: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ed */.#define PA
2c30: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20  GER_ERR_LOCK    
2c40: 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72 20   0x04  /* error 
2c50: 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  in the locking p
2c60: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69  rotocol */.#defi
2c70: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  ne PAGER_ERR_COR
2c80: 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20 64  RUPT  0x08  /* d
2c90: 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e  atabase or journ
2ca0: 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  al corruption */
2cb0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
2cc0: 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31 30  RR_DISK     0x10
2cd0: 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69 73    /* general dis
2ce0: 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61  k I/O error - ba
2cf0: 64 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a 2f  d hard drive? */
2d00: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
2d10: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
2d20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
2d30: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
2d40: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
2d50: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
2d60: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
2d70: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
2d80: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
2d90: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
2da0: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
2db0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
2dc0: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
2dd0: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
2de0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
2df0: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
2e00: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
2e10: 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a  rnal is begin.**
2e20: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
2e30: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
2e40: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
2e50: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
2e60: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
2e70: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
2e80: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
2e90: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
2ea0: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
2eb0: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
2ec0: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
2ed0: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
2ee0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
2ef0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
2f00: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
2f10: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
2f20: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
2f30: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
2f40: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
2f50: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
2f60: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
2f70: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
2f80: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
2f90: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
2fa0: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
2fb0: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
2fc0: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
2fd0: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
2fe0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
2ff0: 64 20 74 68 65 20 53 51 4c 49 54 45 5f 50 41 47  d the SQLITE_PAG
3000: 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66 20  E_SIZE bytes of 
3010: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
3020: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
3030: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
3040: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
3050: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
3060: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
3070: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
3080: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
3090: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
30a0: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
30b0: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
30c0: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
30d0: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
30e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
30f0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
3100: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
3110: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
3120: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
3130: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
3140: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
3150: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
3160: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
3170: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
3180: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
3190: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
31a0: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
31b0: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
31c0: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
31d0: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
31e0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
31f0: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
3200: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
3210: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
3220: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
3230: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
3240: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
3250: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
3260: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
3270: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
3280: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
3290: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
32a0: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
32b0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65   journal is dete
32c0: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
32d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
32e0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  s..*/.#define JO
32f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
3300: 67 65 72 29 20 28 32 34 20 2b 20 28 70 50 61 67  ger) (24 + (pPag
3310: 65 72 29 2d 3e 6e 4d 61 73 74 65 72 29 0a 23 64  er)->nMaster).#d
3320: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
3330: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
3340: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
3350: 20 2b 20 38 29 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e   + 8).../*.** En
3360: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63  able reference c
3370: 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28 66  ount tracking (f
3380: 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68 65  or debugging) he
3390: 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  re:.*/.#ifdef SQ
33a0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
33b0: 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65  pager3_refinfo_e
33c0: 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61  nable = 0;.  sta
33d0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
33e0: 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70 29  efinfo(PgHdr *p)
33f0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74  {.    static int
3400: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66   cnt = 0;.    if
3410: 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e 66  ( !pager3_refinf
3420: 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72  o_enable ) retur
3430: 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 0a 20  n;.    printf(. 
3440: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
3450: 34 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e  4d addr=0x%08x n
3460: 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Ref=%d\n",.     
3470: 20 20 70 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29    p->pgno, (int)
3480: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
3490: 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  , p->nRef.    );
34a0: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
34b0: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
34c0: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
34d0: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
34e0: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
34f0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
3500: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
3510: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
3520: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
3530: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
3540: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
3550: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
3560: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
3570: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
3580: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
3590: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
35a0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
35b0: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
35c0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
35d0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
35e0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
35f0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
3600: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
3610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3620: 72 65 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c  read32bits(OsFil
3630: 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73  e *fd, u32 *pRes
3640: 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20  ){.  u32 res;.  
3650: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
3660: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
3670: 20 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65   &res, sizeof(re
3680: 73 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  s));.  if( rc==S
3690: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
36b0: 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [4];.    memcpy(
36c0: 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20 20  ac, &res, 4);.  
36d0: 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c    res = (ac[0]<<
36e0: 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36  24) | (ac[1]<<16
36f0: 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c  ) | (ac[2]<<8) |
3700: 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70   ac[3];.  }.  *p
3710: 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65 74  Res = res;.  ret
3720: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3730: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
3740: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
3750: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3760: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
3770: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
3780: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
3790: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
37a0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
37b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37c0: 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69  write32bits(OsFi
37d0: 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29  le *fd, u32 val)
37e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
37f0: 72 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d  r ac[4];.  ac[0]
3800: 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30   = (val>>24) & 0
3810: 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28  xff;.  ac[1] = (
3820: 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b  val>>16) & 0xff;
3830: 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e  .  ac[2] = (val>
3840: 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  >8) & 0xff;.  ac
3850: 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66  [3] = val & 0xff
3860: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
3870: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
3880: 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 4);.}../*.** W
3890: 72 69 74 65 20 74 68 65 20 33 32 2d 62 69 74 20  rite the 32-bit 
38a0: 69 6e 74 65 67 65 72 20 27 76 61 6c 27 20 69 6e  integer 'val' in
38b0: 74 6f 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  to the page iden
38c0: 74 69 66 69 65 64 20 62 79 20 70 61 67 65 20 68  tified by page h
38d0: 65 61 64 65 72 0a 2a 2a 20 27 70 27 20 61 74 20  eader.** 'p' at 
38e0: 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 2e  offset 'offset'.
38f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3900: 73 74 6f 72 65 33 32 62 69 74 73 28 75 33 32 20  store32bits(u32 
3910: 76 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20 69  val, PgHdr *p, i
3920: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e  nt offset){.  un
3930: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b  signed char *ac;
3940: 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67  .  ac = &((unsig
3950: 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f  ned char*)PGHDR_
3960: 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73  TO_DATA(p))[offs
3970: 65 74 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28  et];.  ac[0] = (
3980: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
3990: 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e  .  ac[1] = (val>
39a0: 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >16) & 0xff;.  a
39b0: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
39c0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20  & 0xff;.  ac[3] 
39d0: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a  = val & 0xff;.}.
39e0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
39f0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20  -bit integer at 
3a00: 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20  offset 'offset' 
3a10: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64  from the page id
3a20: 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
3a30: 61 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a  age header 'p'..
3a40: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65  */.static u32 re
3a50: 74 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48  trieve32bits(PgH
3a60: 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65  dr *p, int offse
3a70: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
3a80: 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20  har *ac;.  ac = 
3a90: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
3aa0: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
3ab0: 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72  p))[offset];.  r
3ac0: 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34  eturn (ac[0]<<24
3ad0: 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20  ) | (ac[1]<<16) 
3ae0: 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61  | (ac[2]<<8) | a
3af0: 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  c[3];.}.../*.** 
3b00: 43 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73  Convert the bits
3b10: 20 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e   in the pPager->
3b20: 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20  errMask into an 
3b30: 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65  approprate.** re
3b40: 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  turn code..*/.st
3b50: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
3b60: 72 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50  rrcode(Pager *pP
3b70: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
3b80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
3b90: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
3ba0: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c  sk & PAGER_ERR_L
3bb0: 4f 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51  OCK )    rc = SQ
3bc0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20  LITE_PROTOCOL;. 
3bd0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
3be0: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
3bf0: 5f 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20  _DISK )    rc = 
3c00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
3c10: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
3c20: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
3c30: 46 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53  FULL )    rc = S
3c40: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66  QLITE_FULL;.  if
3c50: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
3c60: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45  k & PAGER_ERR_ME
3c70: 4d 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c  M )     rc = SQL
3c80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28  ITE_NOMEM;.  if(
3c90: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3ca0: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52   & PAGER_ERR_COR
3cb0: 52 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49  RUPT ) rc = SQLI
3cc0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65  TE_CORRUPT;.  re
3cd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3ce0: 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  * Add or remove 
3cf0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
3d00: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
3d10: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
3d20: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a  e.** statement j
3d30: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
3d40: 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20  e Pager keeps a 
3d50: 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66  separate list of
3d60: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
3d70: 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
3d80: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
3d90: 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c  urnal.  This hel
3da0: 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61  ps the sqlite3pa
3db0: 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
3dc0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e  ).** routine run
3dd0: 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72   MUCH faster for
3de0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
3df0: 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65   where there are
3e00: 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69   many.** pages i
3e10: 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c  n memory but onl
3e20: 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74  y a few are in t
3e30: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
3e40: 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
3e50: 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f  void page_add_to
3e60: 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72  _stmt_list(PgHdr
3e70: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
3e80: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
3e90: 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67  Pager;.  if( pPg
3ea0: 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72  ->inStmt ) retur
3eb0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  n;.  assert( pPg
3ec0: 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26  ->pPrevStmt==0 &
3ed0: 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  & pPg->pNextStmt
3ee0: 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50  ==0 );.  pPg->pP
3ef0: 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  revStmt = 0;.  i
3f00: 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  f( pPager->pStmt
3f10: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
3f20: 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  pStmt->pPrevStmt
3f30: 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
3f40: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  g->pNextStmt = p
3f50: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20  Pager->pStmt;.  
3f60: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
3f70: 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74  pPg;.  pPg->inSt
3f80: 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63  mt = 1;.}.static
3f90: 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76   void page_remov
3fa0: 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
3fb0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
3fc0: 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74  if( !pPg->inStmt
3fd0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3fe0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
3ff0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4000: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70  Pg->pPrevStmt->p
4010: 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b  NextStmt==pPg );
4020: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53  .    pPg->pPrevS
4030: 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  tmt->pNextStmt =
4040: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
4050: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
4060: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
4070: 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b  r->pStmt==pPg );
4080: 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
4090: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  ->pStmt = pPg->p
40a0: 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20  NextStmt;.  }.  
40b0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  if( pPg->pNextSt
40c0: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
40d0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
40e0: 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67  ->pPrevStmt==pPg
40f0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   );.    pPg->pNe
4100: 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  xtStmt->pPrevStm
4110: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74  t = pPg->pPrevSt
4120: 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  mt;.  }.  pPg->p
4130: 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
4140: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
4150: 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d   0;.  pPg->inStm
4160: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
4170: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
4180: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
4190: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
41a0: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
41b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
41c0: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
41d0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
41e0: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
41f0: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
4200: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
4210: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20  no){.  PgHdr *p 
4220: 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
4230: 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
4240: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26  ];.  while( p &&
4250: 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29   p->pgno!=pgno )
4260: 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  {.    p = p->pNe
4270: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65  xtHash;.  }.  re
4280: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
4290: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
42a0: 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74  base and clear t
42b0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
42c0: 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
42d0: 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74  e.** sets the st
42e0: 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
42f0: 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74   back to what it
4300: 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73   was when it was
4310: 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64   first.** opened
4320: 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69  .  Any outstandi
4330: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
4340: 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62  alidated and sub
4350: 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73  sequent attempts
4360: 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
4370: 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c  ose pages will l
4380: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
4390: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73  a coredump..*/.s
43a0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
43b0: 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
43c0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
43d0: 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66  pPg, *pNext;.  f
43e0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
43f0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
4400: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
4410: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
4420: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4430: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  pPg);.  }.  pPag
4440: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a  er->pFirst = 0;.
4450: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
4460: 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50  Synced = 0;.  pP
4470: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
4480: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
4490: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50  = 0;.  memset(pP
44a0: 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
44b0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
44c0: 48 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72  Hash));.  pPager
44d0: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  ->nPage = 0;.  i
44e0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
44f0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
4500: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70   ){.    sqlite3p
4510: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
4520: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
4530: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
4540: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
4550: 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  K);.  pPager->st
4560: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
4570: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  CK;.  pPager->db
4580: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61  Size = -1;.  pPa
4590: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20  ger->nRef = 0;. 
45a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
45b0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
45c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  );.}../*.** When
45d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
45e0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
45f0: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
4600: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
4610: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
4620: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
4630: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
4640: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
4650: 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20  releases.** the 
4660: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
4670: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
4680: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
4690: 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72  place.  The jour
46a0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64  nal.** file is d
46b0: 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  eleted and close
46c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
46d0: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
46e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
46f0: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
4700: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
4710: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
4720: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
4730: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
4740: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
4750: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
4760: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
4770: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
4780: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e  tic int pager_un
4790: 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20  writelock(Pager 
47a0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
47b0: 72 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74  r *pPg;.  assert
47c0: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
47d0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
47e0: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
47f0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
4800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4810: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67    }.  sqlite3pag
4820: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
4830: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
4840: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
4850: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
4860: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
4870: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
4880: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
4890: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
48a0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
48b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
48c0: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
48d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
48e0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
48f0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
4900: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
4910: 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nal);.    sqlite
4920: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
4930: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
4940: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
4950: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
4960: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
4970: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
4980: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
4990: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
49a0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
49b0: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
49c0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
49d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
49e0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
49f0: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
4a00: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
4a10: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
4a20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
4a30: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
4a40: 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
4a50: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
4a60: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
4a70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
4a80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
4a90: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
4aa0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  n a checksum for
4ab0: 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74   the page of dat
4ac0: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  a..**.** This is
4ad0: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
4ae0: 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61  ksum.  It is rea
4af0: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
4b00: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
4b10: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
4b20: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75   and the page nu
4b30: 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69  mber.  We experi
4b40: 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  mented with.** a
4b50: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
4b60: 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75   entire data, bu
4b70: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
4b80: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
4b90: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
4ba0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
4bb0: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
4bc0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
4bd0: 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ata and.** the c
4be0: 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
4bf0: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
4c00: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
4c10: 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  .  If journal.**
4c20: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
4c30: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
4c40: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
4c50: 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61  ost likely scena
4c60: 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f  rio.** is that o
4c70: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
4c80: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
4c90: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
4ca0: 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63  d.  It is.** muc
4cb0: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
4cc0: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
4cd0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
4ce0: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
4cf0: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
4d00: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
4d10: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
4d20: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
4d30: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
4d40: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
4d50: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
4d60: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
4d70: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
4d80: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69  * FIX ME:  Consi
4d90: 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79  der adding every
4da0: 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62   200th (or so) b
4db0: 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  yte of the data 
4dc0: 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  to the.** checks
4dd0: 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66  um.  That way if
4de0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73   a single page s
4df0: 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64  pans 3 or more d
4e00: 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a  isk sectors and.
4e10: 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64  ** only the midd
4e20: 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72  le sector is cor
4e30: 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74  rupt, we will st
4e40: 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f  ill have a reaso
4e50: 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20  nable.** chance 
4e60: 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63  of failing the c
4e70: 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73  hecksum and thus
4e80: 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70   detecting the p
4e90: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  roblem..*/.stati
4ea0: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
4eb0: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
4ec0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73   Pgno pgno, cons
4ed0: 74 20 63 68 61 72 20 2a 61 44 61 74 61 29 7b 0a  t char *aData){.
4ee0: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
4ef0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
4f00: 2b 20 70 67 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  + pgno;.  return
4f10: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
4f20: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
4f30: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
4f40: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
4f50: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
4f60: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
4f70: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
4f80: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
4f90: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
4fa0: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
4fb0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
4fc0: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
4fd0: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
4fe0: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
4ff0: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
5000: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
5010: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
5020: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
5030: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
5040: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
5050: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
5060: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
5070: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
5080: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
5090: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
50a0: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
50b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
50c0: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
50d0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
50e0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5100: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
5110: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
5120: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
5130: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
5140: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
5150: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
5160: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
5170: 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54    u8 aData[SQLIT
5180: 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 20  E_PAGE_SIZE];   
5190: 2f 2a 20 53 74 6f 72 65 20 64 61 74 61 20 68 65  /* Store data he
51a0: 72 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 72 65  re */..  rc = re
51b0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70  ad32bits(jfd, &p
51c0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
51d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
51e0: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
51f0: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
5200: 20 26 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d   &aData, pPager-
5210: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
5220: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5230: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5240: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
5250: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
5260: 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
5270: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
5280: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
5290: 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
52a0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
52b0: 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
52c0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
52d0: 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
52e0: 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
52f0: 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
5300: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
5310: 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
5320: 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
5330: 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
5340: 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
5350: 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
5360: 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
5370: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
5380: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5390: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
53a0: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
53b0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
53c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
53d0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
53e0: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
53f0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
5400: 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  s(jfd, &cksum);.
5410: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
5420: 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
5430: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
5440: 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29  er, pgno, aData)
5450: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
5460: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
5470: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
5480: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
5490: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
54a0: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
54b0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
54c0: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
54d0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
54e0: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
54f0: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
5500: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
5510: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
5520: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
5530: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
5540: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
5550: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
5560: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
5570: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
5580: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
5590: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
55a0: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
55b0: 2a 20 46 49 58 20 4d 45 3a 20 49 64 65 61 6c 6c  * FIX ME: Ideall
55c0: 79 20 74 68 65 20 70 61 67 65 20 77 6f 75 6c 64  y the page would
55d0: 20 6f 6e 6c 79 20 62 65 20 6c 65 66 74 20 6d 61   only be left ma
55e0: 72 6b 65 64 20 64 69 72 74 79 20 77 68 65 6e 20  rked dirty when 
55f0: 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 69  the.  ** pager i
5600: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
5610: 61 74 65 20 69 66 20 69 74 20 77 61 73 20 64 69  ate if it was di
5620: 72 74 79 20 77 68 65 6e 20 74 68 69 73 20 73 74  rty when this st
5630: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61  atement.  ** tra
5640: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
5650: 72 74 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rted. .  **.  **
5660: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
5670: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
5680: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
5690: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
56a0: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
56b0: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
56c0: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
56d0: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
56e0: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
56f0: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
5700: 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74   pgno);.  assert
5710: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
5720: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
5730: 20 7c 7c 20 70 50 67 20 29 3b 0a 20 20 54 52 41   || pPg );.  TRA
5740: 43 45 32 28 22 50 4c 41 59 42 41 43 4b 20 70 61  CE2("PLAYBACK pa
5750: 67 65 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 29 3b  ge %d\n", pgno);
5760: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
5770: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
5780: 55 53 49 56 45 20 29 7b 0a 20 20 20 20 73 71 6c  USIVE ){.    sql
5790: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
57a0: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
57b0: 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54 45 5f 50  *(off_t)SQLITE_P
57c0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 72  AGE_SIZE);.    r
57d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
57e0: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
57f0: 61 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  aData, SQLITE_PA
5800: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a 20 20  GE_SIZE);.  }.  
5810: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
5820: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
5830: 20 65 76 65 72 20 62 65 20 72 6f 6c 6c 65 64 20   ever be rolled 
5840: 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
5850: 75 73 65 2c 20 65 78 63 65 70 74 20 66 6f 72 20  use, except for 
5860: 70 61 67 65 0a 20 20 20 20 2a 2a 20 31 20 77 68  page.    ** 1 wh
5870: 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
5880: 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
5890: 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
58a0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
58b0: 20 2a 2a 20 61 63 74 69 76 65 2e 0a 20 20 20 20   ** active..    
58c0: 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
58d0: 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
58e0: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
58f0: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  pPg->pgno==1 );.
5900: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
5910: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
5920: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
5930: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
5940: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
5950: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
5960: 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a  tructor ){  /***
5970: 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64   FIX ME:  Should
5980: 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74   this be xReinit
5990: 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61  ? ***/.      pPa
59a0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
59b0: 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  (pData, pPager->
59c0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
59d0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
59e0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
59f0: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
5a00: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
5a10: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
5a20: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
5a30: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
5a40: 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
5a50: 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65  no, 3);.  }.  re
5a60: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5a70: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
5a80: 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
5a90: 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
5aa0: 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
5ab0: 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
5ac0: 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
5ad0: 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
5ae0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
5af0: 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
5b00: 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
5b10: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
5b20: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
5b30: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
5b40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5b50: 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
5b60: 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
5b70: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
5b80: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
5b90: 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
5ba0: 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  all child journa
5bb0: 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69  ls..** To tell i
5bc0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
5bd0: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
5be0: 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68  d, check to each
5bf0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64   of the.** child
5c00: 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69  ren.  If all chi
5c10: 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72  ldren are either
5c20: 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e   missing or do n
5c30: 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61  ot refer to.** a
5c40: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
5c50: 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  r journal, then 
5c60: 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72  this master jour
5c70: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
5c80: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
5c90: 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
5ca0: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  r(const char *zM
5cb0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
5cc0: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
5cd0: 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c  pen = 0;.  OsFil
5ce0: 65 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72  e master;.  char
5cf0: 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
5d00: 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
5d10: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
5d20: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 6f 66  nal file */.  of
5d30: 66 5f 74 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  f_t nMasterJourn
5d40: 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  al;     /* Size 
5d50: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
5d60: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
5d70: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
5d80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63  journal file exc
5d90: 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65  lusively in case
5da0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
5db0: 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e  ess.  ** is runn
5dc0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
5dd0: 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20   also. Not that 
5de0: 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63  it makes too muc
5df0: 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  h difference..  
5e00: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
5e10: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
5e20: 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65  (zMaster, &maste
5e30: 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r, 0);.  if( rc!
5e40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
5e50: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
5e60: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
5e70: 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   1;.  rc = sqlit
5e80: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61  e3OsFileSize(&ma
5e90: 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
5ea0: 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
5eb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
5ec0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
5ed0: 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  ;..  if( nMaster
5ee0: 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  Journal>0 ){.   
5ef0: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
5f00: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
5f10: 65 72 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 6e  erPtr;.    int n
5f20: 4d 61 73 74 65 72 50 74 72 3b 20 20 20 2f 2a 20  MasterPtr;   /* 
5f30: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
5f40: 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 7a 4d 61  allocated at zMa
5f50: 73 74 65 72 50 74 72 20 2a 2f 0a 0a 20 20 20 20  sterPtr */..    
5f60: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
5f70: 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
5f80: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
5f90: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
5fa0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c      ** sqliteMal
5fb0: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
5fc0: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
5fd0: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 0a  ournal. .    **.
5fe0: 20 20 20 20 2a 2a 20 41 6c 73 6f 20 61 6c 6c 6f      ** Also allo
5ff0: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 28 73  cate an extra (s
6000: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 2b 31  trlen(zMaster)+1
6010: 29 20 62 79 74 65 73 2e 20 54 68 69 73 20 73 70  ) bytes. This sp
6020: 61 63 65 20 69 73 20 75 73 65 64 0a 20 20 20 20  ace is used.    
6030: 2a 2a 20 74 6f 20 6c 6f 61 64 20 61 20 6d 61 73  ** to load a mas
6040: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
6050: 6e 61 6d 65 20 66 72 6f 6d 20 73 6f 6d 65 20 6f  name from some o
6060: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ther journal fil
6070: 65 20 74 6f 0a 20 20 20 20 2a 2a 20 63 68 65 63  e to.    ** chec
6080: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
6090: 74 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  t this master jo
60a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
60b0: 2a 2f 0a 20 20 20 20 6e 4d 61 73 74 65 72 50 74  */.    nMasterPt
60c0: 72 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  r = strlen(zMast
60d0: 65 72 29 20 2b 20 31 3b 0a 20 20 20 20 7a 4d 61  er) + 1;.    zMa
60e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
60f0: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
6100: 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
6110: 6c 29 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 3b  l) + nMasterPtr;
6120: 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
6130: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
6140: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
6150: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
6160: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
6170: 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72     }.    zMaster
6180: 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
6190: 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
61a0: 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20  rnal];.    rc = 
61b0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 6d  sqlite3OsRead(&m
61c0: 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
61d0: 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f  urnal, nMasterJo
61e0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  urnal);.    if( 
61f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6200: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
6210: 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61  ut;..    zJourna
6220: 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
6230: 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
6240: 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
6250: 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
6260: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
6270: 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
6280: 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61  leExists(zJourna
6290: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  l) ){.        /*
62a0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
62b0: 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
62c0: 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
62d0: 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
62e0: 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
62f0: 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
6300: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
6310: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
6320: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c  f.        ** so,
6330: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
6340: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
6350: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
6360: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
6370: 20 20 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75 72       OsFile jour
6380: 6e 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  nal;.        int
6390: 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20 20   nMaster;.      
63a0: 20 20 6f 66 66 5f 74 20 6a 73 7a 3b 0a 0a 20 20    off_t jsz;..  
63b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
63c0: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
63d0: 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72  (zJournal, &jour
63e0: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
63f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6400: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6410: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75  ite3OsClose(&jou
6420: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  rnal);.         
6430: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
6440: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
6450: 09 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  ./* Check if the
6460: 20 66 69 6c 65 20 69 73 20 62 69 67 20 65 6e 6f   file is big eno
6470: 75 67 68 20 74 6f 20 62 65 20 61 20 6a 6f 75 72  ugh to be a jour
6480: 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  nal file.       
6490: 20 2a 2a 20 77 69 74 68 20 74 68 65 20 72 65 71   ** with the req
64a0: 75 69 72 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  uired master jou
64b0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 49 66 20 6e 6f  rnal name. If no
64c0: 74 2c 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  t, ignore it..  
64d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
64e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
64f0: 69 6c 65 53 69 7a 65 28 26 6a 6f 75 72 6e 61 6c  ileSize(&journal
6500: 2c 20 26 6a 73 7a 29 3b 0a 20 20 20 20 20 20 20  , &jsz);.       
6510: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6520: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
6530: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
6540: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
6550: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
6560: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
6570: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 73  }.        if( js
6580: 7a 3c 28 32 35 2b 73 74 72 6c 65 6e 28 7a 4d 61  z<(25+strlen(zMa
6590: 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20  ster)) ){.      
65a0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
65b0: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
65c0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
65d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
65e0: 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20      .        /* 
65f0: 53 65 65 6b 20 74 6f 20 74 68 65 20 70 6f 69 6e  Seek to the poin
6600: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
6610: 20 77 68 65 72 65 20 74 68 65 20 6d 61 73 74 65   where the maste
6620: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r journal name. 
6630: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 6f         ** is sto
6640: 72 65 64 2e 20 52 65 61 64 20 74 68 65 20 6d 61  red. Read the ma
6650: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6660: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
6670: 74 61 69 6e 65 64 0a 20 20 20 20 20 20 20 20 2a  tained.        *
6680: 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 20  * from malloc.. 
6690: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
66a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
66b0: 53 65 65 6b 28 26 6a 6f 75 72 6e 61 6c 2c 20 32  Seek(&journal, 2
66c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
66d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
66e0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
66f0: 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ut;.        rc =
6700: 20 72 65 61 64 33 32 62 69 74 73 28 26 6a 6f 75   read32bits(&jou
6710: 72 6e 61 6c 2c 20 28 75 33 32 2a 29 26 6e 4d 61  rnal, (u32*)&nMa
6720: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ster);.        i
6730: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6740: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
6750: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69  r_out;.        i
6760: 66 28 20 6e 4d 61 73 74 65 72 3e 3d 6e 4d 61 73  f( nMaster>=nMas
6770: 74 65 72 50 74 72 20 29 7b 0a 20 20 20 20 20 20  terPtr ){.      
6780: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6790: 4f 73 52 65 61 64 28 26 6a 6f 75 72 6e 61 6c 2c  OsRead(&journal,
67a0: 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
67b0: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
67c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
67d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
67e0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
67f0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
6800: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
6810: 66 28 20 7a 4d 61 73 74 65 72 50 74 72 5b 6e 4d  f( zMasterPtr[nM
6820: 61 73 74 65 72 50 74 72 2d 31 5d 3d 3d 27 5c 30  asterPtr-1]=='\0
6830: 27 20 26 26 20 21 73 74 72 63 6d 70 28 7a 4d 61  ' && !strcmp(zMa
6840: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
6850: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
6860: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
6870: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
6880: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
6890: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
68a0: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
68b0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
68c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
68d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
68e0: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
68f0: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
6900: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
6910: 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c   .  sqlite3OsDel
6920: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64  ete(zMaster);..d
6930: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
6940: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
6950: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
6960: 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  Free(zMasterJour
6970: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
6980: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
6990: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
69a0: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
69b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
69c0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65  ../*.** Make eve
69d0: 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ry page in the c
69e0: 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20  ache agree with 
69f0: 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
6a00: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
6a10: 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20  ,.** reread the 
6a20: 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68  disk to reset th
6a30: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
6a40: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
6a50: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6a60: 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62  ed after a rollb
6a70: 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d  ack in which som
6a80: 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63  e of the dirty c
6a90: 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61  ache.** pages ha
6aa0: 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  d never been wri
6ab0: 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tten out to disk
6ac0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
6ad0: 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63  ll back the.** c
6ae0: 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64  ache content and
6af0: 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79   the easiest way
6b00: 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74   to do that is t
6b10: 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64  o reread the old
6b20: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b   content.** back
6b30: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a   from the disk..
6b40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
6b50: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
6b60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
6b70: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
6b80: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6b90: 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  _OK;.  for(pPg=p
6ba0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
6bb0: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
6bc0: 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  All){.    char z
6bd0: 42 75 66 5b 53 51 4c 49 54 45 5f 50 41 47 45 5f  Buf[SQLITE_PAGE_
6be0: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20 21  SIZE];.    if( !
6bf0: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
6c00: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
6c10: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
6c20: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
6c30: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
6c40: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
6c50: 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 50  er->fd, SQLITE_P
6c60: 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74 29  AGE_SIZE*(off_t)
6c70: 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a  (pPg->pgno-1));.
6c80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6c90: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
6ca0: 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 53 51 4c 49  ->fd, zBuf, SQLI
6cb0: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
6cc0: 20 20 20 20 20 54 52 41 43 45 32 28 22 52 45 46       TRACE2("REF
6cd0: 45 54 43 48 20 70 61 67 65 20 25 64 5c 6e 22 2c  ETCH page %d\n",
6ce0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
6cf0: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
6d00: 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   zBuf, pPg->pgno
6d10: 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 2);.      if( 
6d20: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
6d30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
6d40: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 53 51 4c  set(zBuf, 0, SQL
6d50: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
6d60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
6d70: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65  g->nRef==0 || me
6d80: 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52  mcmp(zBuf, PGHDR
6d90: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 53  _TO_DATA(pPg), S
6da0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
6db0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
6dc0: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
6dd0: 50 67 29 2c 20 7a 42 75 66 2c 20 53 51 4c 49 54  Pg), zBuf, SQLIT
6de0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
6df0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
6e00: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
6e10: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
6e20: 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f  initer(PGHDR_TO_
6e30: 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
6e40: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
6e50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6e60: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
6e70: 54 4f 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30  TO_EXTRA(pPg), 0
6e80: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
6e90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6ea0: 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
6eb0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  nc = 0;.    pPg-
6ec0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
6ed0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6ee0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
6ef0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
6f00: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
6f10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
6f20: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
6f30: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
6f40: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
6f50: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
6f60: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6f70: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
6f80: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
6f90: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
6fa0: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
6fb0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
6fc0: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
6fd0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
6fe0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
6ff0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
7000: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
7010: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
7020: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
7030: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
7040: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
7050: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
7060: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
7070: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
7080: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
7090: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
70a0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
70b0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
70c0: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
70d0: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
70e0: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
70f0: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
7100: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
7110: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
7120: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
7130: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
7140: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
7150: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
7160: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
7170: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
7180: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
7190: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
71a0: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
71b0: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
71c0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
71d0: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
71e0: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
71f0: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
7200: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
7210: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
7220: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
7230: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
7240: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
7250: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
7260: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
7270: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
7280: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
7290: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
72a0: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
72b0: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
72c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
72d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
72e0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
72f0: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
7300: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
7310: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
7320: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
7330: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
7340: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
7350: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
7360: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
7370: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
7380: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
7390: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
73a0: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
73b0: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
73c0: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
73d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
73e0: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
73f0: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
7400: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
7410: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
7420: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
7430: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
7440: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
7450: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
7460: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
7470: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
7480: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
7490: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
74a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
74b0: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
74c0: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
74d0: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
74e0: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
74f0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
7500: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
7510: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
7520: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
7530: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
7540: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
7550: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
7560: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
7570: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
7580: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
7590: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
75a0: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
75b0: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
75c0: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
75d0: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
75e0: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
75f0: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
7600: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
7610: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
7620: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
7630: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
7640: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
7650: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
7660: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
7670: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
7680: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
7690: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
76a0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
76b0: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
76c0: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
76d0: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
76e0: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
76f0: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
7700: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
7710: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
7720: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
7730: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
7740: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
7750: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
7760: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
7770: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
7780: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
7790: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
77a0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
77b0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
77c0: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
77d0: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
77e0: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
77f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7800: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
7810: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
7820: 6c 20 66 69 6c 65 20 74 68 65 6e 20 74 68 65 20  l file then the 
7830: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 6c 69  database will li
7840: 6b 65 6c 79 20 61 6c 72 65 61 64 79 20 62 65 0a  kely already be.
7850: 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 73 6f  ** corrupted, so
7860: 20 74 68 65 20 50 41 47 45 52 5f 45 52 52 5f 43   the PAGER_ERR_C
7870: 4f 52 52 55 50 54 20 62 69 74 20 69 73 20 73 65  ORRUPT bit is se
7880: 74 20 69 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  t in pPager->err
7890: 4d 61 73 6b 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  Mask.** and SQLI
78a0: 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
78b0: 74 75 72 6e 65 64 2e 20 20 49 66 20 69 74 20 61  turned.  If it a
78c0: 6c 6c 20 77 6f 72 6b 73 2c 20 74 68 65 6e 20 74  ll works, then t
78d0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
78e0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
78f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7900: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
7910: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
7920: 74 20 75 73 65 4a 6f 75 72 6e 61 6c 53 69 7a 65  t useJournalSize
7930: 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20  ){.  off_t szJ; 
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7950: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
7960: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
7970: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  es */.  int nRec
7980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7990: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
79a0: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
79b0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
79e0: 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
79f0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
7a00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
7a10: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
7a20: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 6e 73 69   pages */.  unsi
7a30: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
7a40: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
7a50: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
7a60: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
7a70: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7a80: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
7a90: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
7aa0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
7ab0: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
7ac0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ad0: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e  f bytes in the n
7ae0: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
7af0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 63 68 61 72 20  urnal */.  char 
7b00: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
7b10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
7b20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7b30: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
7b40: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
7b50: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
7b60: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
7b70: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
7b80: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
7b90: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
7ba0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
7bb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7bc0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
7bd0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
7be0: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
7bf0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
7c00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
7c10: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
7c20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
7c30: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
7c40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
7c50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7c60: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20  is too small to 
7c70: 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65  contain a comple
7c80: 74 65 20 68 65 61 64 65 72 2c 0a 20 20 2a 2a 20  te header,.  ** 
7c90: 69 74 20 6d 75 73 74 20 6d 65 61 6e 20 74 68 61  it must mean tha
7ca0: 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  t the process th
7cb0: 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20 6a  at created the j
7cc0: 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 0a  ournal was just.
7cd0: 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 74    ** beginning t
7ce0: 6f 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72  o write the jour
7cf0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
7d00: 20 64 69 65 64 2e 20 20 49 6e 20 74 68 61 74 20   died.  In that 
7d10: 63 61 73 65 2c 0a 20 20 2a 2a 20 74 68 65 20 64  case,.  ** the d
7d20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
7d30: 75 6c 64 20 68 61 76 65 20 73 74 69 6c 6c 20 62  uld have still b
7d40: 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75  een completely u
7d50: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 20 4e  nchanged..  ** N
7d60: 6f 74 68 69 6e 67 20 6e 65 65 64 73 20 74 6f 20  othing needs to 
7d70: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
7d80: 20 57 65 20 63 61 6e 20 73 61 66 65 6c 79 20 69   We can safely i
7d90: 67 6e 6f 72 65 20 74 68 69 73 20 6a 6f 75 72 6e  gnore this journ
7da0: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  al..  */.  if( s
7db0: 7a 4a 20 3c 20 32 34 20 29 7b 0a 20 20 20 20 67  zJ < 24 ){.    g
7dc0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
7dd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 28 31 29 20  ;.  }..  /* (1) 
7de0: 52 65 61 64 20 74 68 65 20 62 65 67 69 6e 6e 69  Read the beginni
7df0: 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
7e00: 6c 20 61 6e 64 20 76 65 72 69 66 79 20 74 68 65  l and verify the
7e10: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 0a 20 20   magic string.  
7e20: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
7e30: 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
7e40: 61 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  al. */.  rc = sq
7e50: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
7e60: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
7e70: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
7e80: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7e90: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
7ea0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
7eb0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
7ec0: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
7ed0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
7ee0: 4f 54 4f 43 4f 4c 3b 0a 20 20 20 20 67 6f 74 6f  OTOCOL;.    goto
7ef0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
7f00: 20 7d 0a 0a 20 20 2f 2a 20 28 32 29 20 52 65 61   }..  /* (2) Rea
7f10: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
7f20: 70 61 67 65 73 20 73 74 6f 72 65 64 20 69 6e 20  pages stored in 
7f30: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 2a 2f  the journal.  */
7f40: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7f50: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
7f60: 20 28 75 33 32 2a 29 26 6e 52 65 63 29 3b 0a 20   (u32*)&nRec);. 
7f70: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
7f80: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 69  nd_playback;.  i
7f90: 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
7fa0: 66 66 66 20 7c 7c 20 75 73 65 4a 6f 75 72 6e 61  fff || useJourna
7fb0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e 52 65  lSize ){.    nRe
7fc0: 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  c = (szJ - JOURN
7fd0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
7fe0: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
7ff0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
8000: 20 2f 2a 20 28 33 29 20 52 65 61 64 20 74 68 65   /* (3) Read the
8010: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
8020: 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68  or the sanity ch
8030: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72 63 20 3d  ecksum */.  rc =
8040: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
8050: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
8060: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
8070: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
8080: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 0a 20 20  nd_playback;..  
8090: 2f 2a 20 28 34 29 20 52 65 61 64 20 74 68 65 20  /* (4) Read the 
80a0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
80b0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
80c0: 66 69 6c 65 20 70 72 69 6f 72 20 74 6f 20 74 68  file prior to th
80d0: 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20  e.  ** start of 
80e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
80f0: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
8100: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
8110: 64 2c 20 26 6d 78 50 67 29 3b 0a 20 20 69 66 28  d, &mxPg);.  if(
8120: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8130: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
8140: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
8150: 2f 2a 20 28 35 29 20 61 6e 64 20 28 36 29 3a 20  /* (5) and (6): 
8160: 43 68 65 63 6b 20 69 66 20 61 20 6d 61 73 74 65  Check if a maste
8170: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
8180: 73 20 73 70 65 63 69 66 69 65 64 2e 20 49 66 20  s specified. If 
8190: 6f 6e 65 20 69 73 0a 20 20 2a 2a 20 73 70 65 63  one is.  ** spec
81a0: 69 66 69 65 64 2c 20 6f 6e 6c 79 20 70 72 6f 63  ified, only proc
81b0: 65 65 64 20 77 69 74 68 20 74 68 65 20 70 6c 61  eed with the pla
81c0: 79 62 61 63 6b 20 69 66 20 69 74 20 73 74 69 6c  yback if it stil
81d0: 6c 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 72  l exists. */.  r
81e0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
81f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6e 4d  pPager->jfd, &nM
8200: 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63  aster);.  if( rc
8210: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
8220: 62 61 63 6b 3b 0a 20 20 69 66 28 20 6e 4d 61 73  back;.  if( nMas
8230: 74 65 72 3e 30 20 29 7b 0a 20 20 20 20 7a 4d 61  ter>0 ){.    zMa
8240: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ster = sqliteMal
8250: 6c 6f 63 28 6e 4d 61 73 74 65 72 29 3b 0a 20 20  loc(nMaster);.  
8260: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29    if( !zMaster )
8270: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
8280: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
8290: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
82a0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ck;.    }.    rc
82b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
82c0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  (&pPager->jfd, z
82d0: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
82e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
82f0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
8300: 74 65 72 5b 30 5d 20 26 26 20 21 73 71 6c 69 74  ter[0] && !sqlit
8310: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
8320: 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20  Master)) ){.    
8330: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
8340: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
8350: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
8360: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
8370: 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69  back to it's ori
8380: 67 69 6e 61 6c 20 73 69 7a 65 20 2a 2f 0a 20 20  ginal size */.  
8390: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
83a0: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
83b0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
83c0: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 72  ize==mxPg );.  r
83d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
83e0: 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66  ncate(&pPager->f
83f0: 64 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  d, SQLITE_PAGE_S
8400: 49 5a 45 2a 28 6f 66 66 5f 74 29 6d 78 50 67 29  IZE*(off_t)mxPg)
8410: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8420: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
8430: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
8440: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
8450: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 0a  Size = mxPg;.  .
8460: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
8470: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
8480: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
8490: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
84a0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
84b0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
84c0: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Rec; i++){.    r
84d0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
84e0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
84f0: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
8500: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
8510: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8520: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
8530: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
8540: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8550: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
8560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8570: 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74   }..  /* Pages t
8580: 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  hat have been wr
8590: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
85a0: 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73  rnal but never s
85b0: 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65  ynced.  ** where
85c0: 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79   not restored by
85d0: 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e   the loop above.
85e0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 73    We have to res
85f0: 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20  tore those.  ** 
8600: 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e 67  pages by reading
8610: 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20   them back from 
8620: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
8630: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
8640: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8650: 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 6c  ){.    pager_rel
8660: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
8670: 29 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 70 6c 61 79  );.  }..end_play
8680: 62 61 63 6b 3a 0a 20 20 69 66 28 20 7a 4d 61 73  back:.  if( zMas
8690: 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ter ){.    /* If
86a0: 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
86b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
86c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
86d0: 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20  l return true,. 
86e0: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
86f0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
8700: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
8710: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 65 72 72   journal. If err
8720: 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f 63 63 75  ors .    ** occu
8730: 72 20 64 75 72 69 6e 67 20 74 68 69 73 20 70 72  r during this pr
8740: 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65 20 74 68  ocess, ignore th
8750: 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  em..    */.    i
8760: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8770: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
8780: 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65  delmaster(zMaste
8790: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
87a0: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
87b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
87c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
87d0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 57 65 20    /* FIX ME: We 
87e0: 73 68 6f 75 6c 64 6e 27 74 20 64 65 6c 65 74 65  shouldn't delete
87f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
8800: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
8810: 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 72   during.    ** r
8820: 6f 6c 6c 62 61 63 6b 2e 20 49 74 20 6d 61 79 20  ollback. It may 
8830: 68 61 76 65 20 62 65 65 6e 20 61 20 74 72 61 6e  have been a tran
8840: 73 69 65 6e 74 20 65 72 72 6f 72 20 61 6e 64 20  sient error and 
8850: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  the rollback may
8860: 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64 20  .    ** succeed 
8870: 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
8880: 61 74 74 65 6d 70 74 65 64 2e 0a 20 20 20 20 2a  attempted..    *
8890: 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72  /.    pager_unwr
88a0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
88b0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
88c0: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
88d0: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
88e0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
88f0: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
8900: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
8910: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
8920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
8940: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
8950: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
8960: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
8970: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
8980: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
8990: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74   journal but wit
89a0: 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61  h.** a few extra
89b0: 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20   twists..**.**  
89c0: 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65    (1)  The numbe
89d0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
89e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
89f0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
8a00: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73  **         the s
8a10: 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72  tatement is stor
8a20: 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74  ed in pPager->st
8a30: 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74  mtSize, not in t
8a40: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f  he.**         jo
8a50: 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c  urnal file itsel
8a60: 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  f..**.**    (2) 
8a70: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
8a80: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
8a90: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8aa0: 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20  al, also.**     
8ab0: 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c      playback all
8ac0: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72   pages of the tr
8ad0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
8ae0: 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20  l beginning.**  
8af0: 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74         at offset
8b00: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
8b10: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
8b20: 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  t pager_stmt_pla
8b30: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
8b40: 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a  ger){.  off_t sz
8b50: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
8b60: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
8b70: 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  full journal */.
8b80: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
8b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8ba0: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
8bb0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8bd0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8be0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
8bf0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
8c00: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
8c10: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
8c20: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
8c30: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8c40: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  &pPager->fd, SQL
8c50: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f  ITE_PAGE_SIZE*(o
8c60: 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 73 74 6d  ff_t)pPager->stm
8c70: 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  tSize);.  pPager
8c80: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
8c90: 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20  r->stmtSize;..  
8ca0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
8cb0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
8cc0: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
8cd0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
8ce0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
8cf0: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
8d00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8d10: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
8d20: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
8d30: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65  >stfd, 0);.  nRe
8d40: 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
8d50: 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
8d60: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
8d70: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
8d80: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
8d90: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
8da0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
8db0: 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
8dc0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
8dd0: 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
8de0: 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
8df0: 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
8e00: 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
8e10: 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
8e20: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
8e30: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
8e40: 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
8e50: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
8e60: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
8e70: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
8e80: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
8e90: 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  &pPager->stfd, 0
8ea0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
8eb0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
8ec0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
8ed0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
8ee0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
8ef0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
8f00: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
8f10: 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
8f20: 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
8f30: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
8f40: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a   ** journal..  *
8f50: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
8f60: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
8f70: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  jfd, pPager->stm
8f80: 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
8f90: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8fa0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
8fb0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
8fc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8fd0: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
8fe0: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
8ff0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9000: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
9010: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
9020: 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 28 73  .  }.  nRec = (s
9030: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 73 74 6d  zJ - pPager->stm
9040: 74 4a 53 69 7a 65 29 2f 4a 4f 55 52 4e 41 4c 5f  tJSize)/JOURNAL_
9050: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
9060: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
9070: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
9080: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
9090: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
90a0: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
90b0: 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
90c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
90d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
90e0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
90f0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
9100: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
9110: 20 20 7d 0a 20 20 7d 0a 20 20 0a 65 6e 64 5f 73    }.  }.  .end_s
9120: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
9130: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9140: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
9150: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
9160: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
9170: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
9180: 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 72 65  ORRUPT;.  }.  re
9190: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
91a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
91b0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
91c0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
91d0: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
91e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
91f0: 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65  um number is the
9200: 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20   absolute value 
9210: 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70 61  of the mxPage pa
9220: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d  rameter..** If m
9230: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
9240: 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c  e, the noSync fl
9250: 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20  ag is also set. 
9260: 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73   noSync bypasses
9270: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
9280: 69 74 65 33 4f 73 53 79 6e 63 28 29 2e 20 20 54  ite3OsSync().  T
9290: 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75  he pager runs mu
92a0: 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20 6e  ch faster with n
92b0: 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74  oSync on,.** but
92c0: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
92d0: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
92e0: 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e 20   or there is an 
92f0: 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a  abrupt power .**
9300: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61   failure, the da
9310: 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68  tabase file migh
9320: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  t be left in an 
9330: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
9340: 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65  .** unrepairable
9350: 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69   state.  .*/.voi
9360: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
9370: 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67  et_cachesize(Pag
9380: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
9390: 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
93a0: 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  xPage>=0 ){.    
93b0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
93c0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
93d0: 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
93e0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
93f0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
9400: 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ; .  }else{.    
9410: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
9420: 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d   1;.    mxPage =
9430: 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20   -mxPage;.  }.  
9440: 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b  if( mxPage>10 ){
9450: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
9460: 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  age = mxPage;.  
9470: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
9480: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
9490: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
94a0: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
94b0: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
94c0: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
94d0: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
94e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
94f0: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
9500: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
9510: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
9520: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
9530: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
9540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
9550: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
9560: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
9570: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
9590: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
95a0: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
95b0: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
95c0: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
95d0: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
95e0: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
95f0: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
9600: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
9610: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
9620: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
9630: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
9650: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
9660: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
9670: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
9680: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
9690: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
96a0: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
96b0: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
96c0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
96d0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
96e0: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
96f0: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
9700: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
9710: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
9720: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
9730: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
9740: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
9750: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
9760: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
9770: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
9780: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
9790: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
97a0: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
97b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
97c0: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
97e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
97f0: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
9800: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
9810: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
9820: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
9830: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
9840: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
9850: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
9860: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
9870: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
9880: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
9890: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
98a0: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
98b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
98c0: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
98d0: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
98e0: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
98f0: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
9900: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
9910: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9920: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
9930: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
9940: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
9950: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
9960: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
9970: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64   FULL=3..*/.void
9980: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
9990: 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50  t_safety_level(P
99a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
99b0: 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67  t level){.  pPag
99c0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
99d0: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
99e0: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
99f0: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
9a00: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
9a10: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
9a20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
9a30: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
9a40: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a  eedSync = 0;.}..
9a50: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
9a60: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72  porary file.  Wr
9a70: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
9a80: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e  the file into zN
9a90: 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75  ame.** (zName mu
9aa0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 53  st be at least S
9ab0: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
9ac0: 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29  IZE bytes long.)
9ad0: 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66    Write.** the f
9ae0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
9af0: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
9b00: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
9b10: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
9b20: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
9b30: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
9b40: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
9b50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
9b60: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
9b70: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
9b80: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
9b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9ba0: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
9bb0: 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f  p(char *zFile, O
9bc0: 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e  sFile *fd){.  in
9bd0: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
9be0: 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63   rc;.  do{.    c
9bf0: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
9c00: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
9c10: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
9c20: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
9c30: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66  clusive(zFile, f
9c40: 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28  d, 1);.  }while(
9c50: 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51   cnt>0 && rc!=SQ
9c60: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
9c70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9c80: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
9c90: 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
9ca0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
9cb0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
9cc0: 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
9cd0: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
9ce0: 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
9cf0: 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
9d00: 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
9d10: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
9d20: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ll to sqlite3pag
9d30: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20  er_get() and is 
9d40: 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
9d50: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
9d60: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
9d70: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70  d using sqlite3p
9d80: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a  ager_unref()..**
9d90: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
9da0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
9db0: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
9dc0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
9dd0: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
9de0: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
9df0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
9e00: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
9e10: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
9e20: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
9e30: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  t is closed..*/.
9e40: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
9e50: 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  _open(.  Pager *
9e60: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
9e70: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
9e80: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
9e90: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
9ea0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
9eb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
9ec0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
9ed0: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
9ee0: 20 6d 78 50 61 67 65 2c 20 20 20 20 20 20 20 20   mxPage,        
9ef0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d        /* Max num
9f00: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
9f10: 20 63 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a   cache pages */.
9f20: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
9f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
9f40: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
9f50: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
9f60: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
9f70: 20 75 73 65 4a 6f 75 72 6e 61 6c 2c 20 20 20 20   useJournal,    
9f80: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f        /* TRUE to
9f90: 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   use a rollback 
9fa0: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
9fb0: 66 69 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 20  file */.  void  
9fc0: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 20 20 20  *pBusyHandler   
9fd0: 20 20 20 2f 2a 20 42 75 73 79 20 63 61 6c 6c 62     /* Busy callb
9fe0: 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ack */.){.  Page
9ff0: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68 61  r *pPager;.  cha
a000: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
a010: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65   = 0;.  int name
a020: 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64  Len;.  OsFile fd
a030: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
a040: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
a050: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
a060: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
a070: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
a080: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  Only = 0;.  char
a090: 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
a0a0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20  MPNAME_SIZE];.. 
a0b0: 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20   *ppPager = 0;. 
a0c0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
a0d0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
a0e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a0f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
a100: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
a110: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
a120: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
a130: 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
a140: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
a150: 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
a160: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
a170: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 34 29 3b  sqliteMalloc(4);
a180: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
a190: 50 61 74 68 6e 61 6d 65 20 29 20 73 74 72 63 70  Pathname ) strcp
a1a0: 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y(zFullPathname,
a1b0: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d   "");.      rc =
a1c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
a1d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 46 75  }else{.      zFu
a1e0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
a1f0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
a200: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
a210: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
a220: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
a230: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a240: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
a250: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
a260: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
a270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
a280: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
a290: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
a2a0: 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b  emp(zTemp, &fd);
a2b0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
a2c0: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
a2d0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
a2e0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
a2f0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
a300: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a310: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
a320: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
a330: 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c  .  }.  if( !zFul
a340: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
a350: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a360: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
a370: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a380: 0a 20 20 20 20 69 66 28 20 74 65 6d 70 46 69 6c  .    if( tempFil
a390: 65 20 29 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  e ) sqlite3OsClo
a3a0: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 69 66 28  se(&fd);.    if(
a3b0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29   zFullPathname )
a3c0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
a3d0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
a3e0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a3f0: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
a400: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
a410: 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  ;.  pPager = sql
a420: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
a430: 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d  f(*pPager) + nam
a440: 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20  eLen*3 + 30 );. 
a450: 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29   if( pPager==0 )
a460: 7b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 46 69  {.    if( tempFi
a470: 6c 65 20 29 20 73 71 6c 69 74 65 33 4f 73 43 6c  le ) sqlite3OsCl
a480: 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 69 66  ose(&fd);.    if
a490: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
a4a0: 29 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75  ) sqliteFree(zFu
a4b0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
a4c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a4d0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 53 45 54 5f  OMEM;.  }.  SET_
a4e0: 50 41 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20  PAGER(pPager);. 
a4f0: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
a500: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
a510: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
a520: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26  ->zDirectory = &
a530: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
a540: 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  e[nameLen+1];.  
a550: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
a560: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
a570: 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31  ectory[nameLen+1
a580: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  ];.  strcpy(pPag
a590: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
a5a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
a5b0: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
a5c0: 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c  zDirectory, zFul
a5d0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f  lPathname);.  fo
a5e0: 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30  r(i=nameLen; i>0
a5f0: 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
a600: 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
a610: 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
a620: 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
a630: 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
a640: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
a650: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75  r->zJournal, zFu
a660: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
a670: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
a680: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
a690: 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
a6a0: 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22  rnal[nameLen], "
a6b0: 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50  -journal");.  pP
a6c0: 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  ager->fd = fd;. 
a6d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a6e0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
a6f0: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
a700: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21   useJournal && !
a710: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
a720: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
a730: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
a740: 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  se = 0;.  pPager
a750: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 50  ->nRef = 0;.  pP
a760: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
a770: 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
a780: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
a790: 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ITE_PAGE_SIZE;. 
a7a0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
a7b0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
a7c0: 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a  >stmtJSize = 0;.
a7d0: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
a7e0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  = 0;.  pPager->m
a7f0: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3e 35  xPage = mxPage>5
a800: 20 3f 20 6d 78 50 61 67 65 20 3a 20 31 30 3b 0a   ? mxPage : 10;.
a810: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
a820: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
a830: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
a840: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
a850: 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
a860: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
a870: 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20  memDb = memDb;. 
a880: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
a890: 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  y = readOnly;.  
a8a0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
a8b0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a8c0: 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
a8d0: 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73  >tempFile || !us
a8e0: 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
a8f0: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a  er->pFirst = 0;.
a900: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
a910: 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50  Synced = 0;.  pP
a920: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
a930: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
a940: 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50  a = nExtra;.  pP
a950: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
a960: 65 72 20 3d 20 28 42 75 73 79 48 61 6e 64 6c 65  er = (BusyHandle
a970: 72 20 2a 29 70 42 75 73 79 48 61 6e 64 6c 65 72  r *)pBusyHandler
a980: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
a990: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
a9a0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
a9b0: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
a9c0: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
a9d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a9e0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  ./*.** Set the d
a9f0: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
aa00: 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
aa10: 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74  t NULL, the dest
aa20: 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64  ructor is called
aa30: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66  .** when the ref
aa40: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
aa50: 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65  each page reache
aa60: 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73  s zero.  The des
aa70: 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62  tructor can.** b
aa80: 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20  e used to clean 
aa90: 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  up information i
aaa0: 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d  n the extra segm
aab0: 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ent appended to 
aac0: 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  each page..**.**
aad0: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
aae0: 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73  is not called as
aaf0: 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65   a result sqlite
ab00: 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20  3pager_close(). 
ab10: 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
ab20: 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
ab30: 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72   by sqlite3pager
ab40: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  _unref()..*/.voi
ab50: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
ab60: 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61  et_destructor(Pa
ab70: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
ab80: 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a  d (*xDesc)(void*
ab90: 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
aba0: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->xDestructor = 
abb0: 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xDesc;.}../*.** 
abc0: 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
abd0: 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
abe0: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
abf0: 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
ac00: 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
ac10: 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
ac20: 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
ac30: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
ac40: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
ac50: 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
ac60: 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
ac70: 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
ac80: 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
ac90: 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
aca0: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
acb0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
acc0: 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
acd0: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
ace0: 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
acf0: 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
ad00: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65  ite3pager_set_re
ad10: 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50  initer(Pager *pP
ad20: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65  ager, void (*xRe
ad30: 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29  init)(void*,int)
ad40: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
ad50: 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
ad60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ad70: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
ad80: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
ad90: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
ada0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
adb0: 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  pPager..*/.int s
adc0: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
add0: 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
ade0: 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b  ger){.  off_t n;
adf0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ae00: 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
ae10: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
ae20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
ae30: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
ae40: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  }.  if( sqlite3O
ae50: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
ae60: 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49  r->fd, &n)!=SQLI
ae70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
ae80: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
ae90: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a  PAGER_ERR_DISK;.
aea0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
aeb0: 7d 0a 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f  }.  n /= SQLITE_
aec0: 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28  PAGE_SIZE;.  if(
aed0: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
aee0: 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  && n==PENDING_BY
aef0: 54 45 2f 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  TE/SQLITE_PAGE_S
af00: 49 5a 45 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a  IZE ){.    n++;.
af10: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
af20: 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
af30: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
af40: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
af50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
af60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
af70: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
af80: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
af90: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 2c 20  Journal(Pager*, 
afa0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 0a  const char*);...
afb0: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
afc0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
afd0: 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
afe0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
aff0: 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
b000: 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
b010: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
b020: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
b030: 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
b040: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b050: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b060: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b  >pPager;..  /* K
b070: 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79  eep the pFirstSy
b080: 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  nced pointer poi
b090: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72  nting at the fir
b0a0: 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20  st synchronized 
b0b0: 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  page */.  if( pP
b0c0: 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g==pPager->pFirs
b0d0: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50  tSynced ){.    P
b0e0: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
b0f0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68  NextFree;.    wh
b100: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
b110: 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
b120: 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
b130: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
b140: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a  ynced = p;.  }..
b150: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
b160: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
b170: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
b180: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  vFree ){.    pPg
b190: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
b1a0: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
b1b0: 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  extFree;.  }else
b1c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
b1d0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50  ager->pFirst==pP
b1e0: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
b1f0: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
b200: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20  NextFree;.  }.  
b210: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
b220: 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
b230: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
b240: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
b250: 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
b260: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
b270: 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b  r->pLast==pPg );
b280: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
b290: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
b2a0: 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ree;.  }.  pPg->
b2b0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
b2c0: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
b2d0: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
b2e0: 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20  m the pgno hash 
b2f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  table */.  if( p
b300: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
b310: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
b320: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
b330: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
b340: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
b350: 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
b360: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d   pPg->pPrevHash-
b370: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
b380: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
b390: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20  else{.    int h 
b3a0: 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67  = pager_hash(pPg
b3b0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
b3c0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
b3d0: 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20  sh[h]==pPg );.  
b3e0: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
b3f0: 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
b400: 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ash;.  }.  pPg->
b410: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
b420: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
b430: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b440: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
b450: 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d   truncate an in-
b460: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
b470: 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20    Delete.** all 
b480: 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
b490: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
b4a0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
b4b0: 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
b4c0: 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  ed..** Reference
b4d0: 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
b4e0: 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
b4f0: 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
b500: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  /.static void me
b510: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67  moryTruncate(Pag
b520: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
b530: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48  gHdr *pPg;.  PgH
b540: 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74  dr **ppPg;.  int
b550: 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
b560: 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50  ->dbSize;..  ppP
b570: 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c  g = &pPager->pAl
b580: 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67  l;.  while( (pPg
b590: 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a   = *ppPg)!=0 ){.
b5a0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
b5b0: 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  o<=dbSize ){.   
b5c0: 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
b5d0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
b5e0: 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  lse if( pPg->nRe
b5f0: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  f>0 ){.      mem
b600: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
b610: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
b620: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
b630: 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
b640: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
b650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
b660: 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  g = pPg->pNextAl
b670: 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  l;.      unlinkP
b680: 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
b690: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
b6a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
b6b0: 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
b6c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  }.}../*.** Trunc
b6d0: 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
b6e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
b6f0: 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
b700: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
b710: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
b720: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
b730: 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
b740: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b750: 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20  dbSize<0 ){.    
b760: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
b770: 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
b780: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
b790: 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
b7a0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
b7b0: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
b7c0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
b7d0: 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
b7e0: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
b7f0: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
b800: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b810: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
b820: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
b830: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
b840: 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  = nPage;.    mem
b850: 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
b860: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
b870: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
b880: 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
b890: 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  l(pPager, 0);.  
b8a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b8b0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
b8c0: 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  rc;.  }.  rc = s
b8d0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
b8e0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  (&pPager->fd, SQ
b8f0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28  LITE_PAGE_SIZE*(
b900: 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a 20 20  off_t)nPage);.  
b910: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b920: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
b930: 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
b940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
b960: 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
b970: 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
b980: 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
b990: 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
b9a0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
b9b0: 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
b9c0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
b9d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
b9e0: 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
b9f0: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
ba00: 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
ba10: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
ba20: 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
ba30: 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
ba40: 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
ba50: 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
ba60: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
ba70: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
ba80: 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
ba90: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
baa0: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
bab0: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
bac0: 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dump..*/.int sql
bad0: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
bae0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
baf0: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
bb00: 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Next;.  switch( 
bb10: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b  pPager->state ){
bb20: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
bb30: 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61  RESERVED:.    ca
bb40: 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a  se PAGER_SYNCED:
bb50: 20 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52   .    case PAGER
bb60: 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20  _EXCLUSIVE: {.  
bb70: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
bb80: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
bb90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
bba0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
bbb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
bbc0: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
bbd0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
bbe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
bbf0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
bc00: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
bc10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bc20: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
bc30: 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  SHARED: {.      
bc40: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
bc50: 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Db ){.        sq
bc60: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
bc70: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
bc80: 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
bc90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bca0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
bcb0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
bcc0: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ng */.      brea
bcd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
bce0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
bcf0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
bd00: 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44  ext){.#ifndef ND
bd10: 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 50 61  EBUG.    if( pPa
bd20: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
bd30: 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
bd40: 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
bd50: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
bd60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
bd70: 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
bd80: 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
bd90: 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
bda0: 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
bdb0: 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
bdc0: 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
bdd0: 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  dif.    pNext = 
bde0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
bdf0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
be00: 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  g);.  }.  if( !p
be10: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
be20: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
be30: 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  se(&pPager->fd);
be40: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
be50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
be60: 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65  en==0 );.  /* Te
be70: 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
be80: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
be90: 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
bea0: 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
beb0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
bec0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
bed0: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
bee0: 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
bef0: 0a 20 20 43 4c 52 5f 50 41 47 45 52 28 70 50 61  .  CLR_PAGER(pPa
bf00: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
bf10: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28  er->zFilename!=(
bf20: 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d  char*)&pPager[1]
bf30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bf40: 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
bf50: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71  happen */.    sq
bf60: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
bf70: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
bf80: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
bf90: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
bfa0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
bfb0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
bfc0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
bfd0: 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
bfe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c000: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
c010: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
c020: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
c030: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  o sqlite3pager_p
c040: 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a  agenumber(void *
c050: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
c060: 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  *p = DATA_TO_PGH
c070: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
c080: 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  urn p->pgno;.}..
c090: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
c0a0: 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
c0b0: 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
c0c0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
c0d0: 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
c0e0: 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
c0f0: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
c100: 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
c110: 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
c120: 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
c130: 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
c140: 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
c150: 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
c160: 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
c170: 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
c180: 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
c190: 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
c1a0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
c1b0: 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
c1c0: 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
c1d0: 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
c1e0: 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
c1f0: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
c200: 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
c210: 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
c220: 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
c230: 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
c240: 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
c250: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
c260: 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
c270: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
c280: 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
c290: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
c2a0: 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ==pPg->pPager->p
c2b0: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
c2c0: 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
c2d0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
c2e0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26        while( p &
c2f0: 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
c300: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
c310: 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e  e; }.      pPg->
c320: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
c330: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nced = p;.    }.
c340: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
c350: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
c360: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
c370: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
c380: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
c390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
c3a0: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
c3b0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
c3c0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
c3d0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
c3e0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
c3f0: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
c400: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
c410: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
c420: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
c430: 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
c440: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
c450: 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
c460: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
c470: 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52  pPg->nRef++;.  R
c480: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23  EFINFO(pPg);.}.#
c490: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
c4a0: 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  T.  static void 
c4b0: 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
c4c0: 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50  pPg){.    if( pP
c4d0: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
c4e0: 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50      _page_ref(pP
c4f0: 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
c500: 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b       pPg->nRef++
c510: 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28  ;.      REFINFO(
c520: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
c530: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
c540: 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
c550: 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
c560: 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
c570: 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69  )->nRef++).#endi
c580: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
c590: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
c5a0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
c5b0: 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
c5c0: 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
c5d0: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
c5e0: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
c5f0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
c600: 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
c610: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
c620: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
c630: 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  ta);.  page_ref(
c640: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
c650: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c660: 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
c670: 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  nal.  In other w
c680: 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
c690: 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
c6a0: 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
c6b0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
c6c0: 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
c6d0: 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
c6e0: 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
c6f0: 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20  ** disk.  It is 
c700: 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69  not safe to modi
c710: 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  fy the original 
c720: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
c730: 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  til after.** the
c740: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
c750: 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68  n synced.  If th
c760: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
c770: 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ase is modified 
c780: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f  before.** the jo
c790: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
c7a0: 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c  and a power fail
c7b0: 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ure occurs, the 
c7c0: 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c  unsynced journal
c7d0: 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62  .** data would b
c7e0: 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f  e lost and we wo
c7f0: 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  uld be unable to
c800: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c   completely roll
c810: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  back the.** data
c820: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44  base changes.  D
c830: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
c840: 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a  on would occur..
c850: 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
c860: 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73  ine also updates
c870: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
c880: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
c890: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
c8a0: 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f   (See comments o
c8b0: 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  n the pager_play
c8c0: 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  back() routine f
c8d0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
c8e0: 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49  formation.).** I
c8f0: 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20  f the sync mode 
c900: 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e  is FULL, two syn
c910: 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20  cs will occur.  
c920: 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20  First the whole 
c930: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79  journal.** is sy
c940: 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e  nced, then the n
c950: 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
c960: 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63  ated, then a sec
c970: 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e  ond sync occurs.
c980: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
c990: 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20  rary databases, 
c9a0: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69  we do not care i
c9b0: 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
c9c0: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74   rollback.** aft
c9d0: 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
c9e0: 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75  re, so sync occu
c9f0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rs..**.** This r
ca00: 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
ca10: 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64  e needSync field
ca20: 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63   of every page c
ca30: 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a  urrent held in.*
ca40: 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  * memory..*/.sta
ca50: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
ca60: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
ca70: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
ca80: 4d 61 73 74 65 72 29 7b 0a 20 20 50 67 48 64 72  Master){.  PgHdr
ca90: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
caa0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
cab0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
cac0: 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  nal before modif
cad0: 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61  ying the main da
cae0: 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73  tabase.  ** (ass
caf0: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61  uming there is a
cb00: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20   journal and it 
cb10: 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
cb20: 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed.).  */.  if( 
cb30: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
cb40: 20 7c 7c 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20   || zMaster ){. 
cb50: 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
cb60: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
cb70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
cb80: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
cb90: 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
cba0: 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
cbb0: 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d  c ); // noSync m
cbc0: 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73  ight be set if s
cbd0: 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20  ynchronous.     
cbe0: 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f   ** was turned o
cbf0: 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ff after the tra
cc00: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
cc10: 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36  rted.  Ticket #6
cc20: 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  15 */.#ifndef ND
cc30: 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20  EBUG.      {.   
cc40: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
cc50: 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52  e the pPager->nR
cc60: 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72  ec counter we ar
cc70: 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73  e keeping agrees
cc80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
cc90: 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74   the nRec comput
cca0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ed from the size
ccb0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
ccc0: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
ccd0: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 68  .        off_t h
cce0: 64 72 53 7a 2c 20 70 67 53 7a 2c 20 6a 53 7a 3b  drSz, pgSz, jSz;
ccf0: 0a 20 20 20 20 20 20 20 20 68 64 72 53 7a 20 3d  .        hdrSz =
cd00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
cd10: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
cd20: 20 70 67 53 7a 20 3d 20 4a 4f 55 52 4e 41 4c 5f   pgSz = JOURNAL_
cd30: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
cd40: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
cd50: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
cd60: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a  Pager->jfd, &jSz
cd70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
cd80: 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
cd90: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
cda0: 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2a 70  ( pPager->nRec*p
cdb0: 67 53 7a 2b 68 64 72 53 7a 3d 3d 6a 53 7a 20 29  gSz+hdrSz==jSz )
cdc0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
cdd0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
cde0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
cdf0: 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
ce00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
ce10: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  eader */.       
ce20: 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20 20 20 20   off_t szJ;.    
ce30: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
ce40: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
ce50: 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59        TRACE2("SY
ce60: 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
ce70: 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
ce80: 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  h);.          rc
ce90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
cea0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
ceb0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
cec0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
ced0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cee0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
cef0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 73  (&pPager->jfd, s
cf00: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
cf10: 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 72  gic));.        r
cf20: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
cf30: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
cf40: 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
cf50: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
cf60: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
cf70: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
cf80: 61 6d 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  ame of the maste
cf90: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
cfa0: 66 20 6f 6e 65 20 69 73 20 73 70 65 63 69 66 69  f one is specifi
cfb0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ed */.        if
cfc0: 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( zMaster ){.   
cfd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
cfe0: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3c 70  trlen(zMaster)<p
cff0: 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 29  Pager->nMaster )
d000: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
d010: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
d020: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 30 29  pPager->jfd, 20)
d030: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d040: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d050: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
d060: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
d070: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
d080: 74 65 72 2c 20 73 74 72 6c 65 6e 28 7a 4d 61 73  ter, strlen(zMas
d090: 74 65 72 29 2b 31 29 3b 0a 20 20 20 20 20 20 20  ter)+1);.       
d0a0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
d0b0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
d0c0: 0a 0a 20 20 20 20 20 20 20 20 73 7a 4a 20 3d 20  ..        szJ = 
d0d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d0e0: 50 61 67 65 72 29 20 2b 20 20 70 50 61 67 65 72  Pager) +  pPager
d0f0: 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e 41 4c 5f 50  ->nRec*JOURNAL_P
d100: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
d110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
d120: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
d130: 2c 20 73 7a 4a 29 3b 0a 20 20 20 20 20 20 7d 0a  , szJ);.      }.
d140: 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59        TRACE2("SY
d150: 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
d160: 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
d170: 68 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  h);.      rc = s
d180: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50  qlite3OsSync(&pP
d190: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
d1a0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
d1b0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
d1c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
d1d0: 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
d1e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
d1f0: 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
d200: 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
d210: 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
d220: 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
d230: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
d240: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
d250: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
d260: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
d270: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
d280: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
d290: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
d2a0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
d2b0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
d2c0: 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
d2d0: 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
d2e0: 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
d2f0: 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
d300: 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
d310: 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
d320: 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
d330: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
d340: 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
d350: 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
d360: 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28    else{.    for(
d370: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
d380: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
d390: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
d3a0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
d3b0: 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
d3c0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
d3d0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
d3e0: 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  ced==pPager->pFi
d3f0: 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
d400: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
d410: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
d420: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
d430: 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
d440: 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
d450: 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
d460: 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
d470: 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
d480: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d490: 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
d4a0: 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
d4b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
d4c0: 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
d4d0: 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
d4e0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
d4f0: 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  er;.  int rc;.  
d500: 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 0a 20  int busy = 1;.. 
d510: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
d520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d530: 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
d540: 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
d550: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
d560: 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
d570: 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
d580: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
d590: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
d5a0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
d5b0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
d5c0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
d5d0: 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
d5e0: 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
d5f0: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
d600: 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
d610: 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
d620: 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
d630: 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
d640: 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
d650: 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
d660: 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
d670: 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
d680: 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
d690: 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
d6a0: 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
d6b0: 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
d6c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
d6d0: 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
d6e0: 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
d6f0: 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
d700: 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
d710: 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
d720: 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
d730: 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
d740: 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
d750: 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
d760: 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
d770: 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
d780: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
d790: 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
d7a0: 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
d7b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
d7c0: 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
d7d0: 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
d7e0: 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
d7f0: 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
d800: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
d810: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
d820: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
d830: 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
d840: 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
d850: 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
d860: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d870: 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
d880: 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
d890: 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
d8a0: 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
d8b0: 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
d8c0: 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20    do {.    rc = 
d8d0: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
d8e0: 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
d8f0: 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 77  SIVE_LOCK);.  }w
d900: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
d910: 5f 42 55 53 59 20 26 26 20 0a 20 20 20 20 20 20  _BUSY && .      
d920: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
d930: 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 70  dler && .      p
d940: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
d950: 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20  ler->xFunc && . 
d960: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
d970: 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63  syHandler->xFunc
d980: 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
d990: 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73  ndler->pArg, bus
d9a0: 79 2b 2b 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  y++).  );.  if( 
d9b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d9c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
d9d0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
d9e0: 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
d9f0: 55 53 49 56 45 3b 0a 0a 20 20 77 68 69 6c 65 28  USIVE;..  while(
da00: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73   pList ){.    as
da10: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72  sert( pList->dir
da20: 74 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ty );.    sqlite
da30: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
da40: 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e  >fd, (pList->pgn
da50: 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49  o-1)*(off_t)SQLI
da60: 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  TE_PAGE_SIZE);. 
da70: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
da80: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
da90: 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
daa0: 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 54 52 41 43  no, 6);.    TRAC
dab0: 45 32 28 22 53 54 4f 52 45 20 70 61 67 65 20 25  E2("STORE page %
dac0: 64 5c 6e 22 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  d\n", pList->pgn
dad0: 6f 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  o);.    rc = sql
dae0: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
daf0: 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
db00: 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 53  O_DATA(pList), S
db10: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
db20: 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67  ;.    CODEC(pPag
db30: 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
db40: 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
db50: 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 69  >pgno, 0);.    i
db60: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
db70: 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69  c;.    pList->di
db80: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69  rty = 0;.    pLi
db90: 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
dba0: 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
dbb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
dbc0: 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
dbd0: 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
dbe0: 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
dbf0: 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
dc00: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
dc10: 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
dc20: 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
dc30: 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
dc40: 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
dc50: 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
dc60: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
dc70: 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
dc80: 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
dc90: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
dca0: 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c  *p, *pList;.  pL
dcb0: 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ist = 0;.  for(p
dcc0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
dcd0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
dce0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72  {.    if( p->dir
dcf0: 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  ty ){.      p->p
dd00: 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20  Dirty = pList;. 
dd10: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a       pList = p;.
dd20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
dd30: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
dd40: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
dd50: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
dd60: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
dd70: 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
dd80: 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
dd90: 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
dda0: 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
ddb0: 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
ddc0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
ddd0: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
dde0: 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f  .**.** A _get wo
ddf0: 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65  rks for any page
de00: 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
de10: 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20  than 0.  If the 
de20: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
de30: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
de40: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
de50: 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74  age, then no act
de60: 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  ual disk.** read
de70: 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
de80: 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
de90: 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74  the page is init
dea0: 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c  ialized to.** al
deb0: 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78  l zeros.  The ex
dec0: 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
ded0: 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
dee0: 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
def0: 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68  d.** to zeros th
df00: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  e first time a p
df10: 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
df20: 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  to memory..**.**
df30: 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
df40: 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
df50: 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
df60: 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
df70: 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
df80: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
df90: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
dfa0: 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
dfb0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
dfc0: 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
dfd0: 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  _lookup().  Both
dfe0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
dff0: 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65  d _lookup() atte
e000: 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
e010: 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
e020: 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
e030: 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
e040: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
e050: 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
e060: 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
e070: 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
e080: 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c  it in whereas _l
e090: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
e0a0: 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
e0b0: 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
e0c0: 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
e0d0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
e0e0: 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
e0f0: 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
e100: 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
e110: 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
e120: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
e130: 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65  nce _lookup() ne
e140: 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
e150: 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
e160: 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
e170: 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
e180: 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
e190: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 50  lite3pager_get(P
e1a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
e1b0: 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a  no pgno, void **
e1c0: 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  ppPage){.  PgHdr
e1d0: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
e1e0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
e1f0: 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
e200: 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
e210: 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
e220: 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
e230: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
e240: 6f 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  o!=0 );.  *ppPag
e250: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
e260: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
e270: 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
e280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
e290: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
e2a0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
e2b0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
e2c0: 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
e2d0: 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
e2e0: 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
e2f0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e300: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
e310: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
e320: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d   && !pPager->mem
e330: 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 75  Db ){.    int bu
e340: 73 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20 7b  sy = 1;.    do {
e350: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e360: 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65  te3OsLock(&pPage
e370: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
e380: 43 4b 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  CK);.    }while(
e390: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
e3a0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
e3b0: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
e3c0: 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  r && .        pP
e3d0: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
e3e0: 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20  er->xFunc && .  
e3f0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
e400: 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e  usyHandler->xFun
e410: 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  c(pPager->pBusyH
e420: 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75  andler->pArg, bu
e430: 73 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20  sy++).    );.   
e440: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e450: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
e460: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
e470: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
e480: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a   PAGER_SHARED;..
e490: 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
e4a0: 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
e4b0: 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
e4c0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
e4d0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
e4e0: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
e4f0: 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
e500: 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
e510: 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
e520: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
e530: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
e540: 20 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c   && .        sql
e550: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
e560: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
e570: 6c 29 20 26 26 0a 20 20 20 20 20 20 20 20 21 73  l) &&.        !s
e580: 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
e590: 65 72 76 65 64 4c 6f 63 6b 28 26 70 50 61 67 65  ervedLock(&pPage
e5a0: 72 2d 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a 20  r->fd) .    ){. 
e5b0: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20        int rc;.. 
e5c0: 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
e5d0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
e5e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
e5f0: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 72  ile. */.       r
e600: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
e610: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  k(&pPager->fd, E
e620: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
e630: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
e640: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e650: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
e660: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
e670: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
e680: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
e690: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
e6a0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  K;.         retu
e6b0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a  rn rc;.       }.
e6c0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
e6d0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
e6e0: 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20  LUSIVE;..       
e6f0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
e700: 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
e710: 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
e720: 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
e730: 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e      ** we are un
e740: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  able to open the
e750: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
e760: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
e770: 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
e780: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
e790: 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
e7a0: 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
e7b0: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
e7c0: 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
e7d0: 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
e7e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
e7f0: 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20  holds.       ** 
e800: 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
e810: 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
e820: 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
e830: 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
e840: 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70   ** processes op
e850: 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
e860: 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
e870: 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  me..       */.  
e880: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e890: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
e8a0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e8b0: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
e8c0: 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  .       if( rc!=
e8d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e8e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
e8f0: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
e900: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
e910: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
e920: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
e930: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  CK;.         ret
e940: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
e950: 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
e960: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e970: 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
e980: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e990: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 0a 20 20  Started = 0;..  
e9a0: 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
e9b0: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
e9c0: 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
e9d0: 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
e9e0: 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  e.       ** lock
e9f0: 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
ea00: 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
ea10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
ea20: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
ea30: 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
ea40: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ea50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ea60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ea70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ea80: 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
ea90: 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  se{.    /* Searc
eaa0: 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61  h for page in ca
eab0: 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  che */.    pPg =
eac0: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
ead0: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
eae0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
eaf0: 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  Db && pPager->st
eb00: 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
eb10: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
eb20: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
eb30: 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
eb40: 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
eb50: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
eb60: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
eb70: 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
eb80: 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
eb90: 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  t h;.    pPager-
eba0: 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66  >nMiss++;.    if
ebb0: 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
ebc0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
ebd0: 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
ebe0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d  ==0 || pPager->m
ebf0: 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  emDb ){.      /*
ec00: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
ec10: 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20  ge */.      pPg 
ec20: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
ec30: 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  w( sizeof(*pPg) 
ec40: 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  + SQLITE_PAGE_SI
ec50: 5a 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ZE .            
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
ec80: 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
ec90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
ecb0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 2a 73   pPager->memDb*s
ecc0: 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
ecd0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
ece0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
ecf0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
ed00: 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Db ){.          
ed10: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
ed20: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
ed30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
ed40: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
ed50: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20  PAGER_ERR_MEM;. 
ed60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ed70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
ed80: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
ed90: 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pPg, 0, sizeof(
eda0: 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66  *pPg));.      if
edb0: 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
edc0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
edd0: 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  t(PGHDR_TO_HIST(
ede0: 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
edf0: 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72   sizeof(PgHistor
ee00: 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  y));.      }.   
ee10: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
ee20: 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70   pPager;.      p
ee30: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
ee40: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
ee50: 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
ee60: 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61  = pPg;.      pPa
ee70: 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
ee80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
ee90: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f  * Find a page to
eea0: 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74   recycle.  Try t
eeb0: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  o locate a page 
eec0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  that does not.  
eed0: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75      ** require u
eee0: 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
eef0: 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
ef00: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
ef10: 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
ef20: 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
ef30: 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f       /* If we co
ef40: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  uld not find a p
ef50: 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
ef60: 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79  t require an fsy
ef70: 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  nc().      ** on
ef80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ef90: 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
efa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
efb0: 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 20  This is a.      
efc0: 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
efd0: 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
efe0: 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
eff0: 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
f000: 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  mes.      ** it 
f010: 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
f020: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f030: 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
f040: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
f050: 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
f060: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
f070: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
f080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
f090: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
f0a0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
f0b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
f0c0: 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RR;.        }.  
f0d0: 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67        pPg = pPag
f0e0: 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20  er->pFirst;.    
f0f0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
f100: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
f110: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
f120: 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
f130: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
f140: 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
f150: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
f160: 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
f170: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f180: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
f190: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  0 );.        pPg
f1a0: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
f1b0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
f1c0: 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
f1d0: 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20   pPg );.        
f1e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f1f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
f200: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
f210: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
f220: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f230: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
f240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f250: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
f260: 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
f270: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
f280: 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
f290: 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
f2a0: 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
f2b0: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
f2c0: 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61  set the global a
f2d0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
f2e0: 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69  ag, thus disabli
f2f0: 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ng the.      ** 
f300: 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c  sqlite_dont_roll
f310: 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74  back() optimizat
f320: 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74  ion for the rest
f330: 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
f340: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tion..      ** I
f350: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
f360: 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
f370: 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
f380: 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
f390: 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  .      ** might 
f3a0: 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
f3b0: 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
f3c0: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
f3d0: 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
f3e0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
f3f0: 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61   was marked alwa
f400: 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69  ysRollback.  Thi
f410: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c  s means that all
f420: 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20   pages must.    
f430: 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
f440: 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
f450: 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75   from here on ou
f460: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
f470: 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
f480: 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
f490: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77       pPager->alw
f4a0: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
f4b0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
f4c0: 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
f4d0: 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
f4e0: 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
f4f0: 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20  e hash table.   
f500: 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69     */.      unli
f510: 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
f520: 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c     pPager->nOvfl
f530: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ++;.    }.    pP
f540: 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
f550: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
f560: 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  aInJournal && (i
f570: 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
f580: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
f590: 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
f5a0: 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  kMemory(pPager->
f5b0: 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  aInJournal, pgno
f5c0: 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  /8);.      asser
f5d0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
f5e0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
f5f0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
f600: 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   (pPager->aInJou
f610: 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  rnal[pgno/8] & (
f620: 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
f630: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
f640: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
f650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
f660: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
f670: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
f680: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
f690: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
f6a0: 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  InStmt && (int)p
f6b0: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
f6c0: 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  tSize.          
f6d0: 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61     && (pPager->a
f6e0: 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26  InStmt[pgno/8] &
f6f0: 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
f700: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  =0 ){.      page
f710: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
f720: 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  t(pPg);.    }els
f730: 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65  e{.      page_re
f740: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
f750: 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
f760: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
f770: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65   0;.    pPg->nRe
f780: 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e  f = 1;.    REFIN
f790: 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61  FO(pPg);.    pPa
f7a0: 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
f7b0: 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
f7c0: 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pgno);.    pPg->
f7d0: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
f7e0: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
f7f0: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
f800: 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  h] = pPg;.    if
f810: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
f820: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
f830: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
f840: 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
f850: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
f860: 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
f870: 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  h = pPg;.    }. 
f880: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
f890: 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20  Extra>0 ){.     
f8a0: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
f8b0: 5f 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20  _EXTRA(pPg), 0, 
f8c0: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
f8d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f8e0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
f8f0: 29 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ) sqlite3pager_p
f900: 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
f910: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
f920: 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
f930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
f940: 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54  er_unref(PGHDR_T
f950: 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20  O_DATA(pPg));.  
f960: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
f970: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
f980: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f990: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f9a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
f9b0: 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  nt)pgno ){.     
f9c0: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
f9d0: 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53  _DATA(pPg), 0, S
f9e0: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
f9f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fa00: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
fa10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
fa20: 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
fa30: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
fa40: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
fa50: 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51  gno-1)*(off_t)SQ
fa60: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
fa70: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
fa80: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
fa90: 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
faa0: 44 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54  DATA(pPg), SQLIT
fab0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
fac0: 20 20 20 20 54 52 41 43 45 32 28 22 46 45 54 43      TRACE2("FETC
fad0: 48 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  H page %d\n", pP
fae0: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
faf0: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
fb00: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
fb10: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
fb20: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
fb30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fb40: 20 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69      off_t fileSi
fb50: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
fb60: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
fb70: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66  e(&pPager->fd,&f
fb80: 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45  ileSize)!=SQLITE
fb90: 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
fba0: 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d     || fileSize>=
fbb0: 70 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45  pgno*SQLITE_PAGE
fbc0: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
fbd0: 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
fbe0: 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44  unref(PGHDR_TO_D
fbf0: 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20  ATA(pPg));.     
fc00: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fc10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fc20: 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
fc30: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
fc40: 67 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41  g), 0, SQLITE_PA
fc50: 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
fc60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fc70: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
fc80: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
fc90: 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
fca0: 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
fcb0: 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b    pPager->nHit++
fcc0: 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  ;.    page_ref(p
fcd0: 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  Pg);.  }.  *ppPa
fce0: 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ge = PGHDR_TO_DA
fcf0: 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  TA(pPg);.  retur
fd00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fd10: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
fd20: 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
fd30: 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
fd40: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
fd50: 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
fd60: 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
fd70: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
fd80: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
fd90: 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
fda0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
fdb0: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
fdc0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65  also sqlite3page
fdd0: 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69  r_get().  The di
fde0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
fdf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
fe00: 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65   and sqlite3page
fe10: 72 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20  r_get() is that 
fe20: 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
fe30: 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
fe40: 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
fe50: 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
fe60: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
fe70: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
fe80: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
fe90: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
fea0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
feb0: 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
fec0: 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
fed0: 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
fee0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
fef0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
ff00: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
ff10: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
ff20: 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
ff30: 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
ff40: 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
ff50: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
ff60: 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47  >errMask & ~(PAG
ff70: 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a  ER_ERR_FULL) ){.
ff80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ff90: 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
ffa0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
ffb0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
ffc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ffd0: 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
ffe0: 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
fff0: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a  O_DATA(pPg);.}..
10000 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
10010 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
10020 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
10030 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
10040 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
10050 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
10060 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
10070 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
10080 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
10090 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
100a0 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
100b0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
100c0 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
100d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
100e0 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
100f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
10100 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44  r_unref(void *pD
10110 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
10120 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  Pg;..  /* Decrem
10130 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
10140 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
10150 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67   page.  */.  pPg
10160 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
10170 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
10180 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
10190 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pPg->nRef--;
101a0 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
101b0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
101c0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
101d0 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
101e0 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
101f0 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
10200 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
10210 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
10220 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
10230 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
10240 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
10250 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
10260 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
10270 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
10280 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  0;.    pPg->pPre
10290 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e  vFree = pPager->
102a0 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65  pLast;.    pPage
102b0 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  r->pLast = pPg;.
102c0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
102d0 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
102e0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
102f0 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b  pNextFree = pPg;
10300 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10310 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
10320 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
10330 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
10340 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
10350 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
10360 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
10370 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
10380 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
10390 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
103a0 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
103b0 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
103c0 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61  uctor(pData, pPa
103d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
103e0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
103f0 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72  When all pages r
10400 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  each the freelis
10410 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64  t, drop the read
10420 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a   lock from.    *
10430 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
10440 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
10450 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
10460 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10470 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20  er->nRef>=0 );. 
10480 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
10490 52 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65  Ref==0 && !pPage
104a0 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
104b0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
104c0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
104d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
104e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
104f0 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
10500 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
10510 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
10520 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
10530 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
10540 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
10550 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
10560 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
10570 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
10580 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10590 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
105a0 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
105b0 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
105c0 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
105d0 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
105e0 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
105f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
10600 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
10610 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
10620 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
10630 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
10640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10650 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
10660 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
10670 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10680 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
10690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
106a0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
106b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
106c0 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
106d0 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  er);.  pPager->a
106e0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
106f0 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
10700 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
10710 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
10720 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  aInJournal==0 ){
10730 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  .    sqlite3OsUn
10740 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
10750 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
10760 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
10770 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
10780 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10790 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
107a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
107b0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61  penExclusive(pPa
107c0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
107d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67  pPager->jfd,pPag
107e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
107f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10800 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
10810 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
10820 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
10830 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
10840 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
10850 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
10860 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
10870 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
10880 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
10890 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
108a0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
108b0 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  N;.  }.  sqlite3
108c0 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
108d0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
108e0 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  ry, &pPager->jfd
108f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
10900 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
10910 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
10920 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50  tarted = 0;.  pP
10930 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
10940 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c   0;.  pPager->al
10950 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
10960 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
10970 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
10980 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
10990 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
109a0 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
109b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
109c0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
109d0 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
109e0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 2f  er->dbSize;..  /
109f0 2a 20 43 72 65 61 74 65 20 74 68 65 20 68 65 61  * Create the hea
10a00 64 65 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  der for the jour
10a10 6e 61 6c 3a 0a 20 20 2a 2a 20 2d 20 38 20 62 79  nal:.  ** - 8 by
10a20 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
10a30 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
10a40 6f 72 6d 61 74 2e 0a 20 20 2a 2a 20 2d 20 34 20  ormat..  ** - 4 
10a50 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
10a60 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
10a70 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
10a80 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 20  nc mode is on.. 
10a90 20 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4d   ** - 4 bytes: M
10aa0 61 67 69 63 20 75 73 65 64 20 66 6f 72 20 70 61  agic used for pa
10ab0 67 65 20 63 68 65 63 6b 73 75 6d 73 2e 0a 20 20  ge checksums..  
10ac0 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
10ad0 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
10ae0 61 67 65 20 63 6f 75 6e 74 2e 0a 20 20 2a 2a 20  age count..  ** 
10af0 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
10b00 72 20 6f 66 20 62 79 74 65 73 20 72 65 73 65 72  r of bytes reser
10b10 76 65 64 20 66 6f 72 20 6d 61 73 74 65 72 20 6a  ved for master j
10b20 6f 75 72 6e 61 6c 20 70 74 72 20 28 6e 4d 61 73  ournal ptr (nMas
10b30 74 65 72 29 0a 20 20 2a 2a 20 2d 20 6e 4d 61 73  ter).  ** - nMas
10b40 74 65 72 20 62 79 74 65 73 3a 20 53 70 61 63 65  ter bytes: Space
10b50 20 66 6f 72 20 61 20 6d 61 73 74 65 72 20 6a 6f   for a master jo
10b60 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2e 0a 20  urnal pointer.. 
10b70 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
10b80 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
10b90 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
10ba0 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
10bb0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
10bc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10bd0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  OK ){.    rc = w
10be0 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
10bf0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
10c00 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66  >noSync ? 0xffff
10c10 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20  ffff : 0);.  }. 
10c20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10c30 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
10c40 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
10c50 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
10c60 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
10c70 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20  cksumInit);.    
10c80 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10c90 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
10ca0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
10cb0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
10cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10cd0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
10ce0 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
10cf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
10d00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10d20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
10d30 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
10d40 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 29  pPager->nMaster)
10d50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10d60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10d70 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
10d80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 32 34 20  pPager->jfd, 24 
10d90 2b 20 70 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65  + pPager->nMaste
10da0 72 20 2d 20 31 29 3b 0a 20 20 20 20 72 63 20 3d  r - 1);.    rc =
10db0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10dc0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c  &pPager->jfd, "\
10dd0 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  000", 1);.  }.  
10de0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
10df0 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
10e00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10e10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
10e20 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50  er_stmt_begin(pP
10e30 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
10e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10e50 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
10e60 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
10e70 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
10e80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10e90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10ea0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
10eb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
10ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
10ed0 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
10ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
10ef0 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
10f00 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
10f10 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
10f20 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
10f30 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
10f40 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73  ager_commit() is
10f50 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
10f60 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
10f70 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
10f80 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
10f90 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
10fa0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
10fb0 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
10fc0 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
10fd0 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
10fe0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
10ff0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
11000 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
11010 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
11020 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
11030 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
11040 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
11050 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
11060 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
11070 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
11080 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
11090 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
110a0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
110b0 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
110c0 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
110d0 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
110e0 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
110f0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
11100 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
11110 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
11120 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
11130 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
11140 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
11150 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
11160 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
11170 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
11180 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
11190 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
111a0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
111b0 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
111c0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
111d0 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
111e0 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
111f0 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
11200 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
11210 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
11220 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
11230 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
11240 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
11250 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
11260 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
11270 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
11280 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
11290 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
112a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
112b0 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20  ager_begin(void 
112c0 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 4d 61 73  *pData, int nMas
112d0 74 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ter){.  PgHdr *p
112e0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
112f0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
11300 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
11310 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
11320 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11330 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
11340 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
11350 74 28 20 6e 4d 61 73 74 65 72 3e 3d 30 20 29 3b  t( nMaster>=0 );
11360 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11370 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
11380 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
11390 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
113a0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
113b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
113c0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
113d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
113e0 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
113f0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
11400 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
11410 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
11420 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
11430 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
11440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11450 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20  int busy = 1;.  
11460 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
11470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
11480 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
11490 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
114a0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 72  .      }while( r
114b0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
114c0 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  & .          pPa
114d0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
114e0 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  r && .          
114f0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
11500 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a  dler->xFunc && .
11510 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
11520 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
11530 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42  xFunc(pPager->pB
11540 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67  usyHandler->pArg
11550 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20 20  , busy++).      
11560 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11580 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
115a0 50 61 67 65 72 2d 3e 6e 4d 61 73 74 65 72 20 3d  Pager->nMaster =
115b0 20 6e 4d 61 73 74 65 72 3b 0a 20 20 20 20 20 20   nMaster;.      
115c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
115d0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
115e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69        pPager->di
115f0 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
11600 20 20 20 20 54 52 41 43 45 33 28 22 54 52 41 4e      TRACE3("TRAN
11610 53 41 43 54 49 4f 4e 20 25 64 20 6e 4d 61 73 74  SACTION %d nMast
11620 65 72 3d 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  er=%d\n", pPager
11630 2d 3e 66 64 2e 68 2c 20 6e 4d 61 73 74 65 72 29  ->fd.h, nMaster)
11640 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
11650 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
11660 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
11670 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
11680 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
11690 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
116a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
116b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
116c0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
116d0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
116e0 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
116f0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
11700 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
11710 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
11720 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
11730 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
11740 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
11750 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
11760 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
11770 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
11780 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
11790 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
117a0 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
117b0 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
117c0 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
117d0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
117e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
117f0 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
11800 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
11810 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
11820 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
11830 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
11840 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
11850 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
11860 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
11870 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
11880 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
11890 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
118a0 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
118b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
118c0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
118d0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
118e0 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
118f0 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
11900 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
11910 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
11920 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
11930 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
11940 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
11950 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
11960 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
11970 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
11980 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
11990 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
119a0 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
119b0 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  o sqlite3pager_c
119c0 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
119d0 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
119e0 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
119f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
11a00 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a  ger_write(void *
11a10 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
11a20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
11a30 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
11a40 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
11a50 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
11a60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11a70 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
11a80 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
11a90 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
11aa0 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ask ){ .    retu
11ab0 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
11ac0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
11ad0 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
11ae0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
11af0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
11b00 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
11b10 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
11b20 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
11b30 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11b40 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
11b50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
11b60 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
11b70 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
11b80 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
11b90 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
11ba0 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
11bb0 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72  inStmt || pPager
11bc0 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
11bd0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
11be0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
11bf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11c00 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
11c10 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
11c20 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
11c30 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
11c40 74 6f 20 62 65 0a 20 20 2a 2a 20 77 72 69 74 74  to be.  ** writt
11c50 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
11c60 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
11c70 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
11c80 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20  journal.  ** or 
11c90 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
11ca0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
11cb0 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
11cc0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
11cd0 65 78 69 73 74 73 20 61 6e 64 0a 20 20 2a 2a 20  exists and.  ** 
11ce0 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
11cf0 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  does not..  */. 
11d00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11d10 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
11d20 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73  LOCK );.  rc = s
11d30 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
11d40 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 69  n(pData, 0);.  i
11d50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11d60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
11d70 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
11d80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
11d90 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
11da0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
11db0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
11dc0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
11dd0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  al ){.    rc = p
11de0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
11df0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
11e00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11e10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
11e20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
11e30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11e40 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  || !pPager->useJ
11e50 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67  ournal );.  pPag
11e60 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
11e70 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 72   1;..  /* The tr
11e80 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
11e90 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
11ea0 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
11eb0 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a 2a 20 45  VED or an.  ** E
11ec0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
11ed0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
11ee0 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
11ef0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
11f00 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 74 72 61   to.  ** the tra
11f10 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11f20 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
11f30 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 2a  ere already..  *
11f40 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  /.  if( !pPg->in
11f50 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
11f60 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
11f70 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 29  | pPager->memDb)
11f80 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e 74   ){.    if( (int
11f90 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
11fa0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
11fb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
11fc0 50 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73 61  Pg;.      u32 sa
11fd0 76 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ved;.      if( p
11fe0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
11ff0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
12000 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
12010 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
12020 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 54  ager);.        T
12030 52 41 43 45 32 28 22 4a 4f 55 52 4e 41 4c 20 70  RACE2("JOURNAL p
12040 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e  age %d\n", pPg->
12050 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  pgno);.        a
12060 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
12070 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
12080 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
12090 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
120a0 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
120b0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
120c0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
120d0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
120e0 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
120f0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
12100 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
12110 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
12120 7d 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 69  }.        pPg->i
12130 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
12140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12150 20 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70     u32 cksum = p
12160 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
12170 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44  r, pPg->pgno, pD
12180 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 73 61  ata);.        sa
12190 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48  ved = *(u32*)PGH
121a0 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 29  DR_TO_EXTRA(pPg)
121b0 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33  ;.        store3
121c0 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67  2bits(cksum, pPg
121d0 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  , SQLITE_PAGE_SI
121e0 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 50  ZE);.        szP
121f0 67 20 3d 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  g = SQLITE_PAGE_
12200 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20 20 20 20  SIZE+8;.        
12210 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d  store32bits(pPg-
12220 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b  >pgno, pPg, -4);
12230 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
12240 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
12250 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
12260 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12270 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
12280 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29  ->jfd, &((char*)
12290 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67  pData)[-4], szPg
122a0 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
122b0 33 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20  3("JOURNAL page 
122c0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
122d0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ", pPg->pgno, pP
122e0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
122f0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
12300 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
12310 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
12320 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54    *(u32*)PGHDR_T
12330 4f 5f 45 58 54 52 41 28 70 50 67 29 20 3d 20 73  O_EXTRA(pPg) = s
12340 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  aved;.        if
12350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12370 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
12380 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
12390 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
123a0 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
123b0 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  RR_FULL;.       
123c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
123d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
123e0 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
123f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12400 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
12410 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
12420 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
12430 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
12440 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
12450 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70 50  o&7);.        pP
12460 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
12470 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
12480 20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f         pPg->inJo
12490 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20  urnal = 1;.     
124a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
124b0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
124c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
124d0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
124e0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
124f0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
12500 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
12510 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
12520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12540 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
12550 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
12560 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
12570 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
12580 20 20 20 54 52 41 43 45 33 28 22 41 50 50 45 4e     TRACE3("APPEN
12590 44 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  D page %d needSy
125a0 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  nc=%d\n", pPg->p
125b0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
125c0 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nc);.    }.    i
125d0 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
125e0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
125f0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
12600 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12610 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
12620 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
12630 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
12640 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a   not in it,.  **
12650 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
12660 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
12670 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
12680 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
12690 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65  t.  ** the state
126a0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
126b0 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
126c0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
126d0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 2a  urnal format.  *
126e0 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
126f0 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
12700 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
12710 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
12720 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
12730 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
12740 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
12750 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
12760 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
12770 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
12780 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
12790 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
127a0 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
127b0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
127c0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
127d0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
127e0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
127f0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
12800 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
12810 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 48 69  ==0 );.      pHi
12820 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
12830 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
12840 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
12850 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
12860 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
12870 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
12880 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f  >pStmt, PGHDR_TO
12890 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
128a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
128b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
128c0 43 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE2("STMT-JOURNA
128d0 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  L page %d\n", pP
128e0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65  g->pgno);.    }e
128f0 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  lse{.      store
12900 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f  32bits(pPg->pgno
12910 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20  , pPg, -4);.    
12920 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
12930 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
12940 2c 20 37 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 7);.      rc =
12950 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
12960 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 28  &pPager->stfd, (
12970 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c  (char*)pData)-4,
12980 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a   SQLITE_PAGE_SIZ
12990 45 2b 34 29 3b 0a 20 20 20 20 20 20 54 52 41 43  E+4);.      TRAC
129a0 45 32 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E2("STMT-JOURNAL
129b0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
129c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
129d0 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
129e0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30  ta, pPg->pgno, 0
129f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12a00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
12a20 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
12a30 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
12a40 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
12a50 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
12a60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
12a70 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
12a80 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
12a90 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  c++;.      asser
12aa0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
12ab0 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  mt!=0 );.      p
12ac0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
12ad0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
12ae0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
12af0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f  .    }.    page_
12b00 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
12b10 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
12b20 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
12b30 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
12b40 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
12b50 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
12b60 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
12b70 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
12b80 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
12b90 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
12ba0 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67  r->memDb && pPag
12bb0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
12bc0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
12bd0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
12be0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
12bf0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
12c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12c10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
12c20 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
12c30 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
12c40 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
12c50 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
12c60 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
12c70 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
12c80 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
12c90 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
12ca0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
12cb0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
12cc0 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
12cd0 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
12ce0 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
12cf0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
12d00 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
12d10 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
12d20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f  pPg->dirty;.}../
12d30 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
12d40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69   content of a si
12d50 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74  ngle page with t
12d60 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
12d70 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61  n the third.** a
12d80 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
12d90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65  sqlite3pager_ove
12da0 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
12db0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
12dc0 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
12dd0 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
12de0 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
12df0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
12e00 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
12e10 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
12e20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12e30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
12e40 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
12e50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
12e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12e70 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20    memcpy(pPage, 
12e80 70 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 50 41  pData, SQLITE_PA
12e90 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  GE_SIZE);.    }.
12ea0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
12eb0 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
12ec0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
12ee0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
12ef0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
12f00 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
12f10 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
12f20 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
12f30 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67  tion on page "pg
12f40 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20  no" back to the 
12f50 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
12f60 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
12f70 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
12f80 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
12f90 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
12fa0 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
12fb0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
12fc0 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
12fd0 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
12fe0 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
12ff0 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
13000 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
13010 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
13020 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
13030 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
13040 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
13050 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
13060 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
13070 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
13080 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
13090 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65  nt_rollback() be
130a0 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
130b0 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
130c0 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
130d0 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
130e0 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
130f0 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
13100 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ELETEs..**.** Wh
13110 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
13120 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74  is called, set t
13130 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
13140 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a  k flag to true..
13150 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
13160 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61  lls to sqlite3pa
13170 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
13180 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65  k() for the same
13190 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68   page.** will th
131a0 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f  ereafter be igno
131b0 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65  red.  This is ne
131c0 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64  cessary to avoid
131d0 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68   a problem.** wh
131e0 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20  ere a page with 
131f0 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
13200 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
13210 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66  ring one part of
13220 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
13230 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66  n then removed f
13240 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
13250 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20   during a later 
13260 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  part.** of the s
13270 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ame transaction 
13280 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73  and reused for s
13290 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
132a0 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69  e.  When it.** i
132b0 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f  s first added to
132c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74   the freelist, t
132d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
132e0 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75  alled.  When reu
132f0 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74  sed,.** the dont
13300 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  _rollback() rout
13310 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
13320 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
13330 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  page contains.**
13340 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
13350 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
13360 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
13370 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
13380 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20  spite.** of the 
13390 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
133a0 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
133b0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
133c0 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
133d0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
133e0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
133f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
13400 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mDb ) return;.. 
13410 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
13420 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
13430 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  );.  pPg->always
13440 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
13450 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e  if( pPg && pPg->
13460 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28  dirty ){.    if(
13470 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
13480 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
13490 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
134a0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
134b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
134c0 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
134d0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
134e0 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
134f0 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
13500 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
13510 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
13520 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
13530 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
13540 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
13550 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
13560 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13570 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
13580 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
13590 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
135a0 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
135b0 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
135c0 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
135d0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
135e0 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
135f0 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
13600 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
13610 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
13620 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
13630 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
13640 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
13650 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
13660 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
13670 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
13680 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
13690 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
136a0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
136b0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
136c0 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
136d0 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
136e0 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70 50   %d\n", pgno, pP
136f0 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
13700 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
13710 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
13720 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
13730 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
13740 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
13750 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
13760 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
13770 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
13780 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
13790 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
137a0 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
137b0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
137c0 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
137d0 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
137e0 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
137f0 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
13800 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urnal..*/.void s
13810 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
13820 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _rollback(void *
13830 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
13840 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
13850 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
13860 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
13870 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
13880 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
13890 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  !=PAGER_EXCLUSIV
138a0 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  E || pPager->jou
138b0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
138c0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
138d0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
138e0 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
138f0 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
13900 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74  ger->memDb ) ret
13910 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d  urn;.  if( !pPg-
13920 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
13930 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
13940 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
13950 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
13960 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
13970 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70  rnal!=0 );.    p
13980 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
13990 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
139a0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
139b0 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  7);.    pPg->inJ
139c0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
139d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
139e0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70  InUse ){.      p
139f0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
13a00 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
13a10 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
13a20 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
13a30 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
13a40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
13a50 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
13a60 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
13a70 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
13a80 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
13a90 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
13aa0 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70  >stmtInUse && !p
13ab0 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69  Pg->inStmt && (i
13ac0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
13ad0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
13ae0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
13af0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
13b00 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
13b10 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
13b20 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
13b30 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
13b40 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
13b50 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
13b60 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
13b70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
13b80 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
13b90 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  t_list(pPg);.  }
13ba0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  .}.../*.** Clear
13bb0 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f   a PgHistory blo
13bc0 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
13bd0 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50  d clearHistory(P
13be0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29  gHistory *pHist)
13bf0 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  {.  sqliteFree(p
13c00 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20  Hist->pOrig);.  
13c10 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
13c20 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73  ->pStmt);.  pHis
13c30 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20  t->pOrig = 0;.  
13c40 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
13c50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
13c60 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
13c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
13c80 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
13c90 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
13ca0 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
13cb0 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
13cc0 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
13cd0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
13ce0 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
13cf0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
13d00 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
13d10 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
13d20 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
13d30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13d40 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67  pager_commit(Pag
13d50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
13d60 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
13d70 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  pPg;..  if( pPag
13d80 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47  er->errMask==PAG
13d90 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
13da0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
13db0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
13dc0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
13dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13de0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13df0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
13e00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13e10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
13e20 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
13e30 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
13e40 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
13e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
13e60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
13e70 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
13e80 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
13e90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13ea0 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d   }.  TRACE2("COM
13eb0 4d 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  MIT %d\n", pPage
13ec0 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20  r->fd.h);.  if( 
13ed0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
13ee0 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
13ef0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
13f00 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
13f10 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
13f20 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
13f30 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ry(PGHDR_TO_HIST
13f40 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a  (pPg, pPager));.
13f50 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
13f60 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
13f70 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
13f80 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
13f90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
13fa0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
13fb0 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
13fc0 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
13fd0 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
13fe0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13ff0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
14000 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
14010 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
14020 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
14030 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
14040 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
14050 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
14060 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
14070 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
14080 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
14090 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
140a0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
140b0 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
140c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
140d0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
140e0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
140f0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
14100 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
14110 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
14120 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
14130 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ache==0 ){.    /
14140 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69  * Exit early (wi
14150 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20  thout doing the 
14160 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73  time-consuming s
14170 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63  qlite3OsSync() c
14180 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20  alls).    ** if 
14190 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
141a0 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  no changes to th
141b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
141c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
141d0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
141e0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
141f0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
14200 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
14210 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14220 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
14230 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
14240 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14250 4f 70 65 6e 20 29 3b 0a 23 69 66 20 30 0a 20 20  Open );.#if 0.  
14260 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
14270 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69  (pPager, 0);.  i
14280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14290 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d   ){.    goto com
142a0 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
142b0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
142c0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
142d0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
142e0 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pPg ){.    rc = 
142f0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
14300 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
14310 66 28 20 72 63 20 7c 7c 20 28 21 70 50 61 67 65  f( rc || (!pPage
14320 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 73 71 6c  r->noSync && sql
14330 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67  ite3OsSync(&pPag
14340 65 72 2d 3e 66 64 29 21 3d 53 51 4c 49 54 45 5f  er->fd)!=SQLITE_
14350 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  OK) ){.      got
14360 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a  o commit_abort;.
14370 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14380 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
14390 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72  ager_sync(pPager
143a0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
143b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
143c0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f   goto commit_abo
143d0 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  rt;.  }.  rc = p
143e0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
143f0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
14400 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
14410 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
14420 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
14430 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
14440 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20  rong during the 
14450 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
14460 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72    */.commit_abor
14470 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
14480 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
14490 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
144a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
144b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
144c0 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  FULL;.  }.  retu
144d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
144e0 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
144f0 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
14500 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
14510 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
14520 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
14530 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
14540 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
14550 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
14560 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
14570 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
14580 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
14590 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
145a0 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
145b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
145c0 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
145d0 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
145e0 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28  cking protocol (
145f0 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29  SQLITE_PROTOCOL)
14600 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
14610 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
14620 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
14630 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
14640 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
14650 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
14660 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
14670 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
14680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
14690 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
146a0 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
146b0 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
146c0 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
146d0 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
146e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
146f0 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
14700 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
14710 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
14720 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  ){.  int rc;.  T
14730 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
14740 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
14750 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d.h);.  if( pPag
14760 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
14770 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
14780 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
14790 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
147a0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
147b0 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
147c0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
147d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
147e0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  ;.      if( !p->
147f0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
14800 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
14810 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
14820 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
14830 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  )->pOrig );.    
14840 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
14850 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
14860 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
14870 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  er))->pStmt );. 
14880 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14890 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
148a0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
148b0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
148c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
148d0 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
148e0 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
148f0 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69  _TO_DATA(p), pHi
14900 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65  st->pOrig, pPage
14910 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14920 20 20 20 20 20 20 54 52 41 43 45 32 28 22 52 4f        TRACE2("RO
14930 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 5c 6e  LLBACK-PAGE %d\n
14940 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  ", p->pgno);.   
14950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14960 20 20 54 52 41 43 45 32 28 22 50 41 47 45 20 25    TRACE2("PAGE %
14970 64 20 69 73 20 63 6c 65 61 6e 5c 6e 22 2c 20 70  d is clean\n", p
14980 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
14990 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
149a0 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
149b0 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a    p->dirty = 0;.
149c0 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e        p->inJourn
149d0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  al = 0;.      p-
149e0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
149f0 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20     p->pPrevStmt 
14a00 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  = p->pNextStmt =
14a10 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   0;..      if( p
14a20 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
14a30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
14a40 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
14a50 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
14a60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14a70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14a80 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
14a90 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
14aa0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
14ab0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  e = pPager->orig
14ac0 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f  DbSize;.    memo
14ad0 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
14ae0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
14af0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
14b00 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
14b10 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
14b20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14b30 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
14b40 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  ( !pPager->dirty
14b50 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72  Cache || !pPager
14b60 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
14b70 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
14b80 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
14b90 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
14ba0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
14bb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
14bc0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
14bd0 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50  errMask!=0 && pP
14be0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50  ager->errMask!=P
14bf0 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b  AGER_ERR_FULL ){
14c00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14c10 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
14c20 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
14c30 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
14c40 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
14c50 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  }.    return pag
14c60 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
14c70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
14c80 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
14c90 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
14ca0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
14cb0 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61  rc = pager_reloa
14cc0 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
14cd0 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
14ce0 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
14cf0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
14d00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14d10 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
14d20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
14d30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
14d40 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
14d50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
14d60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
14d80 52 55 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72  RUPT;.    pPager
14d90 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
14da0 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
14db0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
14dc0 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
14dd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14de0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
14df0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14e00 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
14e10 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
14e20 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
14e30 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
14e40 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
14e50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
14e60 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
14e70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14e80 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
14e90 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
14ea0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14eb0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
14ec0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
14ed0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
14ee0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
14ef0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
14f00 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
14f10 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  a[9];.  a[0] = p
14f20 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
14f30 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
14f40 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
14f50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
14f60 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
14f70 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
14f80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
14f90 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
14fa0 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20  errMask;.  a[6] 
14fb0 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
14fc0 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
14fd0 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
14fe0 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
14ff0 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
15000 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
15010 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
15020 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
15030 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
15040 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
15050 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15060 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
15070 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
15080 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
15090 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
150a0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
150b0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
150c0 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
150d0 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
150e0 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
150f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
15100 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
15110 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
15120 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
15130 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
15140 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
15150 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28  SIZE];.  assert(
15160 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
15170 55 73 65 20 29 3b 0a 20 20 54 52 41 43 45 32 28  Use );.  TRACE2(
15180 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
15190 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29  ", pPager->fd.h)
151a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
151b0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
151c0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
151d0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
151e0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
151f0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
15200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15210 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
15220 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
15230 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
15240 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
15250 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15260 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
15270 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
15280 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50  rnalOpen );.  pP
15290 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
152a0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
152b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
152c0 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
152d0 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
152e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c  {.    sqlite3OsL
152f0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
15300 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
15310 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15320 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
15330 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
15340 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
15350 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
15360 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
15370 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
15380 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
15390 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
153a0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
153b0 4a 53 69 7a 65 20 3d 3d 20 0a 20 20 20 20 70 50  JSize == .    pP
153c0 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52 4e  ager->nRec*JOURN
153d0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
153e0 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   + JOURNAL_HDR_S
153f0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 23 65 6e  Z(pPager) );.#en
15400 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
15410 6d 74 4a 53 69 7a 65 20 3d 0a 20 20 20 20 20 70  mtJSize =.     p
15420 50 61 67 65 72 2d 3e 6e 52 65 63 2a 4a 4f 55 52  Pager->nRec*JOUR
15430 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
15440 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) + JOURNAL_HDR_
15450 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  SZ(pPager);.  pP
15460 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
15470 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
15480 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
15490 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
154a0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
154b0 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70  r_opentemp(zTemp
154c0 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  , &pPager->stfd)
154d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
154e0 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
154f0 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65  ailed;.    pPage
15500 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b  r->stmtOpen = 1;
15510 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
15520 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  tNRec = 0;.  }. 
15530 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
15540 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  se = 1;.  return
15550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74   SQLITE_OK;. .st
15560 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a  mt_begin_failed:
15570 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
15580 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  InStmt ){.    sq
15590 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
155a0 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70  >aInStmt);.    p
155b0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
155c0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
155d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
155e0 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74  mmit a statement
155f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15600 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
15610 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
15620 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
15630 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
15640 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
15650 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28  ext;.    TRACE2(
15660 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
15670 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
15680 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
15690 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
156a0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
156b0 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
156c0 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  0);.      /* sql
156d0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26  ite3OsTruncate(&
156e0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
156f0 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
15700 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
15710 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
15720 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
15730 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
15740 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
15750 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
15760 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
15770 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  xt = pPg->pNextS
15780 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tmt;.      asser
15790 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  t( pPg->inStmt )
157a0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
157b0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
157c0 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
157d0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
157e0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
157f0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
15800 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
15810 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
15820 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
15830 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ger);.        sq
15840 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
15850 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
15860 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
15870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15880 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
15890 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
158a0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
158b0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
158c0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pStmt = 0;.  }.
158d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
158e0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
158f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15900 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
15910 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  k a statement..*
15920 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
15930 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b  er_stmt_rollback
15940 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15950 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
15960 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
15970 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32  se ){.    TRACE2
15980 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
15990 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
159a0 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20 70 50  d.h);.    if( pP
159b0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
159c0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
159d0 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
159e0 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
159f0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
15a00 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
15a10 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
15a20 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
15a30 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
15a40 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
15a50 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
15a60 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
15a70 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
15a80 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
15a90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
15aa0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15ab0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
15ac0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
15ad0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
15ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15af0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
15b00 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
15b10 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
15b20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
15b30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15b40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15b50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15b60 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
15b70 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
15b80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15b90 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
15ba0 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
15bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
15bc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15bd0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
15be0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
15bf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15c00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
15c10 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
15c20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15c30 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
15c40 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
15c50 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
15c60 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
15c70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
15c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15c90 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
15ca0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
15cb0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
15cc0 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
15cd0 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20  r_dirname(Pager 
15ce0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
15cf0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
15d00 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
15d10 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
15d20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
15d30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
15d40 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
15d50 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61  ite3pager_journa
15d60 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
15d70 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
15d80 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
15d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
15da0 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
15db0 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73   pager.*/.void s
15dc0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
15dd0 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  codec(.  Pager *
15de0 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28  pPager,.  void (
15df0 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
15e00 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
15e10 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
15e20 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
15e30 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
15e40 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
15e50 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
15e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
15e70 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
15e80 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
15e90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15ea0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
15eb0 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
15ec0 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
15ed0 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
15ee0 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
15ef0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
15f00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15f10 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
15f20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
15f30 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
15f40 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ter;.  int rc;..
15f50 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
15f60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
15f70 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72   writing. */.  r
15f80 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
15f90 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  _get(pPager, 1, 
15fa0 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
15fb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
15fc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
15fd0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
15fe0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  ite(pPage);.  if
15ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16000 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
16010 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72  /* Read the curr
16020 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74  ent value at byt
16030 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64  e 24. */.  pPgHd
16040 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  r = DATA_TO_PGHD
16050 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e  R(pPage);.  chan
16060 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74  ge_counter = ret
16070 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48  rieve32bits(pPgH
16080 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49  dr, 24);..  /* I
16090 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
160a0 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
160b0 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
160c0 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
160d0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
160e0 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73 28  ;.  store32bits(
160f0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20  change_counter, 
16100 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20  pPgHdr, 24);..  
16110 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
16120 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
16130 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  /.  sqlite3pager
16140 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
16150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16160 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
16170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16180 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
16190 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
161a0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
161b0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
161c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
161d0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
161e0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
161f0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
16200 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
16210 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
16220 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
16230 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
16240 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
16250 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
16260 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
16270 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16280 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  e ensures that t
16290 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
162a0 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20  nced, all dirty 
162b0 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  pages written.**
162c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
162d0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61   file and the da
162e0 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
162f0 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  ed. The only thi
16300 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69  ng that.** remai
16310 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
16320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16330 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
16340 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a  urnal file (or.*
16350 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
16360 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
16370 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
16380 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
16390 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
163a0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
163b0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
163c0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
163d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
163e0 63 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74  c() call..*/.int
163f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
16400 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
16410 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
16420 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
16430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
16440 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
16450 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
16460 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
16470 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
16480 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
16490 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
164a0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
164b0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
164c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
164d0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
164e0 53 59 4e 43 45 44 20 26 26 20 21 70 50 61 67 65  SYNCED && !pPage
164f0 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67  r->memDb && pPag
16500 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
16510 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
16520 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
16530 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16540 6e 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70  n );..    rc = p
16550 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
16560 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b  counter(pPager);
16570 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
16580 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
16590 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
165a0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
165b0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63  l file */.    rc
165c0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
165d0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
165e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
165f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
16600 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
16610 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
16620 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
16630 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
16640 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
16650 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
16660 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
16670 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
16680 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
16690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
166a0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
166b0 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  c_exit;..    /* 
166c0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
166d0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
166e0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
166f0 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
16700 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26   sqlite3OsSync(&
16710 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
16720 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
16730 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
16740 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  NCED;.  }..sync_
16750 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
16760 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
16770 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
16780 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
16790 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
167a0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
167b0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69   state of the fi
167c0 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20  le lock for the 
167d0 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
167e0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
167f0 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f   is one of NO_LO
16800 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
16810 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a   RESERVED_LOCK,.
16820 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c  ** PENDING_LOCK,
16830 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
16840 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
16850 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74  e3pager_lockstat
16860 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
16870 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
16880 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a  r->fd.locktype;.
16890 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
168a0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
168b0 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
168c0 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
168d0 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
168e0 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
168f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
16900 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67  ager_refdump(Pag
16910 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
16920 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
16930 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
16940 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
16950 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
16960 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
16970 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
16980 20 70 72 69 6e 74 66 28 22 50 41 47 45 20 25 33   printf("PAGE %3
16990 64 20 61 64 64 72 3d 30 78 25 30 38 78 20 6e 52  d addr=0x%08x nR
169a0 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ef=%d\n", .     
169b0 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e    pPg->pgno, (in
169c0 74 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t)PGHDR_TO_DATA(
169d0 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29  pPg), pPg->nRef)
169e0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a     ;.  }.}.#endif.