/ Hex Artifact Content
Login

Artifact 3fb0fa47da302a6de2a613f755d0b637932b27d4:


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 35  : pager.c,v 1.15
0350: 30 20 32 30 30 34 2f 30 37 2f 31 39 20 32 32 3a  0 2004/07/19 22:
0360: 30 38 3a 31 30 20 64 72 68 20 45 78 70 20 24 0a  08:10 drh Exp $.
0370: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  */.#include "os.
0380: 68 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  h"         /* Mu
0390: 73 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65  st be first to e
03a0: 6e 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65  nable large file
03b0: 20 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63   support */.#inc
03c0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
03d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  h".#include "pag
03e0: 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  er.h".#include <
03f0: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
0400: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f  de <string.h>../
0410: 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20  *.** Macros for 
0420: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e  troubleshooting.
0430: 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65    Normally turne
0440: 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 73  d off.*/.#if 0.s
0450: 74 61 74 69 63 20 50 61 67 65 72 20 2a 6d 61 69  tatic Pager *mai
0460: 6e 50 61 67 65 72 20 3d 20 30 3b 0a 23 64 65 66  nPager = 0;.#def
0470: 69 6e 65 20 53 45 54 5f 50 41 47 45 52 28 58 29  ine SET_PAGER(X)
0480: 20 20 69 66 28 20 6d 61 69 6e 50 61 67 65 72 3d    if( mainPager=
0490: 3d 30 20 29 20 6d 61 69 6e 50 61 67 65 72 20 3d  =0 ) mainPager =
04a0: 20 28 58 29 0a 23 64 65 66 69 6e 65 20 43 4c 52   (X).#define CLR
04b0: 5f 50 41 47 45 52 28 58 29 20 20 69 66 28 20 6d  _PAGER(X)  if( m
04c0: 61 69 6e 50 61 67 65 72 3d 3d 28 58 29 20 29 20  ainPager==(X) ) 
04d0: 6d 61 69 6e 50 61 67 65 72 20 3d 20 30 0a 23 64  mainPager = 0.#d
04e0: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
04f0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d      if( pPager==
0500: 6d 61 69 6e 50 61 67 65 72 20 29 20 73 71 6c 69  mainPager ) sqli
0510: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0520: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0530: 28 58 2c 59 29 20 20 20 69 66 28 20 70 50 61 67  (X,Y)   if( pPag
0540: 65 72 3d 3d 6d 61 69 6e 50 61 67 65 72 20 29 20  er==mainPager ) 
0550: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0560: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
0570: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 69 66  TRACE3(X,Y,Z) if
0580: 28 20 70 50 61 67 65 72 3d 3d 6d 61 69 6e 50 61  ( pPager==mainPa
0590: 67 65 72 20 29 20 73 71 6c 69 74 65 33 44 65 62  ger ) sqlite3Deb
05a0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a  ugPrintf(X,Y,Z).
05b0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 53 45  #else.#define SE
05c0: 54 5f 50 41 47 45 52 28 58 29 0a 23 64 65 66 69  T_PAGER(X).#defi
05d0: 6e 65 20 43 4c 52 5f 50 41 47 45 52 28 58 29 0a  ne CLR_PAGER(X).
05e0: 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58  #define TRACE1(X
05f0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0600: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52  (X,Y).#define TR
0610: 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 65 6e 64  ACE3(X,Y,Z).#end
0620: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  if.../*.** The p
0630: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0640: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0650: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0660: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0670: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
0680: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
0690: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
06a0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
06b0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
06e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
06f0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0720: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0730: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0760: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
0770: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0780: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0790: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
07a0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
07b0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
07c0: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
07d0: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
07e0: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0800: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0810: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0820: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0850: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0860: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0870: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
0880: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
0890: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
08a0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
08d0: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
08e0: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
08f0: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0910: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0920: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0930: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0950: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0960: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0970: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0980: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
09a0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
09b0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
09c0: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
09f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0a00: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0a10: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0a20: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0a30: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0a50: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0a60: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0a70: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0aa0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0ab0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0ac0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0ad0: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0ae0: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0af0: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0b00: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0b10: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0b20: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0b30: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0b60: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0b70: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0b80: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ba0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0bb0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0bc0: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0bf0: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0c00: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74 68   is to remove th
0c10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0c20: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
0c50: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
0c70: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0c80: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0c90: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0ca0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0cb0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0cc0: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 6f  te3pager_get() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 70 61 67   that sqlite3pag
0d90: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
0da0: 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20  lled, the state 
0db0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a  transitions to.*
0dc0: 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
0dd0: 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71  .  (Note that sq
0de0: 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28  lite_page_write(
0df0: 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) can only be.**
0e00: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75   called on an ou
0e10: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77  tstanding page w
0e20: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
0e30: 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a  the pager must.*
0e40: 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48  * be in PAGER_SH
0e50: 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74  ARED before it t
0e60: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41  ransitions to PA
0e70: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a  GER_RESERVED.).*
0e80: 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  * The transition
0e90: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
0ea0: 49 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20  IVE occurs when 
0eb0: 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
0ec0: 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74  es.** are made t
0ed0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
0ee0: 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73  ile.  After an s
0ef0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
0f00: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
0f10: 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite_pager_commit
0f20: 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f  (), the state go
0f30: 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  es back to PAGER
0f40: 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66  _SHARED..*/.#def
0f50: 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  ine PAGER_UNLOCK
0f60: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
0f70: 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20  PAGER_SHARED    
0f80: 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45    1.#define PAGE
0f90: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 0a  R_RESERVED    2.
0fa0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58  #define PAGER_EX
0fb0: 43 4c 55 53 49 56 45 20 20 20 33 0a 23 64 65 66  CLUSIVE   3.#def
0fc0: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
0fd0: 20 20 20 20 20 20 34 0a 0a 0a 2f 2a 0a 2a 2a 20        4.../*.** 
0fe0: 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  Each in-memory i
0ff0: 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62  mage of a page b
1000: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66  egins with the f
1010: 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e  ollowing header.
1020: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20  .** This header 
1030: 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20  is only visible 
1040: 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f  to this pager mo
1050: 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e  dule.  The clien
1060: 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63  t.** code that c
1070: 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20  alls pager sees 
1080: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68  only the data th
1090: 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68  at follows the h
10a0: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69  eader..**.** Cli
10b0: 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64 20  ent code should 
10c0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 70 61 67 65  call sqlite3page
10d0: 72 5f 77 72 69 74 65 28 29 20 6f 6e 20 61 20 70  r_write() on a p
10e0: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
10f0: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1100: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1110: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1120: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 70 61  t time sqlite3pa
1130: 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20 69  ger_write().** i
1140: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72  s called, the or
1150: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
1160: 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e  ents are written
1170: 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61   into the rollba
1180: 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ck.** journal an
1190: 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61  d PgHdr.inJourna
11a0: 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64  l and PgHdr.need
11b0: 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c  Sync are set.  L
11c0: 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68  ater, once.** th
11d0: 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68  e journal page h
11e0: 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20  as made it onto 
11f0: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
1200: 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  , PgHdr.needSync
1210: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20  .** is cleared. 
1220: 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61   The modified pa
1230: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69  ge cannot be wri
1240: 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
1250: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64  he original.** d
1260: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
1270: 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  il the journal p
1280: 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79  ages has been sy
1290: 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64  nced to disk and
12a0: 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65   the.** PgHdr.ne
12b0: 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20  edSync has been 
12c0: 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  cleared..**.** T
12d0: 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66  he PgHdr.dirty f
12e0: 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20  lag is set when 
12f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1300: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61  te() is called a
1310: 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nd.** is cleared
1320: 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20   again when the 
1330: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
1340: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
1350: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
1360: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1370: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1380: 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74   PgHdr PgHdr;.st
1390: 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50  ruct PgHdr {.  P
13a0: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c0: 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68   The pager to wh
13d0: 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65  ich this page be
13e0: 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  longs */.  Pgno 
13f0: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
1400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1410: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
1420: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1430: 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68  PgHdr *pNextHash
1440: 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f  , *pPrevHash;  /
1450: 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  * Hash collision
1460: 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72   chain for PgHdr
1470: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72  .pgno */.  PgHdr
1480: 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50   *pNextFree, *pP
1490: 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65  revFree;  /* Fre
14a0: 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 77  elist of pages w
14b0: 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a  here nRef==0 */.
14c0: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c    PgHdr *pNextAl
14d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
14e0: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
14f0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
1500: 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a  dr *pNextStmt, *
1510: 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c  pPrevStmt;  /* L
1520: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
1530: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1540: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
1550: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
1560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1570: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
1580: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
1590: 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b   */.  u8 inStmt;
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
15c0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
15d0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
15e0: 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20 20   u8 dirty;      
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e 65  /* TRUE if we ne
1610: 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b  ed to write back
1620: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38   changes */.  u8
1630: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1650: 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66  Sync journal bef
1660: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69 73  ore writing this
1670: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c   page */.  u8 al
1680: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
1690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
16a0: 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61  able dont_rollba
16b0: 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61  ck() for this pa
16c0: 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e  ge */.  short in
16d0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
16e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16f0: 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69   of users of thi
1700: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
1710: 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20  r *pDirty;      
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
1730: 72 74 79 20 70 61 67 65 73 20 73 6f 72 74 65 64  rty pages sorted
1740: 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a   by PgHdr.pgno *
1750: 2f 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 41  /.  /* SQLITE_PA
1760: 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6f 66  GE_SIZE bytes of
1770: 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f   page data follo
1780: 77 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f  w this header */
1790: 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74  .  /* Pager.nExt
17a0: 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61  ra bytes of loca
17b0: 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  l data follow th
17c0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  e page data */.}
17d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  ;../*.** For an 
17e0: 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64  in-memory only d
17f0: 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78  atabase, some ex
1800: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
1810: 69 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75  is recorded abou
1820: 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73  t.** each page s
1830: 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63  o that changes c
1840: 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1850: 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c  k.  (Journal fil
1860: 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73  es are not.** us
1870: 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ed for in-memory
1880: 20 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68   databases.)  Th
1890: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f  e following info
18a0: 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64  rmation is added
18b0: 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f   to.** the end o
18c0: 66 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c  f every EXTRA bl
18d0: 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ock for in-memor
18e0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  y databases..**.
18f0: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
1900: 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
1910: 65 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74  een added direct
1920: 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20  ly to the PgHdr 
1930: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75  structure..** Bu
1940: 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20  t then it would 
1950: 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61  take up an extra
1960: 20 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72   8 bytes of stor
1970: 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48  age on every PgH
1980: 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64  dr.** even for d
1990: 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61  isk-based databa
19a0: 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20  ses.  Splitting 
19b0: 69 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62  it out saves 8 b
19c0: 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69  ytes.  This.** i
19d0: 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73  s only a savings
19e0: 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f   of 0.8% but tho
19f0: 73 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61  se percentages a
1a00: 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65  dd up..*/.typede
1a10: 66 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  f struct PgHisto
1a20: 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74  ry PgHistory;.st
1a30: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b  ruct PgHistory {
1a40: 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20  .  u8 *pOrig;   
1a50: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61    /* Original pa
1a60: 67 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72  ge text.  Restor
1a70: 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66  e to this on a f
1a80: 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ull rollback */.
1a90: 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20    u8 *pStmt;    
1aa0: 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77   /* Text as it w
1ab0: 61 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  as at the beginn
1ac0: 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65  ing of the curre
1ad0: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
1ae0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
1af0: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
1b00: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
1b10: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
1b20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
1b30: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
1b40: 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58 29  e CODEC(P,D,N,X)
1b50: 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 29   if( P->xCodec )
1b60: 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  { P->xCodec(P->p
1b70: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b  CodecArg,D,N,X);
1b80: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
1b90: 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58 29  e CODEC(P,D,N,X)
1ba0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
1bb0: 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72  onvert a pointer
1bc0: 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f   to a PgHdr into
1bd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
1be0: 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61  s data.** and ba
1bf0: 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65  ck again..*/.#de
1c00: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41  fine PGHDR_TO_DA
1c10: 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28  TA(P)  ((void*)(
1c20: 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e  &(P)[1])).#defin
1c30: 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  e DATA_TO_PGHDR(
1c40: 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29 28  D)  (&((PgHdr*)(
1c50: 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65  D))[-1]).#define
1c60: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
1c70: 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68  P) ((void*)&((ch
1c80: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 53  ar*)(&(P)[1]))[S
1c90: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d  QLITE_PAGE_SIZE]
1ca0: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
1cb0: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
1cc0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
1cd0: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
1ce0: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
1cf0: 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28  PGR)->pageSize+(
1d00: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
1d10: 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f  /*.** How big to
1d20: 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
1d30: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  able used for lo
1d40: 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79  cating in-memory
1d50: 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67   pages.** by pag
1d60: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65  e number..*/.#de
1d70: 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32  fine N_PG_HASH 2
1d80: 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  048../*.** Hash 
1d90: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
1da0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
1db0: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28  ash(PN)  ((PN)&(
1dc0: 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f  N_PG_HASH-1))../
1dd0: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
1de0: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
1df0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1e00: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1e10: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
1e20: 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  r {.  char *zFil
1e30: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1e40: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1e50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1e60: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
1e70: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1e80: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
1e90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
1ea0: 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72   char *zDirector
1eb0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
1ec0: 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64  Directory hold d
1ed0: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
1ee0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f  nal files */.  O
1ef0: 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20  sFile fd, jfd;  
1f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1f10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
1f20: 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  or database and 
1f30: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46  journal */.  OsF
1f40: 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20 20 20  ile stfd;       
1f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1f60: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
1f70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
1f80: 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74  bjournal*/.  int
1f90: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
1fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1fb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1fc0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
1fd0: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
1fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1ff0: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
2000: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
2010: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2030: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
2040: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
2050: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
2060: 20 20 6f 66 66 5f 74 20 73 74 6d 74 4a 53 69 7a    off_t stmtJSiz
2070: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2080: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
2090: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
20a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
20d0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
20e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
20f0: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2110: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
2120: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
2130: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
2140: 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20  int stmtNRec;   
2150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2160: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
2170: 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72   in stmt subjour
2180: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  nal */.  int nEx
2190: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
21a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
21b0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
21c0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
21d0: 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ge */.  void (*x
21e0: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
21f0: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
2200: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2210: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
2220: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2230: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
2240: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
2250: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
2260: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
2270: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
2280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2290: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
22a0: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
22b0: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22d0: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
22e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
22f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2320: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2330: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2340: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2360: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2370: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
2380: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
2390: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
23a0: 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f  ss, nOvfl;     /
23b0: 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69  * Cache hits, mi
23c0: 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f  ssing, and LRU o
23d0: 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 76 6f  verflows */.  vo
23e0: 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
23f0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
2400: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
2410: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
2420: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
2430: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
2440: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
2450: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
2460: 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  () */.  u8 journ
2470: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
2480: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
2490: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
24a0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
24b0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
24c0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
24d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
24e0: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
24f0: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2500: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2520: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2530: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2540: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
2550: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2560: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2570: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
2580: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
2590: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
25c0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
25d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
25e0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
25f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2600: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
2610: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
2620: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
2630: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2650: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
2660: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
2670: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
2680: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2690: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
26a0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
26b0: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
26c0: 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b  s */.  u8 state;
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
26f0: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
2700: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
2710: 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20    u8 errMask;   
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2730: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
2740: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
2750: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
2760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2770: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
2780: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2790: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
27a0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
27b0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
27c0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
27d0: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
27e0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
27f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2800: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
2810: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
2820: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2830: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
2840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2850: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
2860: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
2870: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2880: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
2890: 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  sable dont_rollb
28a0: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
28b0: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
28c0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
28d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
28e0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
28f0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61 49   I/O */.  u8 *aI
2900: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
2910: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2920: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2930: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2940: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
2950: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
2960: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2970: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2980: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2990: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
29a0: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
29b0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
29c0: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
29d0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
29e0: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
29f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
2a00: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
2a10: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
2a20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2a30: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
2a40: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
2a50: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
2a60: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2a70: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
2a80: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
2a90: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
2aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2ab0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2ac0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
2ad0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
2ae0: 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53   *aHash[N_PG_HAS
2af0: 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74  H];    /* Hash t
2b00: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
2b10: 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72   number to PgHdr
2b20: 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 6a 6f 75 72   */.  off_t jour
2b30: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
2b40: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
2b50: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
2b60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
2b70: 20 20 6f 66 66 5f 74 20 6a 6f 75 72 6e 61 6c 48    off_t journalH
2b80: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
2b90: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
2ba0: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
2bb0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 6f 66 66   header */.  off
2bc0: 5f 74 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20  _t stmtHdrOff;  
2bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2be0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
2bf0: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
2c00: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 6f 66 66  atement */.  off
2c10: 5f 74 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20  _t stmtCksum;   
2c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
2c30: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
2c40: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
2c50: 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72   */.  int sector
2c60: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2c70: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
2c80: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
2c90: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
2ca0: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
2cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2cc0: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
2cd0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2ce0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 7d 3b 0a 0a   to jrnl */.};..
2cf0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
2d00: 62 69 74 73 20 74 68 61 74 20 63 61 6e 20 62 65  bits that can be
2d10: 20 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72   set in Pager.er
2d20: 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e  rMask..*/.#defin
2d30: 65 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  e PAGER_ERR_FULL
2d40: 20 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20       0x01  /* a 
2d50: 77 72 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a  write() failed *
2d60: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
2d70: 45 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30  ERR_MEM      0x0
2d80: 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66  2  /* malloc() f
2d90: 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ailed */.#define
2da0: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
2db0: 20 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72      0x04  /* err
2dc0: 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  or in the lockin
2dd0: 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64  g protocol */.#d
2de0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
2df0: 43 4f 52 52 55 50 54 20 20 30 78 30 38 20 20 2f  CORRUPT  0x08  /
2e00: 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f  * database or jo
2e10: 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
2e20: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
2e30: 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30  R_ERR_DISK     0
2e40: 78 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20  x10  /* general 
2e50: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d  disk I/O error -
2e60: 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65 3f   bad hard drive?
2e70: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e   */../*.** Journ
2e80: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
2e90: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
2ea0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
2eb0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
2ec0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
2ed0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
2ee0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
2ef0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
2f00: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
2f10: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
2f20: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
2f30: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
2f40: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
2f50: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
2f60: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
2f70: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
2f80: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
2f90: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
2fa0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
2fb0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
2fc0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
2fd0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
2fe0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
2ff0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
3000: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
3010: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
3020: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
3030: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3040: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3050: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3060: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3070: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3080: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3090: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
30a0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
30b0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
30c0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
30d0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
30e0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
30f0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3100: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
3110: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
3120: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
3130: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3140: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3150: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3160: 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f   and the SQLITE_
3170: 50 41 47 45 5f 53 49 5a 45 20 62 79 74 65 73 20  PAGE_SIZE bytes 
3180: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3190: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
31a0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
31b0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
31c0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
31d0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
31e0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
31f0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3200: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3210: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
3220: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3230: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3240: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3250: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3260: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3270: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3280: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3290: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
32a0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
32b0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
32c0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
32d0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
32e0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
32f0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3300: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3310: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
3320: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3330: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3340: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3350: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3360: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3370: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3380: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3390: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
33a0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
33b0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
33c0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
33d0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
33e0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
33f0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
3400: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
3410: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
3420: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
3430: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
3440: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3450: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
3460: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
3470: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3480: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3490: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
34a0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
34b0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
34c0: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
34d0: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
34e0: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
34f0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
3500: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
3510: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
3520: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
3530: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
3540: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
3550: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
3560: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3570: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
3580: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
3590: 53 69 7a 65 29 0a 0a 23 64 65 66 69 6e 65 20 50  Size)..#define P
35a0: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
35b0: 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65   512../*.** Page
35c0: 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a   number PAGER_MJ
35d0: 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75  _PGNO is never u
35e0: 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  sed in an SQLite
35f0: 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73   database (it is
3600: 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72  .** reserved for
3610: 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20   working around 
3620: 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20  a windows/posix 
3630: 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  incompatibility)
3640: 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20  . It is.** used 
3650: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  in the journal t
3660: 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74  o signify that t
3670: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
3680: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3690: 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20   .** is devoted 
36a0: 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73  to storing a mas
36b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
36c0: 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   - there are no 
36d0: 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a  more pages to.**
36e0: 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20   roll back. See 
36f0: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e  comments for fun
3700: 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65  ction writeMaste
3710: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64  rJournal() for d
3720: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69  etails..*/.#defi
3730: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
3740: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
3750: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
3760: 29 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  ))../*.** Enable
3770: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3780: 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64   tracking (for d
3790: 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a  ebugging) here:.
37a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
37b0: 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65  _TEST.  int page
37c0: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
37d0: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
37e0: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
37f0: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
3800: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
3810: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
3820: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
3830: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
3840: 20 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20     printf(.     
3850: 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61    "REFCNT: %4d a
3860: 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d  ddr=0x%08x nRef=
3870: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
3880: 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44  >pgno, (int)PGHD
3890: 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d  R_TO_DATA(p), p-
38a0: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
38b0: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
38c0: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
38d0: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
38e0: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
38f0: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
3900: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
3910: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
3920: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  O(X).#endif../*.
3930: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
3940: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
3950: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
3960: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
3970: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
3980: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
3990: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
39a0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
39b0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
39c0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
39d0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
39e0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
39f0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
3a00: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
3a10: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
3a20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
3a30: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
3a40: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
3a50: 20 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20   u32 res;.  int 
3a60: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
3a70: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65  e3OsRead(fd, &re
3a80: 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b  s, sizeof(res));
3a90: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
3aa0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69  E_OK ){.    unsi
3ab0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
3ac0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20  .    memcpy(ac, 
3ad0: 26 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65  &res, 4);.    re
3ae0: 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20  s = (ac[0]<<24) 
3af0: 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20  | (ac[1]<<16) | 
3b00: 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b  (ac[2]<<8) | ac[
3b10: 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  3];.  }.  *pRes 
3b20: 3d 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20  = res;.  return 
3b30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
3b40: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
3b50: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
3b60: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
3b70: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
3b80: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
3b90: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
3ba0: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
3bb0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
3bc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
3bd0: 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a  e32bits(OsFile *
3be0: 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  fd, u32 val){.  
3bf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
3c00: 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28  [4];.  ac[0] = (
3c10: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
3c20: 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e  .  ac[1] = (val>
3c30: 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >16) & 0xff;.  a
3c40: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
3c50: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20  & 0xff;.  ac[3] 
3c60: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20  = val & 0xff;.  
3c70: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
3c80: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29  Write(fd, ac, 4)
3c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
3ca0: 20 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65   the 32-bit inte
3cb0: 67 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74  ger 'val' into t
3cc0: 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
3cd0: 65 64 20 62 79 20 70 61 67 65 20 68 65 61 64 65  ed by page heade
3ce0: 72 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73  r.** 'p' at offs
3cf0: 65 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a  et 'offset'..*/.
3d00: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72  static void stor
3d10: 65 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c  e32bits(u32 val,
3d20: 20 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f   PgHdr *p, int o
3d30: 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e  ffset){.  unsign
3d40: 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61  ed char *ac;.  a
3d50: 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20  c = &((unsigned 
3d60: 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
3d70: 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b  ATA(p))[offset];
3d80: 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e  .  ac[0] = (val>
3d90: 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >24) & 0xff;.  a
3da0: 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29  c[1] = (val>>16)
3db0: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d   & 0xff;.  ac[2]
3dc0: 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78   = (val>>8) & 0x
3dd0: 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61  ff;.  ac[3] = va
3de0: 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a  l & 0xff;.}../*.
3df0: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
3e00: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
3e10: 65 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d  et 'offset' from
3e20: 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69   the page identi
3e30: 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20  fied by.** page 
3e40: 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73  header 'p'..*/.s
3e50: 74 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65  tatic u32 retrie
3e60: 76 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a  ve32bits(PgHdr *
3e70: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
3e80: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3e90: 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75  *ac;.  ac = &((u
3ea0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47  nsigned char*)PG
3eb0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b  HDR_TO_DATA(p))[
3ec0: 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72  offset];.  retur
3ed0: 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  n (ac[0]<<24) | 
3ee0: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
3ef0: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
3f00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
3f10: 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  ert the bits in 
3f20: 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  the pPager->errM
3f30: 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72  ask into an appr
3f40: 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e  oprate.** return
3f50: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
3f60: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f   int pager_errco
3f70: 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
3f80: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
3f90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
3fa0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
3fb0: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
3fc0: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
3fd0: 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28  _PROTOCOL;.  if(
3fe0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3ff0: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53   & PAGER_ERR_DIS
4000: 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K )    rc = SQLI
4010: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20  TE_IOERR;.  if( 
4020: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4030: 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  & PAGER_ERR_FULL
4040: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
4050: 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50  E_FULL;.  if( pP
4060: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4070: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20  PAGER_ERR_MEM ) 
4080: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4090: 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61  NOMEM;.  if( pPa
40a0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
40b0: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
40c0: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
40d0: 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e  ORRUPT;.  return
40e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68   rc;.}../*.** Wh
40f0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
4100: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
4110: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
4120: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
4130: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
4140: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
4150: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
4160: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
4170: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
4180: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
4190: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
41a0: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a  iteMalloc(). *pz
41b0: 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74  Master is.** set
41c0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
41d0: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
41e0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
41f0: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a  The caller must.
4200: 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20  ** sqliteFree() 
4210: 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  *pzMaster..**.**
4220: 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   If no master jo
4230: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
4240: 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61  is present *pzMa
4250: 73 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  ster is set to 0
4260: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
4270: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
4280: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
4290: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69  sterJournal(OsFi
42a0: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
42b0: 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  **pzMaster){.  i
42c0: 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e  nt rc;.  u32 len
42d0: 3b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20  ;.  off_t szJ;. 
42e0: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e   u32 cksum;.  in
42f0: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
4300: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
4310: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
4320: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
4330: 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61  ader */..  *pzMa
4340: 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20  ster = 0;..  rc 
4350: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
4360: 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29  ize(pJrnl, &szJ)
4370: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
4380: 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20  TE_OK || szJ<16 
4390: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
43a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
43b0: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
43c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
43d0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
43e0: 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61  rc;. .  rc = rea
43f0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26  d32bits(pJrnl, &
4400: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
4410: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
4420: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
4430: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
4440: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
4450: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
4460: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
4470: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4480: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
4490: 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  8);.  if( rc!=SQ
44a0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d  LITE_OK || memcm
44b0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
44c0: 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65  alMagic, 8) ) re
44d0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
44e0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
44f0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e  Jrnl, szJ-16-len
4500: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
4510: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
4520: 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72  rc;..  *pzMaster
4530: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
4540: 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a  eMalloc(len+1);.
4550: 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72    if( !*pzMaster
4560: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4570: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
4580: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
4590: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a  sRead(pJrnl, *pz
45a0: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
45b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
45c0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
45d0: 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a  ree(*pzMaster);.
45e0: 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20      *pzMaster = 
45f0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  0;.    return rc
4600: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
4610: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
4620: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
4630: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
4640: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
4650: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
4660: 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74  ksum -= (*pzMast
4670: 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66  er)[i];.  }.  if
4680: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
4690: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
46a0: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
46b0: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
46c0: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
46d0: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
46e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
46f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
4700: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
4710: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
4720: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
4730: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
4740: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
4750: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
4760: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
4770: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
4780: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
4790: 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a    sqliteFree(*pz
47a0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a  Master);.    *pz
47b0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  Master = 0;.  }.
47c0: 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65    (*pzMaster)[le
47d0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20  n] = '\0';.   . 
47e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
47f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
4800: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4810: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
4820: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
4830: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
4840: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
4850: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
4860: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
4870: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
4880: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
4890: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
48a0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
48b0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
48c0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
48d0: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
48e0: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
48f0: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4920: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
4940: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
4960: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
4980: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
49a0: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
49b0: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
49c0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
49d0: 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6f 66 66  er){.  off_t off
49e0: 73 65 74 20 3d 20 30 3b 0a 20 20 6f 66 66 5f 74  set = 0;.  off_t
49f0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
4a00: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
4a10: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
4a20: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
4a30: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
4a40: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
4a50: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
4a60: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
4a70: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
4a80: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
4a90: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
4aa0: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
4ab0: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
4ac0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4ad0: 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r) );.  pPager->
4ae0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66  journalOff = off
4af0: 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  set;.  return sq
4b00: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
4b10: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
4b20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d  ->journalOff);.}
4b30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
4b40: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
4b50: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
4b60: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4b70: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
4b80: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
4b90: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
4ba0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
4bb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
4bc0: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
4bd0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
4be0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
4bf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
4c00: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
4c10: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
4c20: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
4c30: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
4c40: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
4c50: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
4c60: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
4c70: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
4c80: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
4c90: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
4ca0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
4cb0: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
4cc0: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
4cd0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
4ce0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
4cf0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
4d00: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
4d10: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
4d20: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a   journal..** .**
4d30: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
4d40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
4d50: 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  4) bytes of unus
4d60: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
4d70: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
4d80: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
4d90: 50 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72  Pager){..  int r
4da0: 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  c = seekJournalH
4db0: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  dr(pPager);.  if
4dc0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
4dd0: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
4de0: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
4df0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
4e00: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
4e10: 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  HdrOff==0 ){.   
4e20: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
4e30: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
4e40: 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20  urnalHdr;.  }.  
4e50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4e60: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
4e70: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20  R_SZ(pPager);.. 
4e80: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a   /* FIX ME: .  *
4e90: 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  *.  ** Possibly 
4ea0: 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20  for a pager not 
4eb0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
4ec0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67   the journal mag
4ed0: 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20  ic should not.  
4ee0: 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e  ** be written un
4ef0: 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c  til nRec is fill
4f00: 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66  ed in as part of
4f10: 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61   next syncJourna
4f20: 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l(). .  **.  ** 
4f30: 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74  Actually maybe t
4f40: 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
4f50: 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62   header should b
4f60: 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  e delayed until 
4f70: 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e  that.  ** point.
4f80: 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
4f90: 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
4fa0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
4fb0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
4fc0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
4fd0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
4fe0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
4ff0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
5000: 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64  * The nRec Field
5010: 2e 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72  . 0xFFFFFFFF for
5020: 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c   no-sync journal
5030: 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77  s. */.    rc = w
5040: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
5050: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
5060: 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66  >noSync ? 0xffff
5070: 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20  ffff : 0);.  }. 
5080: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5090: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
50a0: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
50b0: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
50c0: 2f 20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61  / .    sqlite3Ra
50d0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
50e0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
50f0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
5100: 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20  umInit);.    rc 
5110: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
5120: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5130: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
5140: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
5150: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
5160: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
5170: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
5180: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
5190: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
51a0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
51b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
51c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
51d0: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
51e0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
51f0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
5200: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
5210: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5220: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  fd, pPager->sect
5230: 6f 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  orSize);.  }..  
5240: 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  /* The journal h
5250: 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77  eader has been w
5260: 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75  ritten successfu
5270: 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f  lly. Seek the jo
5280: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
5290: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
52a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
52b0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
52c0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  or..  */.  if( r
52d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
52e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
52f0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
5300: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5310: 66 66 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20  ff-1);.    rc = 
5320: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
5330: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
5340: 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  00", 1);.  }.  r
5350: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5360: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
5370: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
5380: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
5390: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
53a0: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
53b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
53c0: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
53d0: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
53e0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
53f0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
5400: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
5410: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
5420: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
5430: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
5440: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
5450: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
5460: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
5470: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
5480: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
5490: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
54a0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
54b0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
54c0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
54d0: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
54e0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
54f0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
5500: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
5510: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
5520: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
5530: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5540: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
5550: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
5560: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
5570: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
5580: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
5590: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
55a0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
55b0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
55c0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
55d0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
55e0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
55f0: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
5600: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
5610: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
5620: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
5630: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
5640: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
5650: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
5660: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
5670: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5680: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
5690: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
56a0: 0a 20 20 6f 66 66 5f 74 20 6a 6f 75 72 6e 61 6c  .  off_t journal
56b0: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
56c0: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
56d0: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
56e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
56f0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
5700: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
5710: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
5720: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b   */..  rc = seek
5730: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
5740: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
5750: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
5760: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5770: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
5780: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
5790: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
57a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
57b0: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
57c0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
57d0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
57e0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
57f0: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  c));.  if( rc ) 
5800: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
5810: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
5820: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
5830: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
5840: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5850: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
5860: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
5870: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5880: 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  d, pNRec);.  if(
5890: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
58a0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
58b0: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
58c0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
58d0: 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Init);.  if( rc 
58e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
58f0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
5900: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  &pPager->jfd, pD
5910: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
5920: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5930: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
5940: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
5950: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
5960: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
5970: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
5980: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
5990: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
59a0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
59b0: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
59c0: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
59d0: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
59e0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
59f0: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
5a00: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
5a10: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
5a20: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
5a30: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
5a40: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
5a50: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
5a60: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
5a70: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
5a80: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
5a90: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29  er->jfd, (u32 *)
5aa0: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
5ab0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
5ac0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
5ad0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5ae0: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5af0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
5b00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
5b10: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
5b20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5b30: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
5b40: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
5b50: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
5b60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5b70: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
5b80: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5b90: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
5ba0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
5bb0: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
5bc0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
5bd0: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
5be0: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
5bf0: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
5c00: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
5c10: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
5c20: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
5c30: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
5c40: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
5c50: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
5c60: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
5c70: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
5c80: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
5c90: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
5ca0: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
5cb0: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
5cc0: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
5cd0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
5ce0: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
5cf0: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
5d00: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
5d10: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
5d20: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
5d30: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
5d40: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
5d50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
5d60: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
5d70: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
5d80: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
5d90: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
5da0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5db0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
5dc0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
5dd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
5de0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
5df0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
5e00: 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73  nt i; .  u32 cks
5e10: 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20  um = 0; ..  if( 
5e20: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
5e30: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
5e40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5e50: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
5e60: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
5e70: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
5e80: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
5e90: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
5ea0: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
5eb0: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
5ec0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
5ed0: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
5ee0: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
5ef0: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
5f00: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
5f10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5f20: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
5f30: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
5f40: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
5f50: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
5f60: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
5f70: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
5f80: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
5f90: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
5fa0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
5fb0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
5fc0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5fd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5fe0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5ff0: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
6000: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6010: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6020: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
6030: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
6040: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6050: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6060: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
6070: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
6080: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b  , zMaster, len);
6090: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
60a0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
60b0: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
60c0: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
60d0: 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  fd, len);.  if( 
60e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
60f0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6100: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
6110: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73  pPager->jfd, cks
6120: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
6130: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6140: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
6150: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
6160: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
6170: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6180: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
6190: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
61a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
61b0: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
61c0: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
61d0: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
61e0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
61f0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
6200: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
6210: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
6220: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
6230: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
6240: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
6250: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
6260: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
6270: 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
6280: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
6290: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
62a0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
62b0: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
62c0: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
62d0: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
62e0: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
62f0: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
6300: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
6310: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
6320: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
6330: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
6340: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
6350: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
6360: 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  f( pPg->inStmt )
6370: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
6380: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
6390: 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65  t==0 && pPg->pNe
63a0: 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70  xtStmt==0 );.  p
63b0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
63c0: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
63d0: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50  >pStmt ){.    pP
63e0: 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72  ager->pStmt->pPr
63f0: 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  evStmt = pPg;.  
6400: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  }.  pPg->pNextSt
6410: 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74  mt = pPager->pSt
6420: 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53  mt;.  pPager->pS
6430: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  tmt = pPg;.  pPg
6440: 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a  ->inStmt = 1;.}.
6450: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
6460: 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
6470: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
6480: 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  g){.  if( !pPg->
6490: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
64a0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
64b0: 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  vStmt ){.    ass
64c0: 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53  ert( pPg->pPrevS
64d0: 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  tmt->pNextStmt==
64e0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
64f0: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
6500: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
6510: 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tStmt;.  }else{.
6520: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
6530: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d  >pPager->pStmt==
6540: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
6550: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
6560: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
6570: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
6580: 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  NextStmt ){.    
6590: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
65a0: 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  xtStmt->pPrevStm
65b0: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
65c0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
65d0: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
65e0: 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20  PrevStmt;.  }.  
65f0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
6600: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   0;.  pPg->pPrev
6610: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
6620: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a  >inStmt = 0;.}..
6630: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
6640: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
6650: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
6660: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
6670: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
6680: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
6690: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
66a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
66b0: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
66c0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
66d0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
66e0: 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e  dr *p = pPager->
66f0: 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68  aHash[pager_hash
6700: 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65  (pgno)];.  while
6710: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
6720: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
6730: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
6740: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
6750: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
6760: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
6770: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
6780: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
6790: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
67a0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
67b0: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
67c0: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
67d0: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
67e0: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
67f0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
6800: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
6810: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
6820: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
6830: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
6840: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
6850: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
6860: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6870: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
6880: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
6890: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
68a0: 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  t;.  for(pPg=pPa
68b0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
68c0: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
68d0: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
68e0: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
68f0: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
6900: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
6910: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
6920: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
6930: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
6940: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
6950: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d  >pAll = 0;.  mem
6960: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
6970: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
6980: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
6990: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
69a0: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
69b0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
69c0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
69d0: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
69e0: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
69f0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  .  sqlite3OsUnlo
6a00: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
6a10: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  NO_LOCK);.  pPag
6a20: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
6a30: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  R_UNLOCK;.  pPag
6a40: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
6a50: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
6a60: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
6a70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
6a80: 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  en==0 );.}../*.*
6a90: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
6aa0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
6ab0: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
6ac0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
6ad0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45  en and.** a RESE
6ae0: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
6af0: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
6b00: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
6b10: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a  utine releases.*
6b20: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
6b30: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
6b40: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
6b50: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68  n its place.  Th
6b60: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
6b70: 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64  e is deleted and
6b80: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
6b90: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
6ba0: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
6bb0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
6bc0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
6bd0: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
6be0: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
6bf0: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
6c00: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
6c10: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
6c20: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
6c30: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
6c40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
6c50: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
6c60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6c70: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
6c80: 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
6c90: 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 69 66 28 20  >memDb );.  if( 
6ca0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
6cb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
6cc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6cd0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
6ce0: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
6cf0: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
6d00: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
6d10: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
6d20: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
6d30: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
6d40: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
6d50: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
6d60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
6d70: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
6d80: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
6d90: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67  ->jfd);.    pPag
6da0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
6db0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
6dc0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
6dd0: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
6de0: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
6df0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
6e00: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
6e10: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
6e20: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
6e30: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
6e40: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
6e50: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
6e60: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
6e70: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
6e80: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
6e90: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
6ea0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
6eb0: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
6ec0: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
6ed0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6ee0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
6ef0: 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
6f00: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
6f10: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73  al==0 );.  }.  s
6f20: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
6f30: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
6f40: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  ED_LOCK);.  pPag
6f50: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
6f60: 52 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67  R_SHARED;.  pPag
6f70: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
6f80: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
6f90: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72  tMaster = 0;.  r
6fa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
6fc0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
6fd0: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
6fe0: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  page of data..**
6ff0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
7000: 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
7010: 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a    It is really j
7020: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
7030: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
7040: 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20  itial value and 
7050: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  the page number.
7060: 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65    We experimente
7070: 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63  d with.** a chec
7080: 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69  ksum of the enti
7090: 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61  re data, but tha
70a0: 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62  t was found to b
70b0: 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a  e too slow..**.*
70c0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
70d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73  page number is s
70e0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67  tored at the beg
70f0: 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61  inning of data a
7100: 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73  nd.** the checks
7110: 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  um is stored at 
7120: 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69  the end.  This i
7130: 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66  s important.  If
7140: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72   journal.** corr
7150: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
7160: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
7170: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
7180: 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a  ikely scenario.*
7190: 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  * is that one en
71a0: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
71b0: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
71c0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49  l be changed.  I
71d0: 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73  t is.** much les
71e0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
71f0: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
7200: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
7210: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
7220: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
7230: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
7240: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
7250: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
7260: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
7270: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
7280: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
7290: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
72a0: 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58  ption..**.** FIX
72b0: 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61   ME:  Consider a
72c0: 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74  dding every 200t
72d0: 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f  h (or so) byte o
72e0: 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  f the data to th
72f0: 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20  e.** checksum.  
7300: 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69  That way if a si
7310: 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20  ngle page spans 
7320: 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73  3 or more disk s
7330: 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e  ectors and.** on
7340: 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65  ly the middle se
7350: 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c  ctor is corrupt,
7360: 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68   we will still h
7370: 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ave a reasonable
7380: 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61  .** chance of fa
7390: 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  iling the checks
73a0: 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65  um and thus dete
73b0: 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  cting the proble
73c0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  m..*/.static u32
73d0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
73e0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
73f0: 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61   pgno, const cha
7400: 72 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  r *aData){.  u32
7410: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
7420: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
7430: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
7440: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
7450: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
7460: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
7470: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
7480: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
7490: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
74a0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
74b0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
74c0: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
74d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
74e0: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
74f0: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
7500: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
7510: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
7520: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
7530: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
7540: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
7550: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
7560: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
7570: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
7580: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
7590: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
75a0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
75b0: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
75c0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
75d0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
75e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
75f0: 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74  OsFile *jfd, int
7600: 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e   useCksum){.  in
7610: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
7620: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
7630: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
7640: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
7650: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
7660: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7680: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
7690: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
76a0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
76b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
76c0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
76d0: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
76e0: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
76f0: 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 50  8 aData[SQLITE_P
7700: 41 47 45 5f 53 49 5a 45 5d 3b 20 20 20 2f 2a 20  AGE_SIZE];   /* 
7710: 53 74 6f 72 65 20 64 61 74 61 20 68 65 72 65 20  Store data here 
7720: 2a 2f 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  */..  rc = read3
7730: 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f  2bits(jfd, &pgno
7740: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7750: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7760: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
7770: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61  e3OsRead(jfd, &a
7780: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
7790: 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  geSize);.  if( r
77a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
77b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
77c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
77d0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
77e0: 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61  ze + 4;..  /* Sa
77f0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
7800: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
7810: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
7820: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
7830: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
7840: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
7850: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
7860: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
7870: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
7880: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
7890: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
78a0: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
78b0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
78c0: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
78d0: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
78e0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
78f0: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
7900: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
7910: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
7920: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
7930: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
7940: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
7950: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
7960: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
7970: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
7980: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
7990: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
79a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43  ;.  }.  if( useC
79b0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  ksum ){.    rc =
79c0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
79d0: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
79e0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
79f0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
7a00: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
7a10: 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73     if( pager_cks
7a20: 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  um(pPager, pgno,
7a30: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
7a40: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7a50: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
7a60: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
7a70: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
7a80: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
7a90: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
7aa0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
7ab0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
7ac0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
7ad0: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
7ae0: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
7af0: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
7b00: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
7b10: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
7b20: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
7b30: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
7b40: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
7b50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7b60: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
7b70: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
7b80: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
7b90: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
7ba0: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
7bb0: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
7bc0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
7bd0: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
7be0: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
7bf0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
7c00: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
7c10: 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 50  dirty..  */.  pP
7c20: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
7c30: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
7c40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7c50: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
7c60: 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 20  XCLUSIVE || pPg 
7c70: 29 3b 0a 20 20 54 52 41 43 45 32 28 22 50 4c 41  );.  TRACE2("PLA
7c80: 59 42 41 43 4b 20 70 61 67 65 20 25 64 5c 6e 22  YBACK page %d\n"
7c90: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
7ca0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
7cb0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
7cc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
7cd0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
7ce0: 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29  (pgno-1)*(off_t)
7cf0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
7d00: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
7d10: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
7d20: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 53  er->fd, aData, S
7d30: 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29  QLITE_PAGE_SIZE)
7d40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
7d50: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
7d60: 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
7d70: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
7d80: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
7d90: 65 70 74 20 66 6f 72 20 70 61 67 65 0a 20 20 20  ept for page.   
7da0: 20 2a 2a 20 31 20 77 68 69 63 68 20 69 73 20 68   ** 1 which is h
7db0: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
7dc0: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
7dd0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
7de0: 62 61 73 65 0a 20 20 20 20 2a 2a 20 61 63 74 69  base.    ** acti
7df0: 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ve..    */.    v
7e00: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
7e10: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
7e20: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
7e30: 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 70 44 61 74  o==1 );.    pDat
7e40: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
7e50: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
7e60: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
7e70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7e80: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
7e90: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
7ea0: 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a  ){  /*** FIX ME:
7eb0: 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65    Should this be
7ec0: 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20   xReinit? ***/. 
7ed0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
7ee0: 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
7ef0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7f00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7f10: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
7f20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
7f30: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  ){.      pPg->di
7f40: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
7f50: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
7f60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 4f 44 45  ;.    }.    CODE
7f70: 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
7f80: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
7f90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7fa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
7fb0: 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
7fc0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
7fd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
7fe0: 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
7ff0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
8000: 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
8010: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8020: 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
8030: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
8040: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
8050: 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
8060: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
8070: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8080: 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
8090: 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
80a0: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  is..**.** The ma
80b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
80c0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
80d0: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c  ames of all chil
80e0: 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  d journals..** T
80f0: 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74  o tell if a mast
8100: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
8110: 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b  e deleted, check
8120: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
8130: 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ** children.  If
8140: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72   all children ar
8150: 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67  e either missing
8160: 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72   or do not refer
8170: 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65   to.** a differe
8180: 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nt master journa
8190: 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73  l, then this mas
81a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
81b0: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  be deleted..*/.s
81c0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
81d0: 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20  delmaster(const 
81e0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
81f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
8200: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
8210: 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65 72  .  OsFile master
8220: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
8230: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
8240: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
8250: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8260: 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 6e 4d 61 73   */.  off_t nMas
8270: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
8280: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
8290: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
82a0: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
82b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
82c0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
82d0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
82e0: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
82f0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
8300: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
8310: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
8320: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
8330: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ence..  */.  mem
8340: 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30 2c 20  set(&master, 0, 
8350: 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29 29 3b  sizeof(master));
8360: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8370: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d  sOpenReadOnly(zM
8380: 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b  aster, &master);
8390: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
83a0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
83b0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
83c0: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  ter_open = 1;.  
83d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
83e0: 6c 65 53 69 7a 65 28 26 6d 61 73 74 65 72 2c 20  leSize(&master, 
83f0: 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
8400: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8410: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
8420: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
8430: 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
8440: 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
8450: 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
8460: 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
8470: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  = 0;..    /* Loa
8480: 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
8490: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
84a0: 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
84b0: 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
84c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
84d0: 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
84e0: 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
84f0: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d  . .    */.    zM
8500: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28  asterJournal = (
8510: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
8520: 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
8530: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  al);.    if( !zM
8540: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
8550: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8560: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
8570: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
8580: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
8590: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
85a0: 26 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  &master, zMaster
85b0: 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72  Journal, nMaster
85c0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
85d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
85e0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
85f0: 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
8600: 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
8610: 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
8620: 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
8630: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
8640: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
8650: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
8660: 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72  FileExists(zJour
8670: 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nal) ){.        
8680: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
8690: 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
86a0: 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
86b0: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
86c0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
86d0: 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
86e0: 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
86f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
8700: 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   If.        ** s
8710: 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
8720: 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
8730: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8740: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
8750: 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20 6a 6f         OsFile jo
8760: 75 72 6e 61 6c 3b 0a 0a 20 20 20 20 20 20 20 20  urnal;..        
8770: 6d 65 6d 73 65 74 28 26 6a 6f 75 72 6e 61 6c 2c  memset(&journal,
8780: 20 30 2c 20 73 69 7a 65 6f 66 28 6a 6f 75 72 6e   0, sizeof(journ
8790: 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  al));.        rc
87a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
87b0: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
87c0: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
87d0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
87e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
87f0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
8800: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
8810: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
8820: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
8830: 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d  al(&journal, &zM
8840: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
8850: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8860: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
8870: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
8880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8890: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
88a0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
88b0: 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  }..        if( z
88c0: 4d 61 73 74 65 72 50 74 72 20 26 26 20 21 73 74  MasterPtr && !st
88d0: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
88e0: 20 7a 4d 61 73 74 65 72 29 20 29 7b 0a 20 20 20   zMaster) ){.   
88f0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
8900: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
8910: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
8920: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8930: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
8940: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
8950: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
8960: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
8970: 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a  nal += (strlen(z
8980: 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
8990: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69   }.  }.  .  sqli
89a0: 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73  te3OsDelete(zMas
89b0: 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  ter);..delmaster
89c0: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73  _out:.  if( zMas
89d0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
89e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
89f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
8a00: 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72  }  .  if( master
8a10: 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  _open ){.    sql
8a20: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73  ite3OsClose(&mas
8a30: 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
8a40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8a50: 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67 65 20  Make every page 
8a60: 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 67 72  in the cache agr
8a70: 65 65 20 77 69 74 68 20 77 68 61 74 20 69 73 20  ee with what is 
8a80: 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68  on disk.  In oth
8a90: 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72  er words,.** rer
8aa0: 65 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f 20  ead the disk to 
8ab0: 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65 20  reset the state 
8ac0: 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  of the cache..**
8ad0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8ae0: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
8af0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77   a rollback in w
8b00: 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68 65  hich some of the
8b10: 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a 20   dirty cache.** 
8b20: 70 61 67 65 73 20 68 61 64 20 6e 65 76 65 72 20  pages had never 
8b30: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75 74  been written out
8b40: 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e 65   to disk.  We ne
8b50: 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
8b60: 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e  the.** cache con
8b70: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61 73  tent and the eas
8b80: 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20 74  iest way to do t
8b90: 68 61 74 20 69 73 20 74 6f 20 72 65 72 65 61 64  hat is to reread
8ba0: 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74   the old content
8bb0: 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  .** back from th
8bc0: 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e disk..*/.stati
8bd0: 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f  c int pager_relo
8be0: 61 64 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  ad_cache(Pager *
8bf0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
8c00: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
8c10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  = SQLITE_OK;.  f
8c20: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
8c30: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
8c40: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
8c50: 20 20 63 68 61 72 20 7a 42 75 66 5b 53 51 4c 49    char zBuf[SQLI
8c60: 54 45 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20  TE_PAGE_SIZE];. 
8c70: 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72     if( !pPg->dir
8c80: 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ty ) continue;. 
8c90: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
8ca0: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
8cb0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
8cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
8cd0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
8ce0: 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45  SQLITE_PAGE_SIZE
8cf0: 2a 28 6f 66 66 5f 74 29 28 70 50 67 2d 3e 70 67  *(off_t)(pPg->pg
8d00: 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 72 63  no-1));.      rc
8d10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
8d20: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  (&pPager->fd, zB
8d30: 75 66 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f  uf, SQLITE_PAGE_
8d40: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 54 52 41  SIZE);.      TRA
8d50: 43 45 32 28 22 52 45 46 45 54 43 48 20 70 61 67  CE2("REFETCH pag
8d60: 65 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  e %d\n", pPg->pg
8d70: 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  no);.      CODEC
8d80: 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70  (pPager, zBuf, p
8d90: 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20  Pg->pgno, 2);.  
8da0: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
8db0: 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
8dc0: 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66       memset(zBuf
8dd0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  , 0, SQLITE_PAGE
8de0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
8df0: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
8e00: 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75  =0 || memcmp(zBu
8e10: 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  f, PGHDR_TO_DATA
8e20: 28 70 50 67 29 2c 20 53 51 4c 49 54 45 5f 50 41  (pPg), SQLITE_PA
8e30: 47 45 5f 53 49 5a 45 29 20 29 7b 0a 20 20 20 20  GE_SIZE) ){.    
8e40: 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
8e50: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75  O_DATA(pPg), zBu
8e60: 66 2c 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53  f, SQLITE_PAGE_S
8e70: 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IZE);.      if( 
8e80: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
8e90: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
8ea0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50  ger->xReiniter(P
8eb0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
8ec0: 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
8ed0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
8ee0: 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
8ef0: 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
8f00: 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
8f10: 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  ->nExtra);.     
8f20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
8f30: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
8f40: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
8f50: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
8f60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
8f70: 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
8f80: 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
8f90: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
8fa0: 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
8fb0: 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
8fc0: 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
8fd0: 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
8fe0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
8ff0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
9000: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
9010: 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
9020: 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
9030: 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
9040: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
9050: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
9060: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
9070: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
9080: 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
9090: 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
90a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
90b0: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
90c0: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
90d0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
90e0: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
90f0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
9100: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
9110: 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
9120: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
9130: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
9140: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
9150: 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
9160: 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
9170: 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
9180: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
9190: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
91a0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
91b0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
91c0: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
91d0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
91e0: 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
91f0: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
9200: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
9210: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
9220: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
9230: 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
9240: 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
9250: 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
9260: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
9270: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
9280: 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29  ournal.).**  (6)
9290: 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
92a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
92b0: 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
92c0: 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
92d0: 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
92e0: 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
92f0: 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
9300: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
9310: 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
9320: 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
9330: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
9340: 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
9350: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
9360: 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
9370: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
9380: 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
9390: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37  in UTF-8..**  (7
93a0: 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
93b0: 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
93c0: 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
93d0: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
93e0: 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
93f0: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
9400: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9410: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
9420: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
9430: 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
9440: 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
9450: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9460: 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
9470: 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d  the first 6 item
9480: 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
9490: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
94a0: 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
94b0: 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20  ance of the 7th 
94c0: 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
94d0: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
94e0: 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
94f0: 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
9500: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
9510: 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
9520: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
9530: 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
9540: 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
9550: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
9560: 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
9570: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
9580: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
9590: 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
95a0: 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
95b0: 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
95c0: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
95d0: 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
95e0: 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
95f0: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
9600: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9610: 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
9620: 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
9630: 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
9640: 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
9650: 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
9660: 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
9670: 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
9680: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
9690: 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
96a0: 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
96b0: 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
96c0: 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
96d0: 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
96e0: 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
96f0: 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
9700: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
9710: 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
9720: 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
9730: 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
9740: 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
9750: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
9760: 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
9770: 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
9780: 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
9790: 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
97a0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
97b0: 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
97c0: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
97d0: 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
97e0: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
97f0: 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
9800: 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
9810: 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
9820: 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
9830: 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
9840: 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
9850: 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
9860: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
9870: 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
9880: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
9890: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
98a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
98b0: 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
98c0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
98d0: 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
98e0: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
98f0: 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
9900: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9910: 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
9920: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
9930: 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
9940: 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
9950: 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
9960: 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
9970: 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
9980: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
9990: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
99a0: 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
99b0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
99c0: 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
99d0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
99e0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
99f0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
9a00: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
9a10: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
9a20: 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20  Pager){.  off_t 
9a30: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
9a40: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
9a50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
9a60: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
9a70: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
9a80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9a90: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
9aa0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  e journal */.  i
9ab0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
9ad0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
9ae0: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
9af0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9b00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
9b10: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
9b20: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
9b40: 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
9b50: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68  broutine */.  ch
9b60: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
9b70: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
9b80: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
9b90: 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
9ba0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
9bb0: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
9bc0: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
9bd0: 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
9be0: 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
9bf0: 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
9c00: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9c10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9c20: 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
9c30: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
9c40: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  &pPager->jfd, &s
9c50: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
9c60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9c70: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
9c80: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
9c90: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
9ca0: 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
9cb0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
9cc0: 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
9cd0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
9ce0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
9cf0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
9d00: 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
9d10: 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
9d20: 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
9d30: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
9d40: 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
9d50: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
9d60: 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
9d70: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d   */.  rc = readM
9d80: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26 70 50  asterJournal(&pP
9d90: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73  ager->jfd, &zMas
9da0: 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ter);.  assert( 
9db0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
9dc0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9dd0: 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74  ITE_OK || (zMast
9de0: 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73  er && !sqlite3Os
9df0: 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74  FileExists(zMast
9e00: 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  er)) ){.    sqli
9e10: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
9e20: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
9e30: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9e40: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
9e50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9e60: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
9e70: 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  k;.  }.  sqlite3
9e80: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
9e90: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
9ea0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
9eb0: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
9ec0: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
9ed0: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
9ee0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
9ef0: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
9f00: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
9f10: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
9f20: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
9f30: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
9f40: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
9f50: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
9f60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
9f70: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
9f80: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
9f90: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
9fa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9fb0: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
9fc0: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
9fd0: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
9fe0: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
9ff0: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
a000: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
a010: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
a020: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
a030: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
a040: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
a050: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
a060: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
a070: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
a080: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
a090: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a0a0: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
a0b0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
a0c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
a0d0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
a0e0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
a0f0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
a100: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
a110: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
a120: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
a130: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
a140: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
a150: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
a160: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
a170: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
a180: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
a190: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
a1a0: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
a1b0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
a1c0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
a1d0: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
a1e0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
a1f0: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
a200: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
a210: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
a220: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
a230: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a240: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a250: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
a260: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
a270: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
a280: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
a290: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
a2a0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
a2b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
a2c0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
a2d0: 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
a2e0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
a2f0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
a300: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
a310: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20  le back to it's 
a320: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
a330: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
a340: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a350: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
a360: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a370: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a380: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
a390: 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  || pPager->origD
a3a0: 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20  bSize==mxPg );. 
a3b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a3c0: 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  3OsTruncate(&pPa
a3d0: 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
a3e0: 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66 66 5f 74  PAGE_SIZE*(off_t
a3f0: 29 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66  )mxPg);.      if
a400: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a410: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
a420: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
a430: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
a440: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
a450: 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
a460: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
a470: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
a480: 2c 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  , JOURNAL_HDR_SZ
a490: 28 70 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20  (pPager)); */.  
a4a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a4b0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70  _OK ) goto end_p
a4c0: 6c 61 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20  layback;.  .    
a4d0: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
a4e0: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
a4f0: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
a500: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
a510: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
a520: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
a530: 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
a540: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
a550: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
a560: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
a570: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  >jfd, 1);.      
a580: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a590: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
a5a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
a5b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
a5c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a5d0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
a5e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
a5f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
a600: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
a610: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
a620: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
a630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a640: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
a650: 20 50 61 67 65 73 20 74 68 61 74 20 68 61 76 65   Pages that have
a660: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
a670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74   the journal but
a680: 20 6e 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20   never synced.  
a690: 2a 2a 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73  ** where not res
a6a0: 74 6f 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f  tored by the loo
a6b0: 70 20 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76  p above.  We hav
a6c0: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f  e to restore tho
a6d0: 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79  se.  ** pages by
a6e0: 20 72 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61   reading them ba
a6f0: 63 6b 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ck from the orig
a700: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20  inal database.. 
a710: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
a720: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a730: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
a740: 63 68 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e  che(pPager);..en
a750: 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
a760: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a770: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
a780: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
a790: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
a7a0: 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   zMaster ){.    
a7b0: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
a7c0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
a7d0: 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
a7e0: 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72  e will return tr
a7f0: 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ue,.    ** see i
a800: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
a810: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
a820: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
a830: 66 20 65 72 72 6f 72 73 20 0a 20 20 20 20 2a 2a  f errors .    **
a840: 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68   occur during th
a850: 69 73 20 70 72 6f 63 65 73 73 2c 20 69 67 6e 6f  is process, igno
a860: 72 65 20 74 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a  re them..    */.
a870: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
a890: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a  ager_delmaster(z
a8a0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Master);.    }. 
a8b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
a8c0: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  aster);.  }..  /
a8d0: 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
a8e0: 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
a8f0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
a900: 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
a910: 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
a920: 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
a930: 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
a940: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 50 41  h a different PA
a950: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  GER_SECTOR_SIZE.
a960: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
a970: 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
a980: 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
a990: 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
a9a0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  .  pPager->secto
a9b0: 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45  rSize = PAGER_SE
a9c0: 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74  CTOR_SIZE;.  ret
a9d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a9e0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74   Playback the st
a9f0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
aa00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
aa10: 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e  imilar to playin
aa20: 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  g back the trans
aa30: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
aa40: 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77  ut with.** a few
aa50: 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a   extra twists..*
aa60: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
aa70: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
aa80: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
aa90: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61   file at the sta
aaa0: 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  rt of.**        
aab0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
aac0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  s stored in pPag
aad0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f  er->stmtSize, no
aae0: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
aaf0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
ab00: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20   itself..**.**  
ab10: 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69    (2)  In additi
ab20: 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  on to playing ba
ab30: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
ab40: 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a   journal, also.*
ab50: 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61  *         playba
ab60: 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20  ck all pages of 
ab70: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
ab80: 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e  journal beginnin
ab90: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20  g.**         at 
aba0: 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73  offset pPager->s
abb0: 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61  tmtJSize..*/.sta
abc0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74  tic int pager_st
abd0: 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  mt_playback(Page
abe0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f 66  r *pPager){.  of
abf0: 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  f_t szJ;        
ac00: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ac10: 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e  f the full journ
ac20: 61 6c 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 68 64  al */.  off_t hd
ac30: 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rOff;.  int nRec
ac40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
ac60: 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69  cords */.  int i
ac70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac80: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ac90: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
aca0: 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  ..  szJ = pPager
acb0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69  ->journalOff;.#i
acc0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20  fndef NDEBUG .  
acd0: 7b 0a 20 20 20 20 6f 66 66 5f 74 20 6f 73 5f 73  {.    off_t os_s
ace0: 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  zJ;.    rc = sql
acf0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
ad00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73  pPager->jfd, &os
ad10: 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72  _szJ);.    if( r
ad20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ad30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73  eturn rc;.    as
ad40: 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a  sert( szJ==os_sz
ad50: 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  J );.  }.#endif.
ad60: 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
ad70: 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
ad80: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6a  t to the first j
ad90: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
ada0: 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20  itten.  ** this 
adb0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
adc0: 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e  ction, or the en
add0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
ade0: 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
adf0: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
ae00: 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
ae10: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
ae20: 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
ae30: 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
ae40: 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
ae50: 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
ae60: 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
ae70: 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 0a 20 20 2f  szJ;.  }.  ..  /
ae80: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
ae90: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
aea0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
aeb0: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
aec0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
aed0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  (&pPager->fd, SQ
aee0: 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28  LITE_PAGE_SIZE*(
aef0: 6f 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 73 74  off_t)pPager->st
af00: 6d 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  mtSize);.  pPage
af10: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
af20: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20  er->stmtSize;.. 
af30: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
af40: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
af50: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
af60: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
af70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
af80: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
af90: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
afa0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
afb0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
afc0: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
afd0: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
afe0: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
aff0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
b000: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
b010: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
b020: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
b030: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
b040: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
b050: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
b060: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
b070: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
b080: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
b090: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
b0a0: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
b0b0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
b0c0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
b0d0: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
b0e0: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
b0f0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
b100: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
b110: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
b120: 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20   &pPager->stfd, 
b130: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
b140: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
b150: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
b160: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
b170: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
b180: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  k;.  }..  /* Now
b190: 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73   roll some pages
b1a0: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74   back from the t
b1b0: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
b1c0: 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53  al. Pager.stmtJS
b1d0: 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65  ize.  ** was the
b1e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
b1f0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74  rnal file when t
b200: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61  his statement wa
b210: 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20  s started, so.  
b220: 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66  ** everything af
b230: 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74  ter that needs t
b240: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
b250: 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68  , either into th
b260: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
b270: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68   the memory cach
b280: 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  e, or both..  **
b290: 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  .  ** If it is n
b2a0: 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61  ot zero, then Pa
b2b0: 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69  ger.stmtHdrOff i
b2c0: 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  s the offset to 
b2d0: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
b2e0: 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  f the first jour
b2f0: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
b300: 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73  en during this s
b310: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
b320: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
b330: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
b340: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
b350: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
b360: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b370: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
b380: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
b390: 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
b3a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
b3b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
b3c0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73  e;.  pPager->cks
b3d0: 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d  umInit = pPager-
b3e0: 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73  >stmtCksum;.  as
b3f0: 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44  sert( JOURNAL_HD
b400: 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70 50  R_SZ(pPager)<(pP
b410: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
b420: 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  ) );.  while( pP
b430: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b440: 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50 61   <= (hdrOff-(pPa
b450: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
b460: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  ) ){.    rc = pa
b470: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
b480: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
b490: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
b4a0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
b4b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
b4c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b4d0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
b4e0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
b4f0: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
b500: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b510: 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
b520: 20 6e 52 65 63 3b 0a 20 20 20 20 75 33 32 20 64   nRec;.    u32 d
b530: 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
b540: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
b550: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
b560: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
b570: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b580: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b590: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
b5a0: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
b5b0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
b5c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
b5d0: 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nRec==0 ){.    
b5e0: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
b5f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b600: 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70  ff) / (pPager->p
b610: 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
b620: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52 65 63  }.    for(i=nRec
b630: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
b640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
b650: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
b660: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
b670: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
b680: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
b690: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
b6a0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
b6b0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
b6c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b6d0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
b6e0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
b6f0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
b700: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
b710: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
b720: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
b730: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b740: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
b750: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
b760: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
b770: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
b780: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
b790: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b7a0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a  ff = szJ;.    /*
b7b0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
b7c0: 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  che(pPager); */.
b7d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b7e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
b7f0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
b800: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
b810: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
b820: 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  allowed..**.** T
b830: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
b840: 72 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74  r is the absolut
b850: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d  e value of the m
b860: 78 50 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e  xPage parameter.
b870: 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73  .** If mxPage is
b880: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e   negative, the n
b890: 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c  oSync flag is al
b8a0: 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20  so set.  noSync 
b8b0: 62 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c  bypasses.** call
b8c0: 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 53 79  s to sqlite3OsSy
b8d0: 6e 63 28 29 2e 20 20 54 68 65 20 70 61 67 65 72  nc().  The pager
b8e0: 20 72 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65   runs much faste
b8f0: 72 20 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e  r with noSync on
b900: 2c 0a 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20  ,.** but if the 
b910: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
b920: 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
b930: 65 20 69 73 20 61 6e 20 61 62 72 75 70 74 20 70  e is an abrupt p
b940: 6f 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65  ower .** failure
b950: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
b960: 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ile might be lef
b970: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
b980: 74 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65  tent and.** unre
b990: 70 61 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20  pairable state. 
b9a0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
b9b0: 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65  3pager_set_cache
b9c0: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
b9d0: 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
b9e0: 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 3d 30  .  if( mxPage>=0
b9f0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ba00: 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
ba10: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 69  >tempFile;.    i
ba20: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
ba30: 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
ba40: 53 79 6e 63 20 3d 20 30 3b 20 0a 20 20 7d 65 6c  Sync = 0; .  }el
ba50: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
ba60: 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  noSync = 1;.    
ba70: 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50 61 67 65  mxPage = -mxPage
ba80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78 50 61  ;.  }.  if( mxPa
ba90: 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>10 ){.    pPa
baa0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78  ger->mxPage = mx
bab0: 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
bac0: 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
bad0: 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e = 10;.  }.}../
bae0: 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
baf0: 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
bb00: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
bb10: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
bb20: 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
bb30: 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
bb40: 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
bb50: 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
bb60: 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
bb70: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
bb80: 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
bb90: 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
bba0: 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
bbb0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
bbc0: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
bbd0: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
bbe0: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
bbf0: 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
bc00: 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
bc10: 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
bc20: 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
bc30: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
bc40: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
bc50: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
bc60: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
bc70: 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
bc80: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
bc90: 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
bca0: 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
bcb0: 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
bcc0: 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
bcd0: 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
bce0: 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
bd00: 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
bd10: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
bd20: 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
bd30: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
bd40: 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
bd50: 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
bd60: 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
bd70: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
bd80: 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
bd90: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
bda0: 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
bdb0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
bdc0: 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
bdd0: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
bde0: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
bdf0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
be00: 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
be10: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
be20: 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
be30: 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
be40: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
be50: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
be60: 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
be70: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
be80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
be90: 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
bea0: 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
beb0: 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
bec0: 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
bed0: 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
bee0: 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
bef0: 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
bf00: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
bf10: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
bf20: 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
bf30: 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
bf40: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
bf50: 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
bf60: 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
bf70: 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
bf80: 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
bf90: 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
bfa0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
bfb0: 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
bfc0: 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
bfd0: 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
bfe0: 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  3..*/.void sqlit
bff0: 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65  e3pager_set_safe
c000: 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a  ty_level(Pager *
c010: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
c020: 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  l){.  pPager->no
c030: 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
c040: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
c050: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
c060: 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
c070: 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
c080: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
c090: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
c0a0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
c0b0: 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
c0c0: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
c0d0: 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
c0e0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
c0f0: 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a  le into zName.**
c100: 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20   (zName must be 
c110: 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f  at least SQLITE_
c120: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79  TEMPNAME_SIZE by
c130: 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74  tes long.)  Writ
c140: 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  e.** the file de
c150: 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66  scriptor into *f
c160: 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
c170: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
c180: 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  or some.** other
c190: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
c1a0: 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  e fail..**.** Th
c1b0: 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
c1c0: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
c1d0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
c1e0: 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  e when it is.** 
c1f0: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
c200: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  c int sqlite3pag
c210: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72  er_opentemp(char
c220: 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20   *zFile, OsFile 
c230: 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  *fd){.  int cnt 
c240: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
c250: 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a   do{.    cnt--;.
c260: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d      sqlite3OsTem
c270: 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29  pFileName(zFile)
c280: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c290: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
c2a0: 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b  e(zFile, fd, 1);
c2b0: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
c2c0: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
c2d0: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
c2e0: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
c2f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
c300: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
c310: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
c320: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c330: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
c340: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
c350: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
c360: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
c370: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
c380: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
c390: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
c3a0: 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
c3b0: 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  _get() and is on
c3c0: 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
c3d0: 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
c3e0: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
c3f0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67  using sqlite3pag
c400: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  er_unref()..**.*
c410: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
c420: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
c430: 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
c440: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
c450: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
c460: 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
c470: 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
c480: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
c490: 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
c4a0: 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
c4b0: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
c4c0: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  t sqlite3pager_o
c4d0: 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70  pen(.  Pager **p
c4e0: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
c4f0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
c500: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
c510: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
c520: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
c530: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
c540: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
c550: 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d   open */.  int m
c560: 78 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  xPage,          
c570: 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65      /* Max numbe
c580: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 63  r of in-memory c
c590: 61 63 68 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  ache pages */.  
c5a0: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
c5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
c5c0: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
c5d0: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
c5e0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75   page */.  int u
c5f0: 73 65 4a 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20  seJournal,      
c600: 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f 20 75      /* TRUE to u
c610: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
c620: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
c630: 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20 20 2a 70  le */.  void  *p
c640: 42 75 73 79 48 61 6e 64 6c 65 72 20 20 20 20 20  BusyHandler     
c650: 20 2f 2a 20 42 75 73 79 20 63 61 6c 6c 62 61 63   /* Busy callbac
c660: 6b 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20  k */.){.  Pager 
c670: 2a 70 50 61 67 65 72 3b 0a 20 20 63 68 61 72 20  *pPager;.  char 
c680: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
c690: 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65   0;.  int nameLe
c6a0: 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a  n;.  OsFile fd;.
c6b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c6c0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
c6d0: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
c6e0: 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  0;.  int memDb =
c6f0: 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
c700: 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ly = 0;.  char z
c710: 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
c720: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a  NAME_SIZE];..  *
c730: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d  ppPager = 0;.  m
c740: 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69  emset(&fd, 0, si
c750: 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20 69 66 28  zeof(fd));.  if(
c760: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
c770: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  failed ){.    re
c780: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
c790: 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69  M;.  }.  if( zFi
c7a0: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
c7b0: 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66  ame[0] ){.    if
c7c0: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
c7d0: 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
c7e0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
c7f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c   = 1;.      zFul
c800: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
c810: 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20  teStrDup("");.  
c820: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c830: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
c840: 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61       zFullPathna
c850: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
c860: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
c870: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
c880: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29   zFullPathname )
c890: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c8a0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
c8b0: 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e  Write(zFullPathn
c8c0: 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f  ame, &fd, &readO
c8d0: 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nly);.      }.  
c8e0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
c8f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
c900: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
c910: 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69  p, &fd);.    zFi
c920: 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a  lename = zTemp;.
c930: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
c940: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
c950: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
c960: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
c970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c980: 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20       tempFile = 
c990: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
c9a0: 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
c9b0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
c9c0: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
c9d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c9e0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
c9f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ca00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
ca10: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73  lose(&fd);.    s
ca20: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
ca30: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
ca40: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e  turn rc;.  }.  n
ca50: 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
ca60: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
ca70: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
ca80: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
ca90: 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c  *pPager) + nameL
caa0: 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 69  en*3 + 30 );.  i
cab0: 66 28 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a  f( pPager==0 ){.
cac0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
cad0: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  se(&fd);.    sql
cae0: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
caf0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
cb00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
cb10: 0a 20 20 7d 0a 20 20 53 45 54 5f 50 41 47 45 52  .  }.  SET_PAGER
cb20: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
cb30: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
cb40: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
cb50: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
cb60: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
cb70: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
cb80: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
cb90: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
cba0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
cbb0: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
cbc0: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
cbd0: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
cbe0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
cbf0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
cc00: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
cc10: 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  name);.  for(i=n
cc20: 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70  ameLen; i>0 && p
cc30: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
cc40: 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d  y[i-1]!='/'; i--
cc50: 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20  ){}.  if( i>0 ) 
cc60: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
cc70: 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73  ry[i-1] = 0;.  s
cc80: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  trcpy(pPager->zJ
cc90: 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74  ournal, zFullPat
cca0: 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  hname);.  sqlite
ccb0: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
ccc0: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70  me);.  strcpy(&p
ccd0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
cce0: 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72  nameLen], "-jour
ccf0: 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d  nal");.  pPager-
cd00: 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 50 61 67  >fd = fd;.  pPag
cd10: 65 72 2d 3e 66 64 2e 70 50 61 67 65 72 20 3d 20  er->fd.pPager = 
cd20: 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72  pPager;.  pPager
cd30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
cd40: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  0;.  pPager->use
cd50: 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75  Journal = useJou
cd60: 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a  rnal && !memDb;.
cd70: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
cd80: 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  en = 0;.  pPager
cd90: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
cda0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
cdb0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
cdc0: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
cdd0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
cde0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 50 41 47  ize = SQLITE_PAG
cdf0: 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72  E_SIZE;.  pPager
ce00: 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a  ->stmtSize = 0;.
ce10: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
ce20: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
ce30: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
ce40: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
ce50: 20 6d 78 50 61 67 65 3e 35 20 3f 20 6d 78 50 61   mxPage>5 ? mxPa
ce60: 67 65 20 3a 20 31 30 3b 0a 20 20 70 50 61 67 65  ge : 10;.  pPage
ce70: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
ce80: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
ce90: 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a  r->errMask = 0;.
cea0: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
ceb0: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
cec0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
ced0: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
cee0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
cef0: 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d  dOnly;.  pPager-
cf00: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
cf10: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
cf20: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
cf30: 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
cf40: 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  l;.  pPager->ful
cf50: 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  lSync = (pPager-
cf60: 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20  >noSync?0:1);.  
cf70: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
cf80: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
cf90: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a  irstSynced = 0;.
cfa0: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
cfb0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
cfc0: 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a  Extra = nExtra;.
cfd0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
cfe0: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
cff0: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67  TOR_SIZE;.  pPag
d000: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
d010: 20 3d 20 28 42 75 73 79 48 61 6e 64 6c 65 72 20   = (BusyHandler 
d020: 2a 29 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  *)pBusyHandler;.
d030: 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
d040: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
d050: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
d060: 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  );.  *ppPager = 
d070: 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
d080: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d090: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
d0a0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
d0b0: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
d0c0: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
d0d0: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
d0e0: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
d0f0: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
d100: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
d110: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
d120: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
d130: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
d140: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
d150: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
d160: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
d170: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
d180: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
d190: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
d1a0: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70   result sqlite3p
d1b0: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
d1c0: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
d1d0: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
d1e0: 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  y sqlite3pager_u
d1f0: 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nref()..*/.void 
d200: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
d210: 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  _destructor(Page
d220: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
d230: 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69  (*xDesc)(void*,i
d240: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
d250: 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44  xDestructor = xD
d260: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  esc;.}../*.** Se
d270: 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
d280: 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
d290: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
d2a0: 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
d2b0: 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
d2c0: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
d2d0: 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
d2e0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
d2f0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
d300: 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72  .** value as a r
d310: 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62  esult of a rollb
d320: 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61  ack.  The callba
d330: 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d  ck gives higher-
d340: 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e  level code.** an
d350: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
d360: 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
d370: 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72  A section to agr
d380: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
d390: 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74  ored.** page dat
d3a0: 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
d3b0: 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e  e3pager_set_rein
d3c0: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
d3d0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
d3e0: 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  it)(void*,int)){
d3f0: 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
d400: 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
d410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d420: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
d430: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
d440: 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
d450: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
d460: 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
d470: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
d480: 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
d490: 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20  r){.  off_t n;. 
d4a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
d4b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
d4c0: 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b  er->dbSize>=0 ){
d4d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
d4e0: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
d4f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
d500: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
d510: 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45  >fd, &n)!=SQLITE
d520: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
d530: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
d540: 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20  GER_ERR_DISK;.  
d550: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d560: 20 20 6e 20 2f 3d 20 53 51 4c 49 54 45 5f 50 41    n /= SQLITE_PA
d570: 47 45 5f 53 49 5a 45 3b 0a 20 20 69 66 28 20 21  GE_SIZE;.  if( !
d580: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
d590: 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45   n==PENDING_BYTE
d5a0: 2f 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a  /SQLITE_PAGE_SIZ
d5b0: 45 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  E ){.    n++;.  
d5c0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
d5d0: 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
d5e0: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OCK ){.    pPage
d5f0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
d600: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
d610: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
d620: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
d630: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
d640: 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
d650: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
d660: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
d670: 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
d680: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
d690: 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
d6a0: 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
d6b0: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
d6c0: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
d6d0: 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
d6e0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
d6f0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
d700: 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
d710: 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
d720: 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
d730: 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
d740: 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
d750: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
d760: 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
d770: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
d780: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
d790: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
d7a0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
d7b0: 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
d7c0: 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
d7d0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
d7e0: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
d7f0: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
d800: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
d810: 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
d820: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
d830: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
d840: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
d850: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
d860: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
d870: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
d880: 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
d890: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
d8a0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
d8b0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
d8c0: 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
d8d0: 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
d8e0: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
d8f0: 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
d900: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d910: 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
d920: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
d930: 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
d940: 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
d950: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
d960: 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
d970: 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
d980: 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
d990: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
d9a0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
d9b0: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
d9c0: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
d9d0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
d9e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
d9f0: 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
da00: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
da10: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
da20: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
da30: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
da40: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50   = pager_hash(pP
da50: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
da60: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
da70: 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20  ash[h]==pPg );. 
da80: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
da90: 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
daa0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Hash;.  }.  pPg-
dab0: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
dac0: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
dad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
dae0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
daf0: 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e  o truncate an in
db00: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
db10: 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c  .  Delete.** all
db20: 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e   pages whose pgn
db30: 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  o is larger than
db40: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
db50: 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
db60: 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ced..** Referenc
db70: 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
db80: 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
db90: 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
dba0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
dbb0: 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61  emoryTruncate(Pa
dbc0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
dbd0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
dbe0: 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
dbf0: 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
dc00: 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
dc10: 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
dc20: 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
dc30: 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
dc40: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
dc50: 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
dc60: 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
dc70: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
dc80: 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
dc90: 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
dca0: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
dcb0: 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
dcc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
dcd0: 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
dce0: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
dcf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
dd00: 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
dd10: 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  ll;.      unlink
dd20: 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
dd30: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
dd40: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
dd50: 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
dd60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e   }.}../*.** Trun
dd70: 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
dd80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
dd90: 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
dda0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
ddb0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
ddc0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
ddd0: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
dde0: 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
ddf0: 3e 64 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20  >dbSize<0 ){.   
de00: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
de10: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
de20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
de30: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
de40: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
de50: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
de60: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
de70: 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
de80: 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
de90: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
dea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
deb0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  K;.  }.  if( pPa
dec0: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
ded0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
dee0: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
def0: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
df00: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
df10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
df20: 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
df30: 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
df40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
df50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
df60: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
df70: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26  ite3OsTruncate(&
df80: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
df90: 54 45 5f 50 41 47 45 5f 53 49 5a 45 2a 28 6f 66  TE_PAGE_SIZE*(of
dfa0: 66 5f 74 29 6e 50 61 67 65 29 3b 0a 20 20 69 66  f_t)nPage);.  if
dfb0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dfc0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
dfd0: 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
dfe0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
dff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
e000: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
e010: 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
e020: 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
e030: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
e040: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
e050: 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
e060: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
e070: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
e080: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
e090: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
e0a0: 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
e0b0: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
e0c0: 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
e0d0: 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
e0e0: 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
e0f0: 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
e100: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
e110: 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
e120: 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
e130: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
e140: 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
e150: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
e160: 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  mp..*/.int sqlit
e170: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61  e3pager_close(Pa
e180: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e190: 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
e1a0: 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50  xt;.  switch( pP
e1b0: 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20  ager->state ){. 
e1c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
e1d0: 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SERVED:.    case
e1e0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a   PAGER_SYNCED: .
e1f0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45      case PAGER_E
e200: 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20  XCLUSIVE: {.    
e210: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
e220: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
e230: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
e240: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
e250: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
e260: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
e270: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
e280: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
e290: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
e2a0: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
e2b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e2c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 48     case PAGER_SH
e2d0: 41 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66  ARED: {.      if
e2e0: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
e2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e300: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
e310: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
e320: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e330: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e340: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
e350: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
e360: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
e370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
e380: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
e390: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
e3a0: 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  t){.#ifndef NDEB
e3b0: 55 47 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UG.    if( pPage
e3c0: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
e3d0: 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
e3e0: 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
e3f0: 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
e400: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
e410: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
e420: 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
e430: 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
e440: 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
e450: 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
e460: 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
e470: 66 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  f.    pNext = pP
e480: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
e490: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
e4a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
e4b0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
e4c0: 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  fd);.  assert( p
e4d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
e4e0: 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65  en==0 );.  /* Te
e4f0: 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
e500: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
e510: 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
e520: 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
e530: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
e540: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
e550: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
e560: 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
e570: 0a 20 20 43 4c 52 5f 50 41 47 45 52 28 70 50 61  .  CLR_PAGER(pPa
e580: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
e590: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28  er->zFilename!=(
e5a0: 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d  char*)&pPager[1]
e5b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e5c0: 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
e5d0: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71  happen */.    sq
e5e0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
e5f0: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
e600: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
e610: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
e620: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
e630: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
e640: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
e650: 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
e660: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e680: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
e690: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
e6a0: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
e6b0: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  o sqlite3pager_p
e6c0: 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a  agenumber(void *
e6d0: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
e6e0: 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  *p = DATA_TO_PGH
e6f0: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
e700: 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  urn p->pgno;.}..
e710: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
e720: 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
e730: 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
e740: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
e750: 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
e760: 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
e770: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
e780: 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
e790: 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
e7a0: 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
e7b0: 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
e7c0: 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
e7d0: 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
e7e0: 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
e7f0: 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
e800: 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
e810: 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
e820: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
e830: 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
e840: 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
e850: 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
e860: 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
e870: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
e880: 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
e890: 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
e8a0: 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
e8b0: 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
e8c0: 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
e8d0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
e8e0: 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
e8f0: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
e900: 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
e910: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
e920: 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ==pPg->pPager->p
e930: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
e940: 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
e950: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
e960: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26        while( p &
e970: 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
e980: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
e990: 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e  e; }.      pPg->
e9a0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
e9b0: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nced = p;.    }.
e9c0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
e9d0: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
e9e0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
e9f0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
ea00: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
ea10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
ea20: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
ea30: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
ea40: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
ea50: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
ea60: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
ea70: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
ea80: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
ea90: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
eaa0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
eab0: 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
eac0: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
ead0: 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
eae0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
eaf0: 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52  pPg->nRef++;.  R
eb00: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23  EFINFO(pPg);.}.#
eb10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
eb20: 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  T.  static void 
eb30: 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
eb40: 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50  pPg){.    if( pP
eb50: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
eb60: 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50      _page_ref(pP
eb70: 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
eb80: 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b       pPg->nRef++
eb90: 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28  ;.      REFINFO(
eba0: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
ebb0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
ebc0: 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
ebd0: 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
ebe0: 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
ebf0: 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69  )->nRef++).#endi
ec00: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
ec10: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
ec20: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
ec30: 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
ec40: 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
ec50: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
ec60: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
ec70: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
ec80: 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
ec90: 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
eca0: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
ecb0: 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  ta);.  page_ref(
ecc0: 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
ecd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ece0: 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
ecf0: 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  nal.  In other w
ed00: 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
ed10: 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
ed20: 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
ed30: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
ed40: 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
ed50: 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
ed60: 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
ed70: 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20  ** disk.  It is 
ed80: 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69  not safe to modi
ed90: 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  fy the original 
eda0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
edb0: 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  til after.** the
edc0: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
edd0: 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68  n synced.  If th
ede0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
edf0: 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ase is modified 
ee00: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f  before.** the jo
ee10: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
ee20: 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c  and a power fail
ee30: 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ure occurs, the 
ee40: 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c  unsynced journal
ee50: 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62  .** data would b
ee60: 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f  e lost and we wo
ee70: 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  uld be unable to
ee80: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c   completely roll
ee90: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  back the.** data
eea0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44  base changes.  D
eeb0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
eec0: 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a  on would occur..
eed0: 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
eee0: 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73  ine also updates
eef0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
ef00: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
ef10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
ef20: 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f   (See comments o
ef30: 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  n the pager_play
ef40: 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  back() routine f
ef50: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
ef60: 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49  formation.).** I
ef70: 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20  f the sync mode 
ef80: 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e  is FULL, two syn
ef90: 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20  cs will occur.  
efa0: 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20  First the whole 
efb0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79  journal.** is sy
efc0: 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e  nced, then the n
efd0: 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
efe0: 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63  ated, then a sec
eff0: 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e  ond sync occurs.
f000: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
f010: 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20  rary databases, 
f020: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69  we do not care i
f030: 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
f040: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74   rollback.** aft
f050: 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
f060: 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75  re, so sync occu
f070: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rs..**.** This r
f080: 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
f090: 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64  e needSync field
f0a0: 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63   of every page c
f0b0: 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a  urrent held in.*
f0c0: 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  * memory..*/.sta
f0d0: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
f0e0: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
f0f0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
f100: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
f110: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79  ITE_OK;..  /* Sy
f120: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
f130: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
f140: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
f150: 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
f160: 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
f170: 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
f180: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
f190: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
f1a0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
f1b0: 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
f1c0: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
f1d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f1e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
f1f0: 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
f200: 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
f210: 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d  c ); // noSync m
f220: 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73  ight be set if s
f230: 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20  ynchronous.     
f240: 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f   ** was turned o
f250: 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ff after the tra
f260: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
f270: 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36  rted.  Ticket #6
f280: 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  15 */.#ifndef ND
f290: 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20  EBUG.      {.   
f2a0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
f2b0: 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52  e the pPager->nR
f2c0: 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72  ec counter we ar
f2d0: 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73  e keeping agrees
f2e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
f2f0: 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74   the nRec comput
f300: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ed from the size
f310: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f320: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
f330: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 6a  .        off_t j
f340: 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Sz;.        rc =
f350: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
f360: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
f370: 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
f380: 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
f390: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
f3a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
f3b0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29  ournalOff==jSz )
f3c0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
f3d0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
f3e0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
f3f0: 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
f400: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
f410: 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
f420: 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
f430: 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
f440: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
f450: 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
f460: 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
f470: 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
f480: 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
f490: 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
f4a0: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
f4b0: 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
f4c0: 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
f4d0: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a   for rollback. .
f4e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f4f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
f500: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
f510: 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
f520: 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
f530: 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
f540: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
f550: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
f560: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
f570: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
f580: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
f590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f5a0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
f5b0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
f5c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f5d0: 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
f5e0: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
f5f0: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
f600: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
f610: 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
f620: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
f630: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
f640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
f650: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
f660: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f670: 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lOff);.      }. 
f680: 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
f690: 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
f6a0: 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
f6b0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f6c0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
f6d0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
f6e0: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
f6f0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50  urn rc;.      pP
f700: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
f710: 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rted = 1;.    }.
f720: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
f730: 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Sync = 0;..    /
f740: 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64  * Erase the need
f750: 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65  Sync flag from e
f760: 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a  very page..    *
f770: 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  /.    for(pPg=pP
f780: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
f790: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
f7a0: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
f7b0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
f7c0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
f7d0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
f7e0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
f7f0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   }..#ifndef NDEB
f800: 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50  UG.  /* If the P
f810: 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
f820: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
f830: 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
f840: 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75  ync.  ** flag mu
f850: 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72  st also be clear
f860: 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20   for all pages. 
f870: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
f880: 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74  s.  ** invariant
f890: 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   is true..  */. 
f8a0: 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70   else{.    for(p
f8b0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
f8c0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
f8d0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
f8e0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
f8f0: 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
f900: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
f910: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
f920: 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  ed==pPager->pFir
f930: 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  st );.  }.#endif
f940: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
f950: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
f960: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63  list of pages (c
f970: 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20  onnected by the 
f980: 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
f990: 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65  nter) write.** e
f9a0: 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73  very one of thos
f9b0: 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74  e pages out to t
f9c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f9d0: 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61   and mark them a
f9e0: 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a  ll.** as clean..
f9f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
fa00: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
fa10: 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29  st(PgHdr *pList)
fa20: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
fa30: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  r;.  int rc;.  i
fa40: 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 0a 20 20  nt busy = 1;..  
fa50: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
fa60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fa70: 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73  .  pPager = pLis
fa80: 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  t->pPager;..  /*
fa90: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
faa0: 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68  here may be eith
fab0: 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  er a RESERVED or
fac0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
fad0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
fae0: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
faf0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
fb00: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
fb10: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
fb20: 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
fb30: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72  lite3OsLock() ar
fb40: 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20  e no-ops..  **. 
fb50: 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
fb60: 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
fb70: 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
fb80: 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
fb90: 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
fba0: 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
fbb0: 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
fbc0: 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
fbd0: 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
fbe0: 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
fbf0: 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
fc00: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
fc10: 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
fc20: 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
fc30: 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
fc40: 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
fc50: 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
fc60: 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
fc70: 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
fc80: 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
fc90: 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
fca0: 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
fcb0: 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
fcc0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
fcd0: 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
fce0: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
fcf0: 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
fd00: 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
fd10: 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
fd20: 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
fd30: 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
fd40: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
fd50: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
fd60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
fd70: 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
fd80: 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
fd90: 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
fda0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
fdb0: 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
fdc0: 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
fdd0: 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
fde0: 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
fdf0: 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
fe00: 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 73   do {.    rc = s
fe10: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
fe20: 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
fe30: 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68  IVE_LOCK);.  }wh
fe40: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
fe50: 42 55 53 59 20 26 26 20 0a 20 20 20 20 20 20 70  BUSY && .      p
fe60: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
fe70: 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 70 50  ler && .      pP
fe80: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
fe90: 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20  er->xFunc && .  
fea0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
feb0: 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28  yHandler->xFunc(
fec0: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
fed0: 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79  dler->pArg, busy
fee0: 2b 2b 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ++).  );.  if( r
fef0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ff00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ff10: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61   }.  pPager->sta
ff20: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
ff30: 53 49 56 45 3b 0a 0a 20 20 77 68 69 6c 65 28 20  SIVE;..  while( 
ff40: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
ff50: 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
ff60: 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
ff70: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
ff80: 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
ff90: 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c 49 54  -1)*(off_t)SQLIT
ffa0: 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  E_PAGE_SIZE);.  
ffb0: 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
ffc0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
ffd0: 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
ffe0: 6f 2c 20 36 29 3b 0a 20 20 20 20 54 52 41 43 45  o, 6);.    TRACE
fff0: 32 28 22 53 54 4f 52 45 20 70 61 67 65 20 25 64  2("STORE page %d
10000 5c 6e 22 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  \n", pList->pgno
10010 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
10020 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
10030 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
10040 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 53 51  _DATA(pList), SQ
10050 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
10060 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65  .    CODEC(pPage
10070 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
10080 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
10090 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66  pgno, 0);.    if
100a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
100b0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72  ;.    pList->dir
100c0 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73  ty = 0;.    pLis
100d0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
100e0 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
100f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10100 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
10110 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
10120 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
10130 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
10140 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
10150 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
10160 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
10170 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
10180 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
10190 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
101a0 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
101b0 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
101c0 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
101d0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
101e0 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69  p, *pList;.  pLi
101f0 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  st = 0;.  for(p=
10200 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
10210 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
10220 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74  .    if( p->dirt
10230 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44  y ){.      p->pD
10240 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20  irty = pList;.  
10250 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
10260 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10270 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
10280 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
10290 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
102a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
102b0 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
102c0 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
102d0 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
102e0 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
102f0 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
10300 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
10310 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
10320 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72  **.** A _get wor
10330 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ks for any page 
10340 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
10350 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64  han 0.  If the d
10360 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
10370 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
10380 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
10390 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75  ge, then no actu
103a0 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  al disk.** read 
103b0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d  occurs and the m
103c0 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
103d0 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  he page is initi
103e0 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c  alized to.** all
103f0 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74   zeros.  The ext
10400 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
10410 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
10420 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
10430 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  .** to zeros the
10440 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
10450 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
10460 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  o memory..**.** 
10470 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
10480 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
10490 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
104a0 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
104b0 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
104c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
104d0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
104e0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
104f0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
10500 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  so sqlite3pager_
10510 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  lookup().  Both 
10520 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
10530 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d   _lookup() attem
10540 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
10550 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
10560 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
10570 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
10580 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
10590 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
105a0 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
105b0 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
105c0 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f  t in whereas _lo
105d0 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
105e0 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
105f0 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
10600 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
10610 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
10620 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
10630 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
10640 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
10650 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
10660 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
10670 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76  ce _lookup() nev
10680 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
10690 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
106a0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
106b0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
106c0 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
106d0 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 50 61  ite3pager_get(Pa
106e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
106f0 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70  o pgno, void **p
10700 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  pPage){.  PgHdr 
10710 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
10720 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
10730 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
10740 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
10750 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
10760 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
10770 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
10780 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
10790 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
107a0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
107b0 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
107c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
107d0 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
107e0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
107f0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
10800 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
10810 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
10820 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
10830 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
10840 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
10850 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
10860 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  && !pPager->memD
10870 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 75 73  b ){.    int bus
10880 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20 7b 0a  y = 1;.    do {.
10890 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
108a0 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
108b0 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
108c0 4b 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  K);.    }while( 
108d0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
108e0 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
108f0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
10900 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
10910 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
10920 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20  r->xFunc && .   
10930 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
10940 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63  syHandler->xFunc
10950 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
10960 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73  ndler->pArg, bus
10970 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  y++).    );.    
10980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10990 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
109a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
109b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
109c0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20  PAGER_SHARED;.. 
109d0 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
109e0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
109f0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
10a00 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
10a10 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
10a20 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
10a30 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
10a40 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
10a50 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
10a60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
10a70 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
10a80 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  && .        sqli
10a90 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
10aa0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
10ab0 29 20 26 26 0a 20 20 20 20 20 20 20 20 21 73 71  ) &&.        !sq
10ac0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
10ad0 72 76 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  rvedLock(&pPager
10ae0 2d 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a 20 20  ->fd) .    ){.  
10af0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20       int rc;..  
10b00 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
10b10 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
10b20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10b30 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
10b40 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a  t it is.       *
10b50 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
10b60 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
10b70 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
10b80 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
10b90 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43  he.       ** EXC
10ba0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
10bb0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
10bc0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
10bd0 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a  pen the.       *
10be0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
10bf0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
10c00 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
10c10 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
10c20 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  .       ** datab
10c30 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
10c40 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
10c50 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
10c60 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20  rolling it .    
10c70 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
10c80 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a     ** .       **
10c90 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
10ca0 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
10cb0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
10cc0 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
10cd0 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
10ce0 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
10cf0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
10d00 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
10d10 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20  il to.       ** 
10d20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20  obtain it's own 
10d30 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
10d40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
10d50 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ile..       */. 
10d60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10d70 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
10d80 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
10d90 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66  LOCK);.       if
10da0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10db0 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
10dc0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
10dd0 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
10de0 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
10df0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
10e00 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
10e10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
10e30 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
10e40 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a  GER_EXCLUSIVE;..
10e50 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
10e60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
10e70 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
10e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
10e90 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65   if.       ** we
10ea0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f   are unable to o
10eb0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
10ec0 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a  file. .       **
10ed0 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  .       ** The j
10ee0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
10ef0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
10f00 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20  locked itself.  
10f10 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f  The.       ** jo
10f20 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
10f30 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20  ver open unless 
10f40 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
10f50 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20  e file holds.   
10f60 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
10f70 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
10f80 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
10f90 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
10fa0 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  .       ** proce
10fb0 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65  sses opening the
10fc0 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20   journal at the 
10fd0 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20  same time..     
10fe0 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
10ff0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
11000 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a  adOnly(pPager->z
11010 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
11020 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69  ->jfd);.       i
11030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   ){.         sql
11050 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
11060 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
11070 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61  K);.         pPa
11080 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
11090 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  ER_UNLOCK;.     
110a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
110b0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d  E_BUSY;.       }
110c0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
110d0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
110e0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
110f0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
11100 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
11110 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
11120 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  0;.       pPager
11130 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
11140 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
11150 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
11160 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62  .       /* Playb
11170 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
11180 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
11190 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
111a0 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c  rite.       ** l
111b0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
111c0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
111d0 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
111e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
111f0 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
11200 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11220 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11240 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
11250 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  se{.    /* Searc
11260 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61  h for page in ca
11270 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  che */.    pPg =
11280 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
11290 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
112a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
112b0 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  Db && pPager->st
112c0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
112d0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
112e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
112f0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
11300 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
11310 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
11320 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
11330 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
11340 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
11350 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  t h;.    pPager-
11360 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66  >nMiss++;.    if
11370 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
11380 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
11390 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
113a0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d  ==0 || pPager->m
113b0 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  emDb ){.      /*
113c0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
113d0 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20  ge */.      pPg 
113e0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
113f0 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  w( sizeof(*pPg) 
11400 2b 20 53 51 4c 49 54 45 5f 50 41 47 45 5f 53 49  + SQLITE_PAGE_SI
11410 5a 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ZE .            
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
11440 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
11450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
11470 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 2a 73   pPager->memDb*s
11480 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
11490 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
114a0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
114b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
114c0 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Db ){.          
114d0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
114e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
114f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
11500 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
11510 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20  PAGER_ERR_MEM;. 
11520 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
11530 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11540 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
11550 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pPg, 0, sizeof(
11560 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66  *pPg));.      if
11570 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
11580 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
11590 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  t(PGHDR_TO_HIST(
115a0 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
115b0 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72   sizeof(PgHistor
115c0 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  y));.      }.   
115d0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
115e0 20 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70   pPager;.      p
115f0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
11600 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
11610 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
11620 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61  = pPg;.      pPa
11630 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
11640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
11650 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f  * Find a page to
11660 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74   recycle.  Try t
11670 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  o locate a page 
11680 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  that does not.  
11690 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75      ** require u
116a0 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
116b0 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
116c0 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
116d0 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
116e0 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
116f0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f       /* If we co
11700 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  uld not find a p
11710 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
11720 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79  t require an fsy
11730 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  nc().      ** on
11740 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11750 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
11760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
11770 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 20  This is a.      
11780 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
11790 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
117a0 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
117b0 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
117c0 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  mes.      ** it 
117d0 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
117e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
117f0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
11800 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
11810 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
11820 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
11830 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
11840 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
11850 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
11860 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
11870 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
11880 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11890 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
118a0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
118b0 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75       /* If in fu
118c0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72  ll-sync mode, wr
118d0 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61  ite a new journa
118e0 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68  l header into th
118f0 65 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e..  ** journal 
11900 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
11910 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
11920 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
11930 72 6e 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65  rnal..  ** heade
11940 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76  r that is involv
11950 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
11960 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  ck of pages that
11970 20 68 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65   have..  ** alre
11980 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
11990 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
119a0 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
119b0 61 64 65 72 20 69 73 0a 09 20 20 2a 2a 20 74 72  ader is..  ** tr
119c0 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ashed when the n
119d0 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
119e0 61 74 65 64 29 2e 0a 20 20 20 20 20 20 20 20 20  ated)..         
119f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50   */.          pP
11a00 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
11a10 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
11a20 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
11a30 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20  lOff > 0 );.    
11a40 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
11a50 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
11a60 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
11a70 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
11a80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
11a90 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
11aa0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
11ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11ac0 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20  IOERR;.         
11ad0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
11ae0 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
11af0 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  r->pFirst;.     
11b00 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
11b10 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b   pPg->nRef==0 );
11b20 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
11b30 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
11b40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
11b50 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20  f it is dirty.. 
11b60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
11b70 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
11b80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11b90 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
11ba0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   );.        pPg-
11bb0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
11bc0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11bd0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20  write_pagelist( 
11be0 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69  pPg );.        i
11bf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11c00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11c10 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
11c20 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11c30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
11c40 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
11c50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11c60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
11c70 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  >dirty==0 );..  
11c80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
11c90 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
11ca0 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
11cb0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
11cc0 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73   then.      ** s
11cd0 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
11ce0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
11cf0 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
11d00 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  g the.      ** s
11d10 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  qlite_dont_rollb
11d20 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
11d30 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
11d40 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
11d50 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74  ion..      ** It
11d60 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
11d70 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
11d80 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
11d90 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
11da0 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62        ** might b
11db0 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
11dc0 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
11dd0 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
11de0 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
11df0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
11e00 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  was marked alway
11e10 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73  sRollback.  This
11e20 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20   means that all 
11e30 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20  pages must.     
11e40 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
11e50 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
11e60 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
11e70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11e80 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
11e90 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
11ea0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
11eb0 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
11ec0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
11ed0 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64  * Unlink the old
11ee0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
11ef0 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ree list and the
11f00 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20   hash table.    
11f10 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e    */.      unlin
11f20 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
11f30 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b    pPager->nOvfl+
11f40 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  +;.    }.    pPg
11f50 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
11f60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
11f70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
11f80 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
11f90 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
11fa0 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
11fb0 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61  Memory(pPager->a
11fc0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f  InJournal, pgno/
11fd0 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  8);.      assert
11fe0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
11ff0 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70  lOpen );.      p
12000 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
12010 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
12020 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
12030 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
12040 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
12050 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Sync = 0;.    }e
12060 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
12070 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
12080 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
12090 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
120a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
120b0 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67  nStmt && (int)pg
120c0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
120d0 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
120e0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49    && (pPager->aI
120f0 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20  nStmt[pgno/8] & 
12100 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
12110 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  0 ){.      page_
12120 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
12130 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
12140 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d  {.      page_rem
12150 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
12160 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
12170 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
12180 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  0;.    pPg->nRef
12190 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46   = 1;.    REFINF
121a0 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67  O(pPg);.    pPag
121b0 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
121c0 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
121d0 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  gno);.    pPg->p
121e0 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
121f0 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
12200 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
12210 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
12220 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
12230 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12240 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
12250 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
12260 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
12270 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
12280 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
12290 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
122a0 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
122b0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
122c0 45 58 54 52 41 28 70 50 67 29 2c 20 30 2c 20 70  EXTRA(pPg), 0, p
122d0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
122e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
122f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29  ager->dbSize<0 )
12300 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
12310 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
12320 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
12330 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
12340 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
12350 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
12360 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
12370 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
12380 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
12390 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
123a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
123b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
123c0 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  t)pgno ){.      
123d0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
123e0 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 53 51  DATA(pPg), 0, SQ
123f0 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
12400 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12410 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
12420 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12430 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
12440 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
12450 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
12460 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 53 51 4c  no-1)*(off_t)SQL
12470 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ITE_PAGE_SIZE);.
12480 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12490 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
124a0 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
124b0 41 54 41 28 70 50 67 29 2c 20 53 51 4c 49 54 45  ATA(pPg), SQLITE
124c0 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
124d0 20 20 20 54 52 41 43 45 32 28 22 46 45 54 43 48     TRACE2("FETCH
124e0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 67   page %d\n", pPg
124f0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
12500 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
12510 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
12520 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
12530 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12550 20 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a     off_t fileSiz
12560 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
12570 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
12580 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69  (&pPager->fd,&fi
12590 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f  leSize)!=SQLITE_
125a0 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK.             
125b0 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70    || fileSize>=p
125c0 67 6e 6f 2a 53 51 4c 49 54 45 5f 50 41 47 45 5f  gno*SQLITE_PAGE_
125d0 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
125e0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
125f0 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
12600 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
12610 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12620 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12630 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
12640 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
12650 29 2c 20 30 2c 20 53 51 4c 49 54 45 5f 50 41 47  ), 0, SQLITE_PAG
12660 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
12670 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12680 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
12690 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
126a0 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
126b0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
126c0 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b   pPager->nHit++;
126d0 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
126e0 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
126f0 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  e = PGHDR_TO_DAT
12700 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  A(pPg);.  return
12710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12720 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
12730 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
12740 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
12750 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
12760 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
12770 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
12780 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
12790 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
127a0 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
127b0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
127c0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
127d0 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
127e0 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  _get().  The dif
127f0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
12800 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
12810 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  and sqlite3pager
12820 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  _get() is that _
12830 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
12840 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
12850 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
12860 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
12870 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
12880 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
12890 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
128a0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
128b0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
128c0 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
128d0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
128e0 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
128f0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70  /.void *sqlite3p
12900 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
12910 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12920 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
12930 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
12940 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
12950 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
12960 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12970 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
12980 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
12990 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
129a0 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
129b0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
129c0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
129d0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
129e0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
129f0 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
12a00 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
12a10 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
12a20 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
12a30 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
12a40 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
12a50 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
12a60 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
12a70 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
12a80 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
12a90 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
12aa0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
12ab0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
12ac0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
12ad0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
12ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
12af0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
12b00 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
12b10 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
12b20 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
12b30 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
12b40 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
12b50 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
12b60 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
12b70 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
12b80 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
12b90 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
12ba0 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
12bb0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
12bc0 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
12bd0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
12be0 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
12bf0 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
12c00 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
12c10 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
12c20 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
12c30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
12c40 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
12c50 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
12c60 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
12c70 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
12c80 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
12c90 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
12ca0 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
12cb0 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
12cc0 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
12cd0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
12ce0 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
12cf0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
12d00 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
12d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12d20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
12d30 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
12d40 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
12d50 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
12d60 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
12d70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12d80 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
12d90 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
12da0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
12db0 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
12dc0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
12dd0 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67  ctor(pData, pPag
12de0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
12df0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
12e00 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
12e10 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
12e20 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
12e30 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
12e40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12e50 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
12e60 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
12e70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12e80 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
12e90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
12ea0 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72  ef==0 && !pPager
12eb0 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
12ec0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
12ed0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
12ee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12ef0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
12f00 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
12f10 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
12f20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
12f30 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
12f40 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
12f50 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
12f60 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
12f70 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
12f80 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
12f90 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
12fa0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
12fb0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
12fc0 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
12fd0 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
12fe0 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
12ff0 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
13000 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13010 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
13020 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
13030 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
13040 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
13050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13060 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
13070 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
13080 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13090 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
130a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
130b0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
130c0 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
130d0 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
130e0 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
130f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
13100 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
13110 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
13120 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
13130 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
13140 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
13150 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
13160 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
13170 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13180 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
13190 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
131a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
131b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
131c0 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
131d0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
131e0 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65  Pager->jfd,pPage
131f0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
13200 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13210 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
13220 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
13230 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
13240 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28  alHdr = 0;.  if(
13250 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13260 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
13270 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
13280 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
13290 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
132a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55  ;.    sqlite3OsU
132b0 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
132c0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
132d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
132e0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
132f0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  D;.    return rc
13300 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
13310 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
13320 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
13330 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  y, &pPager->jfd)
13340 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
13350 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
13360 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
13370 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
13380 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
13390 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
133a0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
133b0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
133c0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
133d0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
133e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
133f0 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
13400 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
13410 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
13420 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
13430 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
13440 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
13450 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
13460 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
13470 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
13480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13490 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
134a0 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61  r_stmt_begin(pPa
134b0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
134c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
134d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
134e0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
134f0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
13500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13510 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13520 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
13530 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d    return rc;  .}
13540 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
13550 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
13560 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
13570 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
13580 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
13590 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
135a0 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
135b0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
135c0 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  ger_commit() is 
135d0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
135e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
135f0 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
13600 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
13610 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  e3pager_close() 
13620 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
13630 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
13640 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
13650 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
13660 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
13670 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
13680 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
13690 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
136a0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
136b0 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
136c0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
136d0 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
136e0 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
136f0 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
13700 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
13710 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
13720 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
13730 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
13740 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
13750 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
13760 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
13770 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
13780 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
13790 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
137a0 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
137b0 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
137c0 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
137d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
137e0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
137f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
13800 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
13810 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
13820 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
13830 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
13840 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
13850 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
13860 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
13870 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
13880 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
13890 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
138a0 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
138b0 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
138c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
138d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
138e0 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
138f0 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
13900 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
13910 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
13920 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
13930 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a  ger_begin(void *
13940 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
13950 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
13960 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
13970 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
13980 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
13990 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
139a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
139b0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
139c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
139d0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
139e0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
139f0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
13a00 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
13a10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
13a20 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
13a30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
13a40 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mDb ){.      pPa
13a50 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
13a60 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
13a70 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
13a80 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
13a90 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
13aa0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 75  se{.      int bu
13ab0 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 6f  sy = 1;.      do
13ac0 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
13ad0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
13ae0 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
13af0 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
13b00 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
13b10 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20  ITE_BUSY && .   
13b20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
13b30 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a  BusyHandler && .
13b40 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13b50 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
13b60 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20  xFunc && .      
13b70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
13b80 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28  yHandler->xFunc(
13b90 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
13ba0 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79  dler->pArg, busy
13bb0 2b 2b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ++).      );.   
13bc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13be0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13bf0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
13c00 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
13c10 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 70  ESERVED;.      p
13c20 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
13c30 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  e = 0;.      TRA
13c40 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
13c50 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
13c60 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 69 66 28  fd.h);.      if(
13c70 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
13c80 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
13c90 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
13ca0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
13cb0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
13cc0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
13cd0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13ce0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
13cf0 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
13d00 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
13d10 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
13d20 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
13d30 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
13d40 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
13d50 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
13d60 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
13d70 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
13d80 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
13d90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
13da0 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
13db0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
13dc0 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
13dd0 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
13de0 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
13df0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13e00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
13e10 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
13e20 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
13e30 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
13e40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
13e50 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
13e60 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
13e70 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
13e80 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
13e90 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
13ea0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
13eb0 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
13ec0 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
13ed0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
13ee0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
13ef0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
13f00 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
13f10 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
13f20 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
13f30 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
13f40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
13f50 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
13f60 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
13f70 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
13f80 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
13f90 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
13fa0 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
13fb0 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
13fc0 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
13fd0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61  all to sqlite3pa
13fe0 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20  ger_commit() or 
13ff0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
14000 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
14010 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  set..*/.int sqli
14020 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 76  te3pager_write(v
14030 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
14040 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
14050 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
14060 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
14070 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
14080 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14090 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
140a0 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
140b0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
140c0 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20  >errMask ){ .   
140d0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
140e0 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
140f0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
14100 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
14110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
14120 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
14130 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
14140 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20  Master );..  /* 
14150 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
14160 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
14170 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
14180 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
14190 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
141a0 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
141b0 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
141c0 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72  .  */.  pPg->dir
141d0 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ty = 1;.  if( pP
141e0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
141f0 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20  (pPg->inStmt || 
14200 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
14210 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
14220 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
14230 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
14240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
14250 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
14260 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
14270 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
14280 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a  needs to be.  **
14290 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
142a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
142b0 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
142c0 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
142d0 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  ** or both..  **
142e0 0a 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63  .  ** First chec
142f0 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
14300 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
14310 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
14320 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20  .  ** create it 
14330 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
14340 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
14350 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
14360 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
14370 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
14380 72 5f 62 65 67 69 6e 28 70 44 61 74 61 29 3b 0a  r_begin(pData);.
14390 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
143a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
143b0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
143c0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
143d0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
143e0 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  D );.  if( !pPag
143f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
14400 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
14410 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
14420 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
14430 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
14440 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14450 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
14460 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
14470 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
14480 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
14490 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70  seJournal );.  p
144a0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
144b0 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65  e = 1;..  /* The
144c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
144d0 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
144e0 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
144f0 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a  SERVED or an.  *
14500 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
14510 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
14520 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
14530 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
14540 61 67 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  age to.  ** the 
14550 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
14560 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
14570 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
14580 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d    */.  if( !pPg-
14590 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
145a0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
145b0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  l || pPager->mem
145c0 44 62 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Db) ){.    if( (
145d0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
145e0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
145f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ize ){.      int
14600 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 75 33 32   szPg;.      u32
14610 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 69 66   saved;.      if
14620 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
14630 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
14640 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
14650 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
14660 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
14670 20 20 54 52 41 43 45 32 28 22 4a 4f 55 52 4e 41    TRACE2("JOURNA
14680 4c 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  L page %d\n", pP
14690 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
146a0 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
146b0 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
146c0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69       pHist->pOri
146d0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
146e0 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
146f0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
14700 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
14710 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  g ){.          m
14720 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
14730 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
14740 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
14750 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
14760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67     }.        pPg
14770 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
14780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14790 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 20        u32 cksum 
147a0 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
147b0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
147c0 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
147d0 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
147e0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
147f0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  Pg);.        sto
14800 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20  re32bits(cksum, 
14810 70 50 67 2c 20 53 51 4c 49 54 45 5f 50 41 47 45  pPg, SQLITE_PAGE
14820 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
14830 73 7a 50 67 20 3d 20 53 51 4c 49 54 45 5f 50 41  szPg = SQLITE_PA
14840 47 45 5f 53 49 5a 45 2b 38 3b 0a 20 20 20 20 20  GE_SIZE+8;.     
14850 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
14860 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
14870 34 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  4);.        CODE
14880 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
14890 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
148a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
148b0 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
148c0 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61  ger->jfd, &((cha
148d0 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73  r*)pData)[-4], s
148e0 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 50  zPg);.        pP
148f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14900 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20   += szPg;.      
14910 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41    TRACE3("JOURNA
14920 4c 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  L page %d needSy
14930 6e 63 3d 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  nc=%d\n", pPg->p
14940 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
14950 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  nc);.        COD
14960 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
14970 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b  , pPg->pgno, 0);
14980 0a 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29  .        *(u32*)
14990 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
149a0 50 67 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20  Pg) = saved;.   
149b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
149c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
149d0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
149e0 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
149f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
14a00 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
14a10 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
14a20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14a30 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
14a40 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
14a50 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
14a60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
14a70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
14a80 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
14a90 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
14aa0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
14ab0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
14ac0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
14ad0 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
14ae0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 70 50  Sync;.        pP
14af0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
14b00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
14b10 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
14b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
14b30 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
14b40 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
14b50 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
14b60 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64           page_ad
14b70 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
14b80 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Pg);.        }. 
14b90 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14ba0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
14bb0 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
14bc0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
14bd0 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
14be0 6e 63 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  nc;.      TRACE3
14bf0 28 22 41 50 50 45 4e 44 20 70 61 67 65 20 25 64  ("APPEND page %d
14c00 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
14c10 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
14c20 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
14c30 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
14c40 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
14c50 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
14c60 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
14c70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74  ..  /* If the st
14c80 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
14c90 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
14ca0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
14cb0 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  t,.  ** then wri
14cc0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
14cd0 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
14ce0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
14cf0 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ote that.  ** th
14d00 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
14d10 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
14d20 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
14d30 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
14d40 6d 61 74 0a 20 20 2a 2a 20 69 6e 20 74 68 61 74  mat.  ** in that
14d50 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
14d60 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
14d70 68 65 61 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  header..  */.  i
14d80 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
14d90 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
14da0 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
14db0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
14dc0 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
14dd0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
14de0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
14df0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
14e00 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
14e10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
14e20 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67  emDb ){.      Pg
14e30 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
14e40 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
14e50 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
14e60 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
14e70 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->pStmt==0 );.  
14e80 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
14e90 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
14ea0 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
14eb0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
14ec0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
14ed0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
14ee0 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
14ef0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
14f00 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
14f10 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
14f20 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
14f30 2d 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25 64  -JOURNAL page %d
14f40 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  \n", pPg->pgno);
14f50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14f60 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
14f70 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
14f80 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
14f90 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
14fa0 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
14fb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14fc0 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
14fd0 73 74 66 64 2c 20 28 28 63 68 61 72 2a 29 70 44  stfd, ((char*)pD
14fe0 61 74 61 29 2d 34 2c 20 53 51 4c 49 54 45 5f 50  ata)-4, SQLITE_P
14ff0 41 47 45 5f 53 49 5a 45 2b 34 29 3b 0a 20 20 20  AGE_SIZE+4);.   
15000 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
15010 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20 25 64 5c  JOURNAL page %d\
15020 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  n", pPg->pgno);.
15030 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
15040 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
15050 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
15060 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
15080 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
15090 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
150a0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
150b0 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
150c0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 72  _FULL;.        r
150d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
150e0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
150f0 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
15100 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15110 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
15120 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
15130 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
15140 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
15150 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20  gno&7);.    }.  
15160 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
15170 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
15180 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
15190 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
151a0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
151b0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
151c0 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
151d0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
151e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
151f0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28  g->pgno;.    if(
15200 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
15210 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
15220 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
15230 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15240 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
15250 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
15260 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
15270 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
15280 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
15290 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
152a0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
152b0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
152c0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ** to sqlite3pag
152d0 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20  er_write().  In 
152e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
152f0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
15300 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
15310 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
15320 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e   the page..*/.in
15330 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  t sqlite3pager_i
15340 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20  swriteable(void 
15350 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
15360 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
15370 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
15380 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
15390 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  y;.}../*.** Repl
153a0 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
153b0 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
153c0 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
153d0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
153e0 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
153f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
15400 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61  ger_overwrite(Pa
15410 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
15420 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
15430 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ata){.  void *pP
15440 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  age;.  int rc;..
15450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
15460 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
15470 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
15480 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15490 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
154a0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
154b0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
154c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
154d0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
154e0 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 53 51  pPage, pData, SQ
154f0 4c 49 54 45 5f 50 41 47 45 5f 53 49 5a 45 29 3b  LITE_PAGE_SIZE);
15500 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15510 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
15520 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
15530 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15540 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
15550 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
15560 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
15570 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
15580 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
15590 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
155a0 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20  age "pgno" back 
155b0 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
155c0 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
155d0 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
155e0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
155f0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
15600 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
15610 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
15620 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
15630 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
15640 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
15650 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
15660 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
15670 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
15680 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
15690 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
156a0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
156b0 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
156c0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
156d0 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
156e0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70   the.** sqlite3p
156f0 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
15700 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
15710 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
15720 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
15730 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
15740 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
15750 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
15760 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
15770 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
15780 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
15790 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
157a0 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
157b0 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
157c0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
157d0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
157e0 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
157f0 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
15800 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
15810 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
15820 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
15830 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
15840 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
15850 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
15860 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
15870 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
15880 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
15890 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
158a0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
158b0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
158c0 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
158d0 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
158e0 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
158f0 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
15900 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
15910 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
15920 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
15930 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
15940 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
15950 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
15960 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
15970 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
15980 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
15990 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  se the page cont
159a0 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c  ains.** critical
159b0 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
159c0 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
159d0 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62  it gets rolled b
159e0 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20  ack in spite.** 
159f0 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  of the dont_roll
15a00 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
15a10 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
15a20 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67  r_dont_write(Pag
15a30 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
15a40 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
15a50 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
15a60 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74  ger->memDb ) ret
15a70 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  urn;..  pPg = pa
15a80 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
15a90 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d  r, pgno);.  pPg-
15aa0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
15ab0 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26  = 1;.  if( pPg &
15ac0 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  & pPg->dirty ){.
15ad0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15ae0 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67  dbSize==(int)pPg
15af0 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
15b00 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
15b10 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
15b20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
15b30 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
15b40 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
15b50 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
15b60 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
15b70 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
15b80 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
15b90 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
15ba0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
15bb0 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
15bc0 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
15bd0 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
15be0 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
15bf0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
15c00 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
15c10 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
15c20 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
15c30 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
15c40 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
15c50 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
15c60 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
15c70 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
15c80 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
15c90 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
15ca0 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
15cb0 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
15cc0 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
15cd0 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
15ce0 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
15cf0 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
15d00 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
15d10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
15d20 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33  se{.      TRACE3
15d30 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
15d40 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
15d50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  gno, pPager->fd.
15d60 68 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  h);.      pPg->d
15d70 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irty = 0;.    }.
15d80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63    }.}../*.** A c
15d90 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
15da0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
15db0 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
15dc0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
15dd0 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
15de0 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
15df0 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
15e00 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
15e10 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
15e20 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
15e30 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
15e40 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
15e50 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
15e60 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
15e70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
15e80 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
15e90 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
15ea0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
15eb0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
15ec0 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
15ed0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
15ee0 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  r;..  if( pPager
15ef0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 45  ->state!=PAGER_E
15f00 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61 67  XCLUSIVE || pPag
15f10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
15f20 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
15f30 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
15f40 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
15f50 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
15f60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44   || pPager->memD
15f70 62 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  b ) return;.  if
15f80 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
15f90 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
15fa0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
15fb0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
15fc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15fd0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
15fe0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
15ff0 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
16000 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
16010 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
16020 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
16030 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
16040 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
16050 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
16060 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
16070 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
16080 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61  gno&7);.      pa
16090 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
160a0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
160b0 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
160c0 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
160d0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
160e0 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66  >pgno, pPager->f
160f0 64 2e 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  d.h);.  }.  if( 
16100 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
16110 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d  e && !pPg->inStm
16120 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
16130 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
16140 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  tSize ){.    ass
16150 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
16160 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
16170 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
16180 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
16190 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
161a0 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
161b0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
161c0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
161d0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
161e0 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64  7);.    page_add
161f0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
16200 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  g);.  }.}.../*.*
16210 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
16220 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
16230 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
16240 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
16250 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
16260 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  eFree(pHist->pOr
16270 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ig);.  sqliteFre
16280 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
16290 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
162a0 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
162b0 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  tmt = 0;.}../*.*
162c0 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
162d0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
162e0 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
162f0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
16300 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
16310 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
16320 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
16330 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
16340 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
16350 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
16360 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
16370 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
16380 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
16390 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
163a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
163b0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
163c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
163d0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
163e0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
163f0 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk==PAGER_ERR_FU
16400 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LL ){.    rc = s
16410 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
16420 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
16430 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16440 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
16450 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
16460 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
16470 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
16480 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
16490 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
164a0 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
164b0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
164c0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
164d0 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
164e0 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
164f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
16500 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43  RROR;.  }.  TRAC
16510 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  E2("COMMIT %d\n"
16520 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
16530 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d  .  if( pPager->m
16540 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 67 20  emDb ){.    pPg 
16550 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
16560 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
16570 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  er);.    while( 
16580 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  pPg ){.      cle
16590 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
165a0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
165b0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
165c0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
165d0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
165e0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
165f0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
16600 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
16610 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
16620 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
16630 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
16640 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
16650 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
16660 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
16670 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
16680 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
16690 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
166a0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
166b0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
166c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
166d0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
166e0 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
166f0 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
16700 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16710 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
16720 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
16730 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
16740 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
16750 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
16760 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
16770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16780 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
16790 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29  >dirtyCache==0 )
167a0 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61  {.    /* Exit ea
167b0 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69  rly (without doi
167c0 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73  ng the time-cons
167d0 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53  uming sqlite3OsS
167e0 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
167f0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
16800 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
16810 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
16820 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  e file. */.    a
16830 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
16840 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
16850 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
16860 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
16870 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
16880 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
16890 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
168a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
168b0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
168c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
168d0 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20  er_sync(pPager, 
168e0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
168f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
16900 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74  oto commit_abort
16910 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67  ;.  }.  rc = pag
16920 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
16930 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
16940 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
16950 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
16960 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
16970 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
16980 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  ng during the co
16990 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20  mmit process..  
169a0 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a  */.commit_abort:
169b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
169c0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
169d0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  ager);.  if( rc=
169e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
169f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
16a00 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
16a10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
16a20 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
16a30 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
16a40 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
16a50 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
16a60 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
16a70 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
16a80 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
16a90 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
16aa0 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
16ab0 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
16ac0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
16ad0 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
16ae0 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
16af0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
16b00 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
16b10 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
16b20 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51  ing protocol (SQ
16b30 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f  LITE_PROTOCOL) o
16b40 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
16b50 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
16b60 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
16b70 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
16b80 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
16b90 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
16ba0 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
16bb0 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
16bc0 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
16bd0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
16be0 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
16bf0 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
16c00 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
16c10 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
16c20 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
16c30 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
16c40 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
16c50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16c60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41  .  int rc;.  TRA
16c70 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE2("ROLLBACK %d
16c80 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
16c90 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
16ca0 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 50  ->memDb ){.    P
16cb0 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
16cc0 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
16cd0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
16ce0 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
16cf0 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
16d00 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c    assert( !p->al
16d10 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
16d20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
16d30 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
16d40 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
16d50 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
16d60 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
16d70 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
16d80 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
16d90 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
16da0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
16db0 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  ))->pStmt );.   
16dc0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
16dd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48       }..      pH
16de0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
16df0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a  IST(p, pPager);.
16e00 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
16e10 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
16e20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
16e30 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74  O_DATA(p), pHist
16e40 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d  ->pOrig, pPager-
16e50 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
16e60 20 20 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c      TRACE2("ROLL
16e70 42 41 43 4b 2d 50 41 47 45 20 25 64 5c 6e 22 2c  BACK-PAGE %d\n",
16e80 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20   p->pgno);.     
16e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16ea0 54 52 41 43 45 32 28 22 50 41 47 45 20 25 64 20  TRACE2("PAGE %d 
16eb0 69 73 20 63 6c 65 61 6e 5c 6e 22 2c 20 70 2d 3e  is clean\n", p->
16ec0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
16ed0 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
16ee0 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
16ef0 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
16f00 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
16f10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
16f20 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
16f30 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20   p->pPrevStmt = 
16f40 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  p->pNextStmt = 0
16f50 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
16f60 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
16f70 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
16f80 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44  ->xReiniter(PGHD
16f90 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50  R_TO_DATA(p), pP
16fa0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
16fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
16fc0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
16fd0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
16fe0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
16ff0 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
17000 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Size;.    memory
17010 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
17020 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
17030 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
17040 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
17050 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
17060 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17070 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
17080 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
17090 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  che || !pPager->
170a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
170b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
170c0 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
170d0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
170e0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
170f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
17100 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17110 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67  rMask!=0 && pPag
17120 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47  er->errMask!=PAG
17130 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
17140 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
17150 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
17160 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
17170 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
17180 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
17190 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
171a0 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
171b0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
171c0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
171d0 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e  SERVED ){.    in
171e0 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20  t rc2;.    rc = 
171f0 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
17200 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
17210 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72  rc2 = pager_unwr
17220 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
17230 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17250 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
17260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
17270 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
17280 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
17290 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
172a0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  K ){.    rc = SQ
172b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
172c0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
172d0 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
172e0 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50  ORRUPT;.  }.  pP
172f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
17300 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
17310 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17320 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
17330 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
17340 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
17350 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
17360 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
17370 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
17380 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
17390 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72  sqlite3pager_isr
173a0 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
173b0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
173c0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
173d0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  y;.}../*.** This
173e0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
173f0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
17400 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
17410 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70  */.int *sqlite3p
17420 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72  ager_stats(Pager
17430 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
17440 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20  tic int a[9];.  
17450 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[0] = pPager->n
17460 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50  Ref;.  a[1] = pP
17470 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61  ager->nPage;.  a
17480 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  [2] = pPager->mx
17490 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  Page;.  a[3] = p
174a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
174b0 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
174c0 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
174d0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b  pPager->errMask;
174e0 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
174f0 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
17500 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
17510 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d    a[8] = pPager-
17520 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e  >nOvfl;.  return
17530 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   a;.}../*.** Set
17540 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
17550 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
17560 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17570 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
17580 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
17590 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
175a0 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
175b0 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
175c0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
175d0 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
175e0 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
175f0 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
17600 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
17610 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
17620 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
17630 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17640 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
17650 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17660 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
17670 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
17680 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20  EMPNAME_SIZE];. 
17690 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
176a0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
176b0 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45   TRACE2("STMT-BE
176c0 47 49 4e 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  GIN %d\n", pPage
176d0 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20  r->fd.h);.  if( 
176e0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
176f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
17700 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20  tInUse = 1;.    
17710 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
17720 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
17730 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
17740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
17750 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
17760 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
17770 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
17780 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
17790 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
177a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
177b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
177c0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49   );.  pPager->aI
177d0 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  nStmt = sqliteMa
177e0 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
177f0 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
17800 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
17810 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tmt==0 ){.    sq
17820 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
17830 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
17840 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75 72  LOCK);.    retur
17850 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
17860 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
17870 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  UG.  rc = sqlite
17880 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
17890 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
178a0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
178b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
178c0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
178d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
178e0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d  er->stmtJSize ==
178f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17900 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Off );.#endif.  
17910 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
17920 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  e = pPager->jour
17930 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
17940 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
17950 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70  ger->dbSize;.  p
17960 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
17970 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
17980 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61  >stmtCksum = pPa
17990 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
179a0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
179b0 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  tmtOpen ){.    r
179c0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
179d0 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
179e0 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b   &pPager->stfd);
179f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
17a00 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
17a10 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72  iled;.    pPager
17a20 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->stmtOpen = 1;.
17a30 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
17a40 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
17a50 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
17a60 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
17a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d  SQLITE_OK;. .stm
17a80 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
17a90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
17aa0 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  nStmt ){.    sql
17ab0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
17ac0 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  aInStmt);.    pP
17ad0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
17ae0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
17af0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
17b00 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  mit a statement.
17b10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
17b20 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
17b30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17b40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
17b50 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
17b60 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
17b70 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22  xt;.    TRACE2("
17b80 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
17b90 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29  ", pPager->fd.h)
17ba0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
17bb0 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
17bc0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
17bd0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  &pPager->stfd, 0
17be0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  );.      /* sqli
17bf0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70  te3OsTruncate(&p
17c00 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
17c10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
17c20 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
17c30 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
17c40 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
17c50 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
17c60 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
17c70 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
17c80 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  ext){.      pNex
17c90 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
17ca0 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mt;.      assert
17cb0 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b  ( pPg->inStmt );
17cc0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
17cd0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
17ce0 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
17cf0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
17d00 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  0;.      if( pPa
17d10 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
17d20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
17d30 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
17d40 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
17d50 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  er);.        sql
17d60 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
17d70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Stmt);.        p
17d80 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
17d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17da0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
17db0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
17dc0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
17dd0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
17de0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
17df0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
17e00 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
17e10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17e20 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
17e30 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
17e40 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
17e50 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_stmt_rollback(
17e60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17e70 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
17e80 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
17e90 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28  e ){.    TRACE2(
17ea0 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
17eb0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
17ec0 2e 68 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  .h);.    if( pPa
17ed0 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
17ee0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
17ef0 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
17f00 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
17f10 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
17f20 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50  Stmt){.        P
17f30 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
17f40 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
17f50 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
17f60 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
17f70 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
17f80 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
17f90 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
17fa0 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61  Hist->pStmt, pPa
17fb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17fd0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
17fe0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
17ff0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
18000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18010 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
18020 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
18030 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
18040 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
18050 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
18060 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18080 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
18090 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
180a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
180b0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
180c0 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
180d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
180e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
180f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
18100 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
18110 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18120 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
18130 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
18140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
18150 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
18160 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65  qlite3pager_file
18170 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
18180 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
18190 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
181a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
181b0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
181c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
181d0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
181e0 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  ar *sqlite3pager
181f0 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a  _dirname(Pager *
18200 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
18210 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n pPager->zDirec
18220 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tory;.}../*.** R
18230 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
18240 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
18250 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
18260 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
18270 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c  te3pager_journal
18280 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
18290 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
182a0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
182b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
182c0 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
182d0 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
182e0 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63  lite3pager_set_c
182f0 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
18300 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a  Pager,.  void (*
18310 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
18320 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
18330 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
18340 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  .){.  pPager->xC
18350 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20  odec = xCodec;. 
18360 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41   pPager->pCodecA
18370 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a  rg = pCodecArg;.
18380 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
18390 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
183a0 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
183b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
183c0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a  hange-counter,.*
183d0 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65  * stored at byte
183e0 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
183f0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
18400 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
18410 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
18420 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
18430 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50  void *pPage;.  P
18440 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
18450 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
18460 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
18470 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
18480 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
18490 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63  writing. */.  rc
184a0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
184b0 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  get(pPager, 1, &
184c0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
184d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
184e0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
184f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
18500 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  te(pPage);.  if(
18510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18520 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
18530 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65  * Read the curre
18540 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65  nt value at byte
18550 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72   24. */.  pPgHdr
18560 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
18570 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67  (pPage);.  chang
18580 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72  e_counter = retr
18590 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64  ieve32bits(pPgHd
185a0 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e  r, 24);..  /* In
185b0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
185c0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
185d0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
185e0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
185f0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
18600 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63  .  store32bits(c
18610 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70  hange_counter, p
18620 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f  PgHdr, 24);..  /
18630 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
18640 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
18650 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
18660 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
18670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
18690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
186a0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
186b0 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
186c0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
186d0 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
186e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
186f0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
18700 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
18710 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
18720 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
18730 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
18740 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
18750 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
18760 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
18770 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
18780 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
18790 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
187a0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
187b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
187c0 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
187d0 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
187e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
187f0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
18800 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
18810 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
18820 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
18830 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
18840 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
18850 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
18860 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
18870 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18880 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
18890 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
188a0 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
188b0 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
188c0 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
188d0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
188e0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
188f0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
18900 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20  () call..*/.int 
18910 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
18920 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  c(Pager *pPager,
18930 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
18940 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
18950 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
18960 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
18970 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
18980 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
18990 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
189a0 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   or this.  ** fu
189b0 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
189c0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
189d0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  it is a no-op.. 
189e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
189f0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
18a00 59 4e 43 45 44 20 26 26 20 21 70 50 61 67 65 72  YNCED && !pPager
18a10 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
18a20 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
18a30 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
18a40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
18a50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18a60 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
18a70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18a80 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
18a90 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
18aa0 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
18ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
18ac0 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
18ad0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
18ae0 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
18af0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
18b00 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
18b10 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
18b20 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
18b30 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
18b40 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
18b50 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
18b60 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
18b70 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
18b80 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
18b90 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
18ba0 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
18bb0 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
18bc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
18bd0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
18be0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
18bf0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
18c00 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
18c10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18c20 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
18c30 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
18c40 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
18c50 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
18c60 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
18c70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18c80 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
18c90 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  it;.      rc = s
18ca0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
18cb0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
18cc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18cd0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
18ce0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74    }..    /* Writ
18cf0 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
18d00 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
18d10 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
18d20 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
18d30 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
18d40 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  ager);.    rc = 
18d50 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
18d60 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
18d70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18d80 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
18d90 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  t;..    /* Sync 
18da0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18db0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
18dc0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
18dd0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18de0 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
18df0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  r->fd);.    }.. 
18e00 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
18e10 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
18e20 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a  .  }..sync_exit:
18e30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18e40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
18e50 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
18e60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
18e70 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
18e80 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
18e90 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f  e of the file lo
18ea0 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ck for the given
18eb0 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72   pager..** The r
18ec0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f  eturn value is o
18ed0 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53  ne of NO_LOCK, S
18ee0 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
18ef0 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45  RVED_LOCK,.** PE
18f00 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45  NDING_LOCK, or E
18f10 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
18f20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
18f30 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67  er_lockstate(Pag
18f40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66  er *pPager){.#if
18f50 64 65 66 20 4f 53 5f 54 45 53 54 0a 20 20 72 65  def OS_TEST.  re
18f60 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2d  turn pPager->fd-
18f70 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65  >fd.locktype;.#e
18f80 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 70 50 61  lse.  return pPa
18f90 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65  ger->fd.locktype
18fa0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
18fb0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
18fc0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  _TEST./*.** Prin
18fd0 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61  t a listing of a
18fe0 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61  ll referenced pa
18ff0 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65  ges and their re
19000 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  f count..*/.void
19010 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
19020 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61  fdump(Pager *pPa
19030 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
19040 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  Pg;.  for(pPg=pP
19050 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
19060 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
19070 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ll){.    if( pPg
19080 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74  ->nRef<=0 ) cont
19090 69 6e 75 65 3b 0a 20 20 20 20 70 72 69 6e 74 66  inue;.    printf
190a0 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d  ("PAGE %3d addr=
190b0 30 78 25 30 38 78 20 6e 52 65 66 3d 25 64 5c 6e  0x%08x nRef=%d\n
190c0 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
190d0 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52  pgno, (int)PGHDR
190e0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
190f0 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d  Pg->nRef);.  }.}
19100 0a 23 65 6e 64 69 66 0a                          .#endif.