/ Hex Artifact Content
Login

Artifact 37b2159056b4c965eb055b544b301d0e7cd561dd:


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: 34 20 32 30 30 34 2f 30 38 2f 30 37 20 32 33 3a  4 2004/08/07 23:
0360: 35 34 3a 34 38 20 64 72 68 20 45 78 70 20 24 0a  54:48 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 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
1760: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize 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: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
1c80: 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29  char*)(&(G)[1]))
1c90: 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d 29  [(P)->pageSize])
1ca0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
1cb0: 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c  O_HIST(P,PGR)  \
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50  .            ((P
1cd0: 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61  gHistory*)&((cha
1ce0: 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50  r*)(&(P)[1]))[(P
1cf0: 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28 50  GR)->pageSize+(P
1d00: 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f  GR)->nExtra])../
1d10: 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20  *.** How big to 
1d20: 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1d30: 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ble used for loc
1d40: 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20  ating in-memory 
1d50: 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65  pages.** by page
1d60: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65 66   number..*/.#def
1d70: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32 30  ine N_PG_HASH 20
1d80: 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61  48../*.** Hash a
1d90: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a   page number.*/.
1da0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61  #define pager_ha
1db0: 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e  sh(PN)  ((PN)&(N
1dc0: 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a  _PG_HASH-1))../*
1dd0: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
1de0: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
1df0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1e00: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1e10: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
1e20: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65   {.  char *zFile
1e30: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1e40: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1e50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e60: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
1e70: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1e80: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
1e90: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
1ea0: 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79  char *zDirectory
1eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
1ec0: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61  irectory hold da
1ed0: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
1ee0: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73  al files */.  Os
1ef0: 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20 20  File fd, jfd;   
1f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1f10: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
1f20: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
1f30: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69  ournal */.  OsFi
1f40: 6c 65 20 73 74 66 64 3b 20 20 20 20 20 20 20 20  le stfd;        
1f50: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1f60: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
1f70: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
1f80: 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74 20  journal*/.  int 
1f90: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
1fa0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1fb0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1fc0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1fd0: 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20  origDbSize;     
1fe0: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
1ff0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
2000: 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20  rent change */. 
2010: 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20   int stmtSize;  
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2030: 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
2040: 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73   (in pages) at s
2050: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
2060: 20 6f 66 66 5f 74 20 73 74 6d 74 4a 53 69 7a 65   off_t stmtJSize
2070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2080: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
2090: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
20a0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
20d0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
20e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
20f0: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
2110: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
2120: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
2130: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
2140: 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20  nt stmtNRec;    
2150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2160: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
2170: 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e  in stmt subjourn
2180: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  al */.  int nExt
2190: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
21a0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
21b0: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
21c0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
21d0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
21e0: 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
21f0: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
2200: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
2210: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
2220: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
2230: 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29  iter)(void*,int)
2240: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
2250: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
2260: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
2270: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2290: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22a0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
22b0: 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22d0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
22e0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
22f0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
2320: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
2330: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
2340: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2370: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
2380: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
2390: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
23a0: 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a  s, nOvfl;     /*
23b0: 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73   Cache hits, mis
23c0: 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76  sing, and LRU ov
23d0: 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 76 6f 69  erflows */.  voi
23e0: 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64  d (*xCodec)(void
23f0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
2400: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
2410: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
2420: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
2430: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
2440: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
2450: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
2460: 29 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  ) */.  u8 journa
2470: 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  lOpen;          
2480: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
2490: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
24a0: 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20  iptors is valid 
24b0: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
24c0: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
24d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
24e0: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
24f0: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
2500: 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  useJournal;     
2510: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2520: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
2530: 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  al on this file 
2540: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e  */.  u8 stmtOpen
2550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2560: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2570: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
2580: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a  rnal is open */.
2590: 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20    u8 stmtInUse; 
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b0: 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20   True we are in 
25c0: 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
25d0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
25e0: 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b  u8 stmtAutoopen;
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2600: 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c  pen stmt journal
2610: 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e   when main journ
2620: 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20  al is opened*/. 
2630: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2650: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
2660: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
2670: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
2680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2690: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
26a0: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
26b0: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
26c0: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43    /* PAGER_UNLOC
26f0: 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53  K, _SHARED, _RES
2700: 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20  ERVED, etc. */. 
2710: 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20 20   u8 errMask;    
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2730: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
2740: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
2750: 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b  /.  u8 tempFile;
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  /* zFilename is 
2780: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2790: 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c   */.  u8 readOnl
27a0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
27b0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
27c0: 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
27d0: 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  se */.  u8 needS
27e0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
27f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2800: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
2810: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
2820: 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79  al */.  u8 dirty
2830: 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20  Cache;          
2840: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
2850: 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76 65  ached pages have
2860: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38   changed */.  u8
2870: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
2880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
2890: 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61  able dont_rollba
28a0: 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67  ck() for all pag
28b0: 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62  es */.  u8 memDb
28c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
28e0: 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20  nhibit all file 
28f0: 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  I/O */.  u8 *aIn
2900: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2910: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2920: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2930: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2940: 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53  le */.  u8 *aInS
2950: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
2960: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
2970: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
2980: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
2990: 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70    BusyHandler *p
29a0: 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a  BusyHandler;  /*
29b0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
29c0: 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a  te.busyHandler *
29d0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
29e0: 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20  t, *pLast;      
29f0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
2a00: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
2a10: 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20   *pFirstSynced; 
2a20: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2a30: 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50  free page with P
2a40: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30  gHdr.needSync==0
2a50: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
2a60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2a70: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
2a80: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
2a90: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
2ab0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
2ac0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
2ad0: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
2ae0: 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48  *aHash[N_PG_HASH
2af0: 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61  ];    /* Hash ta
2b00: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
2b10: 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20  number to PgHdr 
2b20: 2a 2f 0a 20 20 6f 66 66 5f 74 20 6a 6f 75 72 6e  */.  off_t journ
2b30: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
2b40: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2b50: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
2b60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
2b70: 20 6f 66 66 5f 74 20 6a 6f 75 72 6e 61 6c 48 64   off_t journalHd
2b80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2b90: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
2ba0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
2bb0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 6f 66 66 5f  header */.  off_
2bc0: 74 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  t stmtHdrOff;   
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2be0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
2bf0: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
2c00: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 6f 66 66 5f  tement */.  off_
2c10: 74 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  t stmtCksum;    
2c20: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
2c30: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
2c40: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
2c50: 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  */.  int sectorS
2c60: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2c70: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
2c80: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
2c90: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20  ollback */.  u8 
2ca0: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2cc0: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2cd0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2ce0: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  to jrnl */.};../
2cf0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62  *.** These are b
2d00: 69 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  its that can be 
2d10: 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72  set in Pager.err
2d20: 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  Mask..*/.#define
2d30: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
2d40: 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77      0x01  /* a w
2d50: 72 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f  rite() failed */
2d60: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
2d70: 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32  RR_MEM      0x02
2d80: 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61    /* malloc() fa
2d90: 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  iled */.#define 
2da0: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20  PAGER_ERR_LOCK  
2db0: 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f     0x04  /* erro
2dc0: 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  r in the locking
2dd0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65   protocol */.#de
2de0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43  fine PAGER_ERR_C
2df0: 4f 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a  ORRUPT  0x08  /*
2e00: 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75   database or jou
2e10: 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
2e20: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
2e30: 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78  _ERR_DISK     0x
2e40: 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64  10  /* general d
2e50: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20  isk I/O error - 
2e60: 62 61 64 20 68 61 72 64 20 64 72 69 76 65 3f 20  bad hard drive? 
2e70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  */../*.** Journa
2e80: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
2e90: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
2ea0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
2eb0: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
2ec0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
2ed0: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
2ee0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
2ef0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
2f00: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
2f10: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
2f20: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
2f30: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
2f40: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
2f50: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
2f60: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
2f70: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
2f80: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
2f90: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
2fa0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
2fb0: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
2fc0: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
2fd0: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
2fe0: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
2ff0: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
3000: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
3010: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
3020: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
3030: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
3040: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
3050: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
3060: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
3070: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
3080: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
3090: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
30a0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
30b0: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
30c0: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
30d0: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
30e0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
30f0: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
3100: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
3110: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
3120: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
3130: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
3140: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
3150: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
3160: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
3170: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
3180: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
3190: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
31a0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
31b0: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
31c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
31d0: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
31e0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
31f0: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
3200: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
3210: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
3220: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
3230: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
3240: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
3250: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
3260: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
3270: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
3280: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
3290: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
32a0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
32b0: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
32c0: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
32d0: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
32e0: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
32f0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
3300: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
3310: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
3320: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
3330: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
3340: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
3350: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
3360: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
3370: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
3380: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
3390: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
33a0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
33b0: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
33c0: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
33d0: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
33e0: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
33f0: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
3400: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
3410: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
3420: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
3430: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
3440: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
3450: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
3460: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
3470: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
3480: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
3490: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
34a0: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
34b0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
34c0: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
34d0: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
34e0: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
34f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
3500: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
3510: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
3520: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
3530: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
3540: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
3550: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
3560: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3570: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
3580: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
3590: 69 7a 65 29 0a 0a 23 64 65 66 69 6e 65 20 50 41  ize)..#define PA
35a0: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  GER_SECTOR_SIZE 
35b0: 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  512../*.** Page 
35c0: 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f  number PAGER_MJ_
35d0: 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73  PGNO is never us
35e0: 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  ed in an SQLite 
35f0: 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a  database (it is.
3600: 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ** reserved for 
3610: 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61  working around a
3620: 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69   windows/posix i
3630: 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e  ncompatibility).
3640: 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69   It is.** used i
3650: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  n the journal to
3660: 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68   signify that th
3670: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
3680: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
3690: 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74  .** is devoted t
36a0: 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74  o storing a mast
36b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
36c0: 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  - there are no m
36d0: 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20  ore pages to.** 
36e0: 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63  roll back. See c
36f0: 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63  omments for func
3700: 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72  tion writeMaster
3710: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65  Journal() for de
3720: 74 61 69 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tails..*/.#defin
3730: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
3740: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
3750: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
3760: 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  )../*.** Enable 
3770: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3780: 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65  tracking (for de
3790: 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a  bugging) here:.*
37a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
37b0: 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72  TEST.  int pager
37c0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
37d0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
37e0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
37f0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
3800: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
3810: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
3820: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
3830: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
3840: 20 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20    printf(.      
3850: 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64   "REFCNT: %4d ad
3860: 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25  dr=0x%08x nRef=%
3870: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
3880: 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44 52  pgno, (int)PGHDR
3890: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
38a0: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
38b0: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
38c0: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
38d0: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
38e0: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
38f0: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
3900: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
3910: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
3920: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
3930: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3940: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
3950: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3960: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
3970: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
3980: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
3990: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
39a0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
39b0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
39c0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
39d0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
39e0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
39f0: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
3a00: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
3a10: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
3a20: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
3a30: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
3a40: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
3a50: 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72  u32 res;.  int r
3a60: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
3a70: 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65 73  3OsRead(fd, &res
3a80: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
3a90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3aa0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  _OK ){.    unsig
3ab0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
3ac0: 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26      memcpy(ac, &
3ad0: 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73  res, 4);.    res
3ae0: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
3af0: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
3b00: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
3b10: 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  ];.  }.  *pRes =
3b20: 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72   res;.  return r
3b30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
3b40: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
3b50: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
3b60: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
3b70: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
3b80: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
3b90: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
3ba0: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
3bb0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
3bc0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
3bd0: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
3be0: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75  d, u32 val){.  u
3bf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
3c00: 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  4];.  ac[0] = (v
3c10: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
3c20: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
3c30: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
3c40: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
3c50: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
3c60: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72   val & 0xff;.  r
3c70: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
3c80: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
3c90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3ca0: 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  the 32-bit integ
3cb0: 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68  er 'val' into th
3cc0: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
3cd0: 64 20 62 79 20 70 61 67 65 20 68 65 61 64 65 72  d by page header
3ce0: 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65  .** 'p' at offse
3cf0: 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73  t 'offset'..*/.s
3d00: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
3d10: 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20  32bits(u32 val, 
3d20: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
3d30: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
3d40: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
3d50: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
3d60: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
3d70: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
3d80: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
3d90: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
3da0: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
3db0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
3dc0: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
3dd0: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
3de0: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
3df0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3e00: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
3e10: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
3e20: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
3e30: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
3e40: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
3e50: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
3e60: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
3e70: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
3e80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3e90: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
3ea0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
3eb0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
3ec0: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
3ed0: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
3ee0: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
3ef0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
3f00: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
3f10: 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  rt the bits in t
3f20: 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
3f30: 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f  sk into an appro
3f40: 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20  prate.** return 
3f50: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
3f60: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64  int pager_errcod
3f70: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
3f80: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
3f90: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
3fa0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
3fb0: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29  PAGER_ERR_LOCK )
3fc0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3fd0: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20  PROTOCOL;.  if( 
3fe0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
3ff0: 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  & PAGER_ERR_DISK
4000: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
4010: 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70  E_IOERR;.  if( p
4020: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
4030: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
4040: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
4050: 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61  _FULL;.  if( pPa
4060: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
4070: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20  AGER_ERR_MEM )  
4080: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4090: 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67  OMEM;.  if( pPag
40a0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
40b0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
40c0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
40d0: 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  RRUPT;.  return 
40e0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  rc;.}../*.** Whe
40f0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
4100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4110: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
4120: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
4130: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
4140: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
4150: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
4160: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
4170: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
4180: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
4190: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
41a0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d  teMalloc(). *pzM
41b0: 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20  aster is.** set 
41c0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
41d0: 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
41e0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
41f0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
4200: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a  * sqliteFree() *
4210: 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  pzMaster..**.** 
4220: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
4230: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
4240: 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73  s present *pzMas
4250: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
4260: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
4270: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
4280: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
4290: 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c  terJournal(OsFil
42a0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
42b0: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
42c0: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
42d0: 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20 20  .  off_t szJ;.  
42e0: 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74  u32 cksum;.  int
42f0: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
4300: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
4310: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
4320: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
4330: 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73  der */..  *pzMas
4340: 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  ter = 0;..  rc =
4350: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
4360: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
4370: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4380: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
4390: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
43a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
43b0: 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29  k(pJrnl, szJ-16)
43c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
43d0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
43e0: 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64  c;. .  rc = read
43f0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c  32bits(pJrnl, &l
4400: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
4410: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4420: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
4430: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
4440: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
4450: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
4460: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
4470: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
4480: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
4490: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
44a0: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
44b0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
44c0: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
44d0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
44e0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
44f0: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  rnl, szJ-16-len)
4500: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
4510: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
4520: 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  c;..  *pzMaster 
4530: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
4540: 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20  Malloc(len+1);. 
4550: 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20   if( !*pzMaster 
4560: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
4580: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4590: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d  Read(pJrnl, *pzM
45a0: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
45b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
45c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
45d0: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
45e0: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
45f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
4600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
4610: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
4620: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
4630: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
4640: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
4650: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
4660: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
4670: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
4680: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
4690: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
46a0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
46b0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
46c0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
46d0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
46e0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
46f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
4700: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
4710: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
4720: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
4730: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
4740: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
4750: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
4760: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
4770: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
4780: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
4790: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
47a0: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
47b0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20  aster = 0;.  }. 
47c0: 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e   (*pzMaster)[len
47d0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
47e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
47f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
4800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4810: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
4820: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
4830: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
4840: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
4850: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
4860: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
4870: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
4880: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
4890: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
48a0: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
48b0: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
48c0: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
48d0: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
48e0: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
48f0: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
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 0a  ---------------.
4920: 2a 2a 20 30 20 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 30 0a 2a               0.*
4940: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
4950: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
4960: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
4980: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
49a0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
49b0: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
49c0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
49d0: 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6f 66 66 73  r){.  off_t offs
49e0: 65 74 20 3d 20 30 3b 0a 20 20 6f 66 66 5f 74 20  et = 0;.  off_t 
49f0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
4a00: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
4a10: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
4a20: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
4a30: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
4a40: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
4a50: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
4a60: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
4a70: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
4a80: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
4a90: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
4aa0: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
4ab0: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
4ac0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4ad0: 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ) );.  pPager->j
4ae0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73  ournalOff = offs
4af0: 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  et;.  return sql
4b00: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
4b10: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
4b20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a  >journalOff);.}.
4b30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
4b40: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
4b50: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
4b60: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4b70: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
4b80: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
4b90: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
4ba0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4bb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
4bc0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
4bd0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
4be0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
4bf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
4c00: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
4c10: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
4c20: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
4c30: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
4c40: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
4c50: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
4c60: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
4c70: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
4c80: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
4c90: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
4ca0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
4cb0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
4cc0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
4cd0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
4ce0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
4cf0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
4d00: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
4d10: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
4d20: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20  journal..** .** 
4d30: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
4d40: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34  RNAL_HDR_SZ - 24
4d50: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
4d60: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
4d70: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
4d80: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
4d90: 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63  ager){..  int rc
4da0: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
4db0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
4dc0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
4dd0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
4de0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
4df0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
4e00: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
4e10: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
4e20: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
4e30: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
4e40: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
4e50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
4e60: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
4e70: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
4e80: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
4e90: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
4ea0: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
4eb0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
4ec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
4ed0: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
4ee0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
4ef0: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
4f00: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
4f10: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
4f20: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
4f30: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
4f40: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
4f50: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
4f60: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
4f70: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
4f80: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
4f90: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
4fa0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
4fb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
4fc0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
4fd0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
4fe0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
4ff0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5000: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
5010: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
5020: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
5030: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72  . */.    rc = wr
5040: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
5050: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5060: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
5070: 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  fff : 0);.  }.  
5080: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5090: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
50a0: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
50b0: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
50c0: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e   .    sqlite3Ran
50d0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
50e0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
50f0: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
5100: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d  mInit);.    rc =
5110: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5120: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5130: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
5140: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
5150: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5160: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
5170: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
5180: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
5190: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
51a0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
51b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
51c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
51d0: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
51e0: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
51f0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
5200: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5210: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5220: 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  d, pPager->secto
5230: 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rSize);.  }..  /
5240: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
5250: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
5260: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
5270: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
5280: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
5290: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
52a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
52b0: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
52c0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
52d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
52e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
52f0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
5300: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5310: 66 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  f-1);.    rc = s
5320: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
5330: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30  Pager->jfd, "\00
5340: 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  0", 1);.  }.  re
5350: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5360: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
5370: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
5380: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
5390: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
53a0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
53b0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
53c0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
53d0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
53e0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
53f0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53  urnal.** file. S
5400: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
5410: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
5420: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
5430: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
5440: 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  f.** the journal
5450: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
5460: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
5470: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
5480: 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20  essfully, *nRec 
5490: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
54a0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
54b0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
54c0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
54d0: 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74  d *dbSize is set
54e0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
54f0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
5500: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
5510: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
5520: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
5530: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
5540: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
5550: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
5560: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
5570: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
5580: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
5590: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
55a0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
55b0: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
55c0: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
55d0: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
55e0: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
55f0: 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a   and *nRec and *
5600: 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73  dbSize are not s
5610: 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  et.  If JOURNAL_
5620: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
5630: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
5640: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
5650: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
5660: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
5670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5680: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
5690: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a  Pager *pPager, .
56a0: 20 20 6f 66 66 5f 74 20 6a 6f 75 72 6e 61 6c 53    off_t journalS
56b0: 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65  ize,.  u32 *pNRe
56c0: 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69  c, .  u32 *pDbSi
56d0: 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ze.){.  int rc;.
56e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
56f0: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
5700: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
5710: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
5720: 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a  */..  rc = seekJ
5730: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
5740: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
5750: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
5760: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5770: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
5780: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
5790: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
57a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
57b0: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  E;.  }..  rc = s
57c0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
57d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
57e0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
57f0: 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ));.  if( rc ) r
5800: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
5810: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5820: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
5830: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
5840: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5850: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
5860: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
5870: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
5880: 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20  , pNRec);.  if( 
5890: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
58a0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
58b0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
58c0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
58d0: 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nit);.  if( rc )
58e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
58f0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
5900: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62  pPager->jfd, pDb
5910: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
5920: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5930: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73  /* Update the as
5940: 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a  sumed sector-siz
5950: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
5960: 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20  alue used by .  
5970: 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
5980: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
5990: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
59a0: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
59b0: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
59c0: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
59d0: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
59e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
59f0: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
5a00: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
5a10: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
5a20: 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
5a30: 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e  e.  ** of Pager.
5a40: 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
5a50: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
5a60: 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
5a70: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  e..  */.  rc = r
5a80: 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65  ead32bits(&pPage
5a90: 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26  r->jfd, (u32 *)&
5aa0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
5ab0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
5ac0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
5ad0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5ae0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
5af0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  SZ(pPager);.  rc
5b00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
5b10: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
5b20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5b30: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  f);.  return rc;
5b40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
5b50: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
5b60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5b70: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
5b80: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
5b90: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
5ba0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
5bb0: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
5bc0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
5bd0: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
5be0: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
5bf0: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
5c00: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
5c10: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
5c20: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
5c30: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
5c40: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
5c50: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
5c60: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
5c70: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
5c80: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
5c90: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
5ca0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
5cb0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e  _MJ_PGNO..** + N
5cc0: 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f   bytes: length o
5cd0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
5ce0: 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79   name..** + 4 by
5cf0: 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79  tes: N.** + 4 by
5d00: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
5d10: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
5d20: 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a  m..** + 8 bytes:
5d30: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
5d40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
5d50: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
5d60: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
5d70: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
5d80: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
5d90: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  * journal name..
5da0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
5db0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
5dc0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
5dd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
5de0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
5df0: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
5e00: 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75  t i; .  u32 cksu
5e10: 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20 21  m = 0; ..  if( !
5e20: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
5e30: 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65  r->setMaster) re
5e40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5e50: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
5e60: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
5e70: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
5e80: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5e90: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
5ea0: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
5eb0: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
5ec0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
5ed0: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
5ee0: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
5ef0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
5f00: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
5f10: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
5f20: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
5f30: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
5f40: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
5f50: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
5f60: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
5f70: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
5f80: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
5f90: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
5fa0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
5fb0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
5fc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5fd0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
5fe0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5ff0: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
6000: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
6010: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
6020: 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  d, PAGER_MJ_PGNO
6030: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
6040: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6050: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
6060: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6070: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
6080: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
6090: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
60a0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
60b0: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
60c0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
60d0: 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  d, len);.  if( r
60e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
60f0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6100: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
6110: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73 75  Pager->jfd, cksu
6120: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
6130: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6140: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
6150: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
6160: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
6170: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
6180: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
6190: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
61a0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65  ./*.** Add or re
61b0: 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  move a page from
61c0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
61d0: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
61e0: 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d  in the.** statem
61f0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
6200: 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65  ** The Pager kee
6210: 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  ps a separate li
6220: 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  st of pages that
6230: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
6240: 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65  n.** the stateme
6250: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69  nt journal.  Thi
6260: 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69  s helps the sqli
6270: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
6280: 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  mmit().** routin
6290: 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65  e run MUCH faste
62a0: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
62b0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72   case where ther
62c0: 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61  e are many.** pa
62d0: 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75  ges in memory bu
62e0: 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65  t only a few are
62f0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
6300: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  t journal..*/.st
6310: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61  atic void page_a
6320: 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
6330: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
6340: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
6350: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
6360: 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20  ( pPg->inStmt ) 
6370: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
6380: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
6390: 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78  ==0 && pPg->pNex
63a0: 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50  tStmt==0 );.  pP
63b0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
63c0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
63d0: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61  pStmt ){.    pPa
63e0: 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65  ger->pStmt->pPre
63f0: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d  vStmt = pPg;.  }
6400: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  .  pPg->pNextStm
6410: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
6420: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74  t;.  pPager->pSt
6430: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  mt = pPg;.  pPg-
6440: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73  >inStmt = 1;.}.s
6450: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
6460: 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
6470: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
6480: 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  ){.  if( !pPg->i
6490: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
64a0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
64b0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Stmt ){.    asse
64c0: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  rt( pPg->pPrevSt
64d0: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70  mt->pNextStmt==p
64e0: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
64f0: 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53  PrevStmt->pNextS
6500: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
6510: 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Stmt;.  }else{. 
6520: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
6530: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70  pPager->pStmt==p
6540: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
6550: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
6560: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
6570: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
6580: 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  extStmt ){.    a
6590: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
65a0: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
65b0: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ==pPg );.    pPg
65c0: 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72  ->pNextStmt->pPr
65d0: 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50  evStmt = pPg->pP
65e0: 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70  revStmt;.  }.  p
65f0: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
6600: 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  0;.  pPg->pPrevS
6610: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  tmt = 0;.  pPg->
6620: 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  inStmt = 0;.}../
6630: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
6640: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
6650: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
6660: 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  e number.  Retur
6670: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
6680: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
6690: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
66a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
66b0: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
66c0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
66d0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
66e0: 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  r *p = pPager->a
66f0: 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28  Hash[pager_hash(
6700: 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28  pgno)];.  while(
6710: 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70   p && p->pgno!=p
6720: 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  gno ){.    p = p
6730: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
6740: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
6750: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
6760: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
6770: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
6780: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
6790: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
67a0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
67b0: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
67c0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
67d0: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
67e0: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
67f0: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
6800: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
6810: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
6820: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
6830: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
6840: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
6850: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
6860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6870: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
6880: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
6890: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
68a0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
68b0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
68c0: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  Pg=pNext){.    p
68d0: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
68e0: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
68f0: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
6900: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
6910: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
6920: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
6930: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
6940: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
6950: 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  pAll = 0;.  mems
6960: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
6970: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
6980: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70  er->aHash));.  p
6990: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
69a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
69b0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
69c0: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
69d0: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
69e0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
69f0: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
6a00: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
6a10: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  O_LOCK);.  pPage
6a20: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
6a30: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
6a40: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
6a50: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
6a60: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
6a70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
6a80: 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n==0 );.}../*.**
6a90: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
6aa0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
6ab0: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
6ac0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
6ad0: 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52  n and.** a RESER
6ae0: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
6af0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
6b00: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
6b10: 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a  tine releases.**
6b20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
6b30: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
6b40: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
6b50: 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65   its place.  The
6b60: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
6b70: 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20   is deleted and 
6b80: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  closed..**.** TO
6b90: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
6ba0: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
6bb0: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
6bc0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
6bd0: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
6be0: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
6bf0: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
6c00: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
6c10: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
6c20: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
6c30: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
6c40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
6c50: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50  er_unwritelock(P
6c60: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6c70: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 61   PgHdr *pPg;.  a
6c80: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
6c90: 6d 65 6d 44 62 20 29 3b 0a 20 20 69 66 28 20 70  memDb );.  if( p
6ca0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
6cb0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
6cc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6cd0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
6ce0: 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
6cf0: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
6d00: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
6d10: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
6d20: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
6d30: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
6d40: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
6d50: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
6d60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
6d70: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
6d80: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
6d90: 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  >jfd);.    pPage
6da0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
6db0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   0;.    sqlite3O
6dc0: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
6dd0: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73  zJournal);.    s
6de0: 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
6df0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->aInJournal );
6e00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
6e10: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
6e20: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
6e30: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
6e40: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
6e50: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
6e60: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
6e70: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
6e80: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
6e90: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
6ea0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
6eb0: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
6ec0: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
6ed0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6ee0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
6ef0: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
6f00: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
6f10: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71  l==0 );.  }.  sq
6f20: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
6f30: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
6f40: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  D_LOCK);.  pPage
6f50: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
6f60: 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65  _SHARED;.  pPage
6f70: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
6f80: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
6f90: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65  Master = 0;.  re
6fa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
6fc0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
6fd0: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
6fe0: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
6ff0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
7000: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
7010: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
7020: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
7030: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
7040: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
7050: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
7060: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
7070: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
7080: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
7090: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
70a0: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
70b0: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
70c0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
70d0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
70e0: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
70f0: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
7100: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
7110: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
7120: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
7130: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
7140: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
7150: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
7160: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
7170: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
7180: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
7190: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
71a0: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
71b0: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
71c0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
71d0: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
71e0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
71f0: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
7200: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
7210: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
7220: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
7230: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
7240: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
7250: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
7260: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
7270: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
7280: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
7290: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
72a0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
72b0: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
72c0: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
72d0: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
72e0: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
72f0: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
7300: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
7310: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
7320: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
7330: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
7340: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
7350: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
7360: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
7370: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
7380: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
7390: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
73a0: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
73b0: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
73c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
73d0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
73e0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
73f0: 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72  pgno, const char
7400: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
7410: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
7420: 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74  cksumInit;.  int
7430: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
7440: 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69  eSize-200;.  whi
7450: 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
7460: 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
7470: 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
7480: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
7490: 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  um;.}../*.** Rea
74a0: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
74b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
74c0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
74d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
74e0: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
74f0: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
7500: 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73  .**.** If useCks
7510: 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  um==0 it means t
7520: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  his journal does
7530: 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75   not use checksu
7540: 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a  ms.  Checksums.*
7550: 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69  * are not used i
7560: 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  n statement jour
7570: 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61  nals because sta
7580: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
7590: 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74  do not.** need t
75a0: 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20  o survive power 
75b0: 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61  failures..*/.sta
75c0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
75d0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
75e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f  Pager *pPager, O
75f0: 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20  sFile *jfd, int 
7600: 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74  useCksum){.  int
7610: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
7620: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
7630: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
7640: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
7650: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
7660: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7680: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
7690: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
76a0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
76d0: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
76e0: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
76f0: 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41   aData[SQLITE_MA
7700: 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f  X_PAGE_SIZE];  /
7710: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66  * Temp storage f
7720: 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20  or a page */..  
7730: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7740: 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  jfd, &pgno);.  i
7750: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7760: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7770: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7780: 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20  ad(jfd, &aData, 
7790: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
77a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
77b0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
77c0: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
77d0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
77e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
77f0: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
7800: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
7810: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
7820: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
7830: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
7840: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
7850: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
7860: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
7870: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
7880: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
7890: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
78a0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
78b0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
78c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
78d0: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
78e0: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
78f0: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
7900: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
7910: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
7920: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
7930: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
7940: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
7950: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7960: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
7970: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
7980: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
7990: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
79a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
79b0: 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29    if( useCksum )
79c0: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
79d0: 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75  2bits(jfd, &cksu
79e0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
79f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
7a00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7a10: 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28  ff += 4;.    if(
7a20: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
7a30: 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61  ger, pgno, aData
7a40: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
7a50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7a60: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
7a70: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7a80: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
7a90: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
7aa0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
7ab0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
7ac0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
7ad0: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
7ae0: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
7af0: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
7b00: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
7b10: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
7b20: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
7b30: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
7b40: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
7b50: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
7b60: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
7b70: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
7b80: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
7b90: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
7ba0: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
7bb0: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
7bc0: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
7bd0: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
7be0: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
7bf0: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
7c00: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
7c10: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
7c20: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61  .  */.  pPg = pa
7c30: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
7c40: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
7c50: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
7c60: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
7c70: 56 45 20 7c 7c 20 70 50 67 20 29 3b 0a 20 20 54  VE || pPg );.  T
7c80: 52 41 43 45 32 28 22 50 4c 41 59 42 41 43 4b 20  RACE2("PLAYBACK 
7c90: 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 67 6e 6f  page %d\n", pgno
7ca0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
7cb0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
7cc0: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 73  CLUSIVE ){.    s
7cd0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
7ce0: 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
7cf0: 31 29 2a 28 6f 66 66 5f 74 29 70 50 61 67 65 72  1)*(off_t)pPager
7d00: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
7d10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
7d20: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  rite(&pPager->fd
7d30: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
7d40: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
7d50: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
7d60: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
7d70: 6c 64 20 65 76 65 72 20 62 65 20 72 6f 6c 6c 65  ld ever be rolle
7d80: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
7d90: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 20 66 6f  n use, except fo
7da0: 72 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 31 20  r page.    ** 1 
7db0: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
7dc0: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
7dd0: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
7de0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
7df0: 20 20 20 2a 2a 20 61 63 74 69 76 65 2e 0a 20 20     ** active..  
7e00: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
7e10: 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
7e20: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
7e30: 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  | pPg->pgno==1 )
7e40: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  ;.    pData = PG
7e50: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
7e60: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
7e70: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
7e80: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
7e90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
7ea0: 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a  estructor ){  /*
7eb0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75  ** FIX ME:  Shou
7ec0: 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e  ld this be xRein
7ed0: 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70  it? ***/.      p
7ee0: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
7ef0: 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72  or(pData, pPager
7f00: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
7f10: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
7f20: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
7f30: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
7f40: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
7f50: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
7f60: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
7f70: 7d 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67  }.    CODEC(pPag
7f80: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
7f90: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
7fa0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7fb0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
7fc0: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
7fd0: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
7fe0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
7ff0: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
8000: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
8010: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
8020: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
8030: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
8040: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
8050: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
8060: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
8070: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
8080: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8090: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
80a0: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
80b0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
80c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
80d0: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
80e0: 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72  f all child jour
80f0: 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c  nals..** To tell
8100: 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   if a master jou
8110: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
8120: 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61  ted, check to ea
8130: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69  ch of the.** chi
8140: 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63  ldren.  If all c
8150: 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68  hildren are eith
8160: 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f  er missing or do
8170: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a   not refer to.**
8180: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
8190: 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ter journal, the
81a0: 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  n this master jo
81b0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
81c0: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
81d0: 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
81e0: 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
81f0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
8200: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
8210: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46  _open = 0;.  OsF
8220: 69 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20 63 68  ile master;.  ch
8230: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
8240: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
8250: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
8260: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
8270: 6f 66 66 5f 74 20 6e 4d 61 73 74 65 72 4a 6f 75  off_t nMasterJou
8280: 72 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a  rnal;     /* Siz
8290: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
82a0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
82b0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
82c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
82d0: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
82e0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
82f0: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
8300: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
8310: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
8320: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
8330: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
8340: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d    */.  memset(&m
8350: 61 73 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  aster, 0, sizeof
8360: 28 6d 61 73 74 65 72 29 29 3b 0a 20 20 72 63 20  (master));.  rc 
8370: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
8380: 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c  eadOnly(zMaster,
8390: 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28   &master);.  if(
83a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
83b0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
83c0: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
83d0: 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  en = 1;.  rc = s
83e0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
83f0: 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (&master, &nMast
8400: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
8410: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8420: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
8430: 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
8440: 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
8450: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  .    char *zJour
8460: 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  nal;.    char *z
8470: 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a  MasterPtr = 0;..
8480: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
8490: 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
84a0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
84b0: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
84c0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  rom.    ** sqlit
84d0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  eMalloc() and po
84e0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
84f0: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
8500: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
8510: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
8520: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d  )sqliteMalloc(nM
8530: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
8540: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
8550: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
8560: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
8570: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
8580: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
8590: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
85a0: 74 65 33 4f 73 52 65 61 64 28 26 6d 61 73 74 65  te3OsRead(&maste
85b0: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
85c0: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
85d0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
85e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
85f0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
8600: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
8610: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
8620: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
8630: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
8640: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
8650: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
8660: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
8670: 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29  ists(zJournal) )
8680: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
8690: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
86a0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
86b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
86c0: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
86d0: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
86e0: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
86f0: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
8700: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
8710: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
8720: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
8730: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
8740: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
8750: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8760: 20 4f 73 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b   OsFile journal;
8770: 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ..        memset
8780: 28 26 6a 6f 75 72 6e 61 6c 2c 20 30 2c 20 73 69  (&journal, 0, si
8790: 7a 65 6f 66 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a  zeof(journal));.
87a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
87b0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
87c0: 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f  ly(zJournal, &jo
87d0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
87e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
87f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
8800: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
8810: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
8820: 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
8830: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f  asterJournal(&jo
8840: 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50  urnal, &zMasterP
8850: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  tr);.        sql
8860: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75  ite3OsClose(&jou
8870: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
8880: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8890: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
88a0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
88b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
88c0: 20 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72       if( zMaster
88d0: 50 74 72 20 26 26 20 21 73 74 72 63 6d 70 28 7a  Ptr && !strcmp(z
88e0: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
88f0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
8900: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
8910: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
8920: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
8930: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
8940: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
8950: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
8960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8970: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
8980: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
8990: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
89a0: 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44  .  .  sqlite3OsD
89b0: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
89c0: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
89d0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
89e0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
89f0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  teFree(zMasterJo
8a00: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
8a10: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
8a20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
8a30: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
8a40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65  .}../*.** Make e
8a60: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
8a70: 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74   cache agree wit
8a80: 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
8a90: 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
8aa0: 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68  ds,.** reread th
8ab0: 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20  e disk to reset 
8ac0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
8ad0: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
8ae0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8af0: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c  lled after a rol
8b00: 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73  lback in which s
8b10: 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79  ome of the dirty
8b20: 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20   cache.** pages 
8b30: 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77  had never been w
8b40: 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69  ritten out to di
8b50: 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  sk.  We need to 
8b60: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a  roll back the.**
8b70: 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61   cache content a
8b80: 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77  nd the easiest w
8b90: 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73  ay to do that is
8ba0: 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f   to reread the o
8bb0: 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61  ld content.** ba
8bc0: 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ck from the disk
8bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8be0: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
8bf0: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
8c00: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
8c10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8c20: 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67  TE_OK;.  for(pPg
8c30: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
8c40: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
8c50: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72  xtAll){.    char
8c60: 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58   zBuf[SQLITE_MAX
8c70: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20  _PAGE_SIZE];.   
8c80: 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79   if( !pPg->dirty
8c90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8ca0: 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
8cb0: 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
8cc0: 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
8cd0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
8ce0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  (&pPager->fd, pP
8cf0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
8d00: 6f 66 66 5f 74 29 28 70 50 67 2d 3e 70 67 6e 6f  off_t)(pPg->pgno
8d10: 2d 31 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  -1));.      rc =
8d20: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
8d30: 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
8d40: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8d50: 7a 65 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ze);.      TRACE
8d60: 32 28 22 52 45 46 45 54 43 48 20 70 61 67 65 20  2("REFETCH page 
8d70: 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
8d80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
8d90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43  ) break;.      C
8da0: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75  ODEC(pPager, zBu
8db0: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
8dc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8dd0: 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
8de0: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
8df0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
8e00: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
8e10: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   || memcmp(zBuf,
8e20: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
8e30: 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
8e40: 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  eSize) ){.      
8e50: 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
8e60: 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c  DATA(pPg), zBuf,
8e70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8e80: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  e);.      if( pP
8e90: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
8ea0: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
8eb0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48  r->xReiniter(PGH
8ec0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
8ed0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8ee0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
8ef0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
8f00: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
8f10: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
8f20: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
8f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8f40: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
8f50: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
8f60: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
8f70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8f80: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
8f90: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
8fa0: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
8fb0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
8fc0: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
8fd0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
8fe0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
8ff0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
9000: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
9010: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
9020: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
9030: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
9040: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
9050: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
9060: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
9070: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
9080: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
9090: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
90a0: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
90b0: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
90c0: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
90d0: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
90e0: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
90f0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
9100: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
9110: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
9120: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
9130: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
9140: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
9150: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
9160: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
9170: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
9180: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
9190: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
91a0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
91b0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
91c0: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
91d0: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
91e0: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
91f0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
9200: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
9210: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
9220: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
9230: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9240: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
9250: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
9260: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
9270: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
9280: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
9290: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
92a0: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
92b0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
92c0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
92d0: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
92e0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
92f0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
9300: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
9310: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
9320: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
9330: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
9340: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
9350: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
9360: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
9370: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
9380: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
9390: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
93a0: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
93b0: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
93c0: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
93d0: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
93e0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
93f0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
9400: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
9410: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
9420: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
9430: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
9440: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
9450: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
9460: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
9470: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
9480: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
9490: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
94a0: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
94b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
94c0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
94d0: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
94e0: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
94f0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
9500: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
9510: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
9520: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
9530: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
9540: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
9550: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
9560: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
9570: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
9580: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
9590: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
95a0: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
95b0: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
95c0: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
95d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
95e0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
95f0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
9600: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
9610: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
9620: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
9630: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
9640: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
9650: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
9660: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
9670: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
9680: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
9690: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
96a0: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
96b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
96c0: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
96d0: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
96e0: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
96f0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
9700: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
9710: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
9720: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
9730: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
9740: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
9750: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
9760: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
9770: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
9780: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
9790: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
97a0: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
97b0: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
97c0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
97d0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
97e0: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
97f0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
9800: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
9810: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
9820: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
9830: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
9840: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
9850: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
9860: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
9870: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
9880: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
9890: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
98a0: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
98b0: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
98c0: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
98d0: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
98e0: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
98f0: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
9900: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
9910: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
9920: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
9930: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
9940: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
9950: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
9960: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
9970: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
9980: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
9990: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
99a0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
99b0: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
99c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
99d0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
99e0: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
99f0: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
9a00: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
9a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
9a20: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
9a30: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9a40: 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20  off_t szJ;      
9a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9a60: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9a70: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
9a80: 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9aa0: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
9ab0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
9ac0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ae0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
9af0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
9b00: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
9b10: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
9b20: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
9b30: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
9b60: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
9b70: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
9b80: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
9b90: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
9ba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
9bb0: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
9bc0: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
9bd0: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
9be0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
9bf0: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
9c00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9c10: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
9c20: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
9c30: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
9c40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
9c50: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
9c60: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
9c70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9c80: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
9c90: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
9ca0: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
9cb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
9cc0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9cd0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
9ce0: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
9cf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9d00: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
9d10: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
9d20: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
9d30: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
9d40: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
9d50: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
9d60: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
9d70: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
9d80: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
9d90: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
9da0: 61 6c 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al(&pPager->jfd,
9db0: 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73   &zMaster);.  as
9dc0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
9dd0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
9de0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
9df0: 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c  (zMaster && !sql
9e00: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
9e10: 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20  (zMaster)) ){.  
9e20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
9e30: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
9e40: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
9e50: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
9e60: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
9e70: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
9e80: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73  layback;.  }.  s
9e90: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
9ea0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
9eb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9ec0: 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  Off = 0;..  /* T
9ed0: 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
9ee0: 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
9ef0: 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  the readJournalH
9f00: 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  dr() call return
9f10: 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  s.  ** SQLITE_DO
9f20: 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
9f30: 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77  r occurs. */.  w
9f40: 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20  hile( 1 ){..    
9f50: 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
9f60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9f70: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9f80: 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
9f90: 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
9fa0: 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
9fb0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
9fc0: 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
9fd0: 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
9fe0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
9ff0: 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
a000: 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66  rocess must of f
a010: 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
a020: 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
a030: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
a040: 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
a050: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
a060: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
a070: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
a080: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
a090: 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
a0a0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a0b0: 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
a0c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
a0d0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
a0e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
a100: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
a110: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a120: 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
a130: 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
a140: 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
a150: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
a160: 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
a170: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
a180: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
a190: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
a1a0: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
a1b0: 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
a1c0: 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
a1d0: 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
a1e0: 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
a1f0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
a200: 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
a210: 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
a220: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
a230: 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
a240: 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
a250: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
a260: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
a270: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
a280: 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
a290: 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
a2a0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
a2b0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
a2c0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
a2d0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
a2e0: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
a2f0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
a300: 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
a310: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
a320: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
a330: 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73   it's original s
a340: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
a350: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
a360: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
a370: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
a380: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a390: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
a3a0: 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ze==0 || pPager-
a3b0: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50  >origDbSize==mxP
a3c0: 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g );.      rc = 
a3d0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
a3e0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  e(&pPager->fd, p
a3f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
a400: 28 6f 66 66 5f 74 29 6d 78 50 67 29 3b 0a 20 20  (off_t)mxPg);.  
a410: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a420: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a430: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
a440: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
a450: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a460: 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
a470: 20 20 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c 69      /* rc = sqli
a480: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
a490: 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c 5f  r->jfd, JOURNAL_
a4a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  HDR_SZ(pPager));
a4b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d   */.    if( rc!=
a4c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a4d0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
a4e0: 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72   .    /* Copy or
a4f0: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
a500: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
a510: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
a520: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
a530: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
a540: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
a550: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
a560: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
a570: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
a580: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
a590: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a5a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a5b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a5c0: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
a5d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a5e0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
a5f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a600: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
a610: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a630: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
a640: 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
a650: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a660: 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61  ..  /* Pages tha
a670: 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
a680: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
a690: 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e  al but never syn
a6a0: 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e  ced.  ** where n
a6b0: 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79 20 74  ot restored by t
a6c0: 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20  he loop above.  
a6d0: 57 65 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f  We have to resto
a6e0: 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61  re those.  ** pa
a6f0: 67 65 73 20 62 79 20 72 65 61 64 69 6e 67 20 74  ges by reading t
a700: 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  hem back from th
a710: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
a720: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ase..  */.  asse
a730: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
a740: 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f 72 65 6c  K );.  pager_rel
a750: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
a760: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
a770: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
a780: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
a790: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
a7a0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
a7b0: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29  .  if( zMaster )
a7c0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
a7d0: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
a7e0: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
a7f0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
a800: 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a  urn true,.    **
a810: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
a820: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
a830: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a840: 6e 61 6c 2e 20 49 66 20 65 72 72 6f 72 73 20 0a  nal. If errors .
a850: 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 64 75 72      ** occur dur
a860: 69 6e 67 20 74 68 69 73 20 70 72 6f 63 65 73 73  ing this process
a870: 2c 20 69 67 6e 6f 72 65 20 74 68 65 6d 2e 0a 20  , ignore them.. 
a880: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
a890: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a8a0: 20 20 20 20 20 70 61 67 65 72 5f 64 65 6c 6d 61       pager_delma
a8b0: 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20  ster(zMaster);. 
a8c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
a8d0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
a8e0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
a8f0: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
a900: 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
a910: 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
a920: 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
a930: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
a940: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
a950: 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
a960: 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52  ent PAGER_SECTOR
a970: 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65  _SIZE.  ** value
a980: 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
a990: 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
a9a0: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
a9b0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
a9c0: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41  >sectorSize = PA
a9d0: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  GER_SECTOR_SIZE;
a9e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a9f0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
aa00: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
aa10: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
aa20: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
aa30: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
aa40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
aa50: 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a  rnal but with.**
aa60: 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69   a few extra twi
aa70: 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  sts..**.**    (1
aa80: 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  )  The number of
aa90: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
aaa0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
aab0: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20  he start of.**  
aac0: 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65         the state
aad0: 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  ment is stored i
aae0: 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  n pPager->stmtSi
aaf0: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
ab00: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
ab10: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
ab20: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
ab30: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
ab40: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61  ing back the sta
ab50: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  tement journal, 
ab60: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
ab70: 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
ab80: 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
ab90: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
aba0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
abb0: 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
abc0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a  ger->stmtJSize..
abd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
abe0: 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
abf0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
ac00: 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20  {.  off_t szJ;  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac20: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
ac30: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 6f 66   journal */.  of
ac40: 66 5f 74 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  f_t hdrOff;.  in
ac50: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
ac60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ac70: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
ac80: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
ac90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
aca0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
acb0: 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
acc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
acd0: 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
ace0: 55 47 20 0a 20 20 7b 0a 20 20 20 20 6f 66 66 5f  UG .  {.    off_
acf0: 74 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63  t os_szJ;.    rc
ad00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
ad10: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
ad20: 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20  d, &os_szJ);.   
ad30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ad40: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
ad50: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d      assert( szJ=
ad60: 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23  =os_szJ );.  }.#
ad70: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
ad80: 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65  hdrOff to be the
ad90: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 66   offset to the f
ada0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
adb0: 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  der written.  **
adc0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
add0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
ade0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
adf0: 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61  ile if no journa
ae00: 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61  l.  ** header wa
ae10: 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  s written..  */.
ae20: 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65    hdrOff = pPage
ae30: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20  r->stmtHdrOff;. 
ae40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ae50: 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64  >fullSync || !hd
ae60: 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68  rOff );.  if( !h
ae70: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72  drOff ){.    hdr
ae80: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20  Off = szJ;.  }. 
ae90: 20 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65   ..  /* Truncate
aea0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
aeb0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
aec0: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
aed0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
aee0: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
aef0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
af00: 53 69 7a 65 2a 28 6f 66 66 5f 74 29 70 50 61 67  Size*(off_t)pPag
af10: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20  er->stmtSize);. 
af20: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
af30: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
af40: 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65  ze;..  /* Figure
af50: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
af60: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
af70: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
af80: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
af90: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  t( pPager->stmtI
afa0: 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e  nUse && pPager->
afb0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
afc0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
afd0: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
afe0: 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
aff0: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
b000: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
b010: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
b020: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b030: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
b040: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
b050: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
b060: 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
b070: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69  ment journal omi
b080: 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f  ts checksums fro
b090: 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f  m.  ** each reco
b0a0: 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66  rd since power-f
b0b0: 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20  ailure recovery 
b0c0: 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  is not important
b0d0: 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20   to statement.  
b0e0: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ** journals..  *
b0f0: 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31  /.  for(i=nRec-1
b100: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
b110: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
b120: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
b130: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
b140: 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73  stfd, 0);.    as
b150: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
b160: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
b170: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b180: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
b190: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
b1a0: 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65  /* Now roll some
b1b0: 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d   pages back from
b1c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
b1d0: 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e   journal. Pager.
b1e0: 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77  stmtJSize.  ** w
b1f0: 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  as the size of t
b200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b210: 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  when this statem
b220: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c  ent was started,
b230: 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68   so.  ** everyth
b240: 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e  ing after that n
b250: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
b260: 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69  d back, either i
b270: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
b280: 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72  abase, the memor
b290: 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68  y cache, or both
b2a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
b2b0: 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
b2c0: 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64  hen Pager.stmtHd
b2d0: 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73  rOff is the offs
b2e0: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
b2f0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
b300: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
b310: 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20   written during 
b320: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74  this statement t
b330: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
b340: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
b350: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
b360: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  fd, pPager->stmt
b370: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
b380: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b390: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
b3a0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
b3b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b3c0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
b3d0: 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
b3e0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
b3f0: 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
b400: 3b 0a 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52  ;.  assert( JOUR
b410: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
b420: 72 29 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65  r)<(pPager->page
b430: 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69  Size+8) );.  whi
b440: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
b450: 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66  nalOff <= (hdrOf
b460: 66 2d 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f-(pPager->pageS
b470: 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72  ize+8)) ){.    r
b480: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
b490: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
b4a0: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
b4b0: 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
b4c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
b4d0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
b4e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b4f0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
b500: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
b510: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
b520: 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
b530: 20 20 20 75 33 32 20 6e 52 65 63 3b 0a 20 20 20     u32 nRec;.   
b540: 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
b550: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
b560: 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
b570: 20 26 6e 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b   &nRec, &dummy);
b580: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
b590: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b5a0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
b5b0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
b5c0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
b5d0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
b5e0: 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 29     if( nRec==0 )
b5f0: 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
b600: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
b610: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
b620: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
b630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
b640: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26  i=nRec-1; i>=0 &
b650: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
b660: 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29  lOff < szJ; i--)
b670: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
b680: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
b690: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
b6a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
b6b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
b6c0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
b6d0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
b6e0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
b6f0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
b700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
b710: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b720: 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
b730: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
b740: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b750: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
b760: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
b770: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
b780: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b790: 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65  CORRUPT;.  }else
b7a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
b7b0: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
b7c0: 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c      /* pager_rel
b7d0: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
b7e0: 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ); */.  }.  retu
b7f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b800: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
b810: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
b820: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
b830: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
b840: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
b850: 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61   number is the a
b860: 62 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66  bsolute value of
b870: 20 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61   the mxPage para
b880: 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50  meter..** If mxP
b890: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
b8a0: 20 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67   the noSync flag
b8b0: 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e   is also set.  n
b8c0: 6f 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a  oSync bypasses.*
b8d0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
b8e0: 65 33 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65  e3OsSync().  The
b8f0: 20 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68   pager runs much
b900: 20 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53   faster with noS
b910: 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69  ync on,.** but i
b920: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
b930: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
b940: 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62  r there is an ab
b950: 72 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66  rupt power .** f
b960: 61 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61  ailure, the data
b970: 62 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20  base file might 
b980: 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
b990: 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a  consistent and.*
b9a0: 2a 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73  * unrepairable s
b9b0: 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tate.  .*/.void 
b9c0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
b9d0: 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  _cachesize(Pager
b9e0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
b9f0: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
ba00: 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50  age>=0 ){.    pP
ba10: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
ba20: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
ba30: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
ba40: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
ba50: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
ba60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
ba70: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31  ager->noSync = 1
ba80: 3b 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d  ;.    mxPage = -
ba90: 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66  mxPage;.  }.  if
baa0: 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20  ( mxPage>10 ){. 
bab0: 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
bac0: 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65  e = mxPage;.  }e
bad0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
bae0: 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20  >mxPage = 10;.  
baf0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
bb00: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
bb10: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
bb20: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
bb30: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
bb40: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
bb50: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
bb60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
bb70: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
bb80: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
bb90: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
bba0: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
bbb0: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
bbc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
bbd0: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
bbe0: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
bbf0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
bc10: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
bc20: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
bc30: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
bc40: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
bc50: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
bc60: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
bc70: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
bc80: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
bc90: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
bca0: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
bcb0: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
bcd0: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
bce0: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
bcf0: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
bd00: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
bd10: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
bd20: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
bd30: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
bd40: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
bd50: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
bd60: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
bd70: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
bd80: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
bd90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
bda0: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
bdb0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
bdc0: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
bdd0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
bde0: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
bdf0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
be00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
be10: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
be20: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
be30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
be40: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
be60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
be70: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
be80: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
be90: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
bea0: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
beb0: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
bec0: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
bed0: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
bee0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
bef0: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
bf00: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
bf10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
bf20: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
bf30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
bf40: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
bf50: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
bf60: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
bf70: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
bf80: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
bf90: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
bfa0: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
bfb0: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
bfc0: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
bfd0: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
bfe0: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
bff0: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64   FULL=3..*/.void
c000: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
c010: 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50  t_safety_level(P
c020: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
c030: 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67  t level){.  pPag
c040: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
c050: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
c060: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
c070: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
c080: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
c090: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
c0a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
c0b0: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
c0c0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a  eedSync = 0;.}..
c0d0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
c0e0: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72  porary file.  Wr
c0f0: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
c100: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e  the file into zN
c110: 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75  ame.** (zName mu
c120: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 53  st be at least S
c130: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
c140: 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29  IZE bytes long.)
c150: 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66    Write.** the f
c160: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
c170: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
c180: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
c190: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
c1a0: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
c1b0: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
c1c0: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
c1d0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
c1e0: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
c1f0: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
c200: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
c210: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
c220: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
c230: 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f  p(char *zFile, O
c240: 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e  sFile *fd){.  in
c250: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
c260: 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63   rc;.  do{.    c
c270: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
c280: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
c290: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
c2a0: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
c2b0: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66  clusive(zFile, f
c2c0: 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28  d, 1);.  }while(
c2d0: 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51   cnt>0 && rc!=SQ
c2e0: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
c2f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
c300: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c310: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
c320: 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
c330: 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
c340: 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
c350: 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
c360: 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
c370: 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
c380: 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
c390: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
c3a0: 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
c3b0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
c3c0: 33 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64  3pager_get() and
c3d0: 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
c3e0: 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
c3f0: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
c400: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
c410: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
c420: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
c430: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
c440: 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
c450: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
c460: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
c470: 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
c480: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
c490: 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c  d.  The file wil
c4a0: 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  l be deleted.** 
c4b0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
c4c0: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
c4d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
c4e0: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
c4f0: 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72  " then all infor
c500: 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
c510: 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69  n cache..** It i
c520: 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
c530: 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63  to disk.  This c
c540: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
c550: 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e  plement an.** in
c560: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
c570: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c580: 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61  pager_open(.  Pa
c590: 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
c5a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
c5b0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
c5c0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
c5d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
c5e0: 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
c5f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
c600: 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
c610: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
c620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
c630: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
c640: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
c650: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
c660: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 20 20 20 20   useJournal     
c670: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f        /* TRUE to
c680: 20 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   use a rollback 
c690: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
c6a0: 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  file */.){.  Pag
c6b0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68  er *pPager;.  ch
c6c0: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
c6d0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d  e = 0;.  int nam
c6e0: 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66  eLen;.  OsFile f
c6f0: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
c700: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
c710: 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
c720: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
c730: 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
c740: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61  dOnly = 0;.  cha
c750: 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
c760: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a  EMPNAME_SIZE];..
c770: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
c780: 20 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c    memset(&fd, 0,
c790: 20 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20   sizeof(fd));.  
c7a0: 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  if( sqlite3_mall
c7b0: 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  oc_failed ){.   
c7c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c7d0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
c7e0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
c7f0: 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
c800: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
c810: 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
c820: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
c830: 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
c840: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
c850: 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b  qliteStrDup("");
c860: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c870: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
c880: 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  {.      zFullPat
c890: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
c8a0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
c8b0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
c8c0: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
c8d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
c8e0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
c8f0: 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61  eadWrite(zFullPa
c900: 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65  thname, &fd, &re
c910: 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d  adOnly);.      }
c920: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
c930: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c940: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
c950: 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20  Temp, &fd);.    
c960: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
c970: 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  p;.    zFullPath
c980: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
c990: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
c9a0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
c9b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c9c0: 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65  {.      tempFile
c9d0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
c9e0: 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68    if( !zFullPath
c9f0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  name ){.    sqli
ca00: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
ca10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ca20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
ca30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ca40: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
ca50: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
ca60: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
ca70: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
ca80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
ca90: 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
caa0: 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  en(zFullPathname
cab0: 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  );.  pPager = sq
cac0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
cad0: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61  of(*pPager) + na
cae0: 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a  meLen*3 + 30 );.
caf0: 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20    if( pPager==0 
cb00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
cb10: 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20  Close(&fd);.    
cb20: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
cb30: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
cb40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cb50: 45 4d 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 50 41  EM;.  }.  SET_PA
cb60: 47 45 52 28 70 50 61 67 65 72 29 3b 0a 20 20 70  GER(pPager);.  p
cb70: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
cb80: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
cb90: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
cba0: 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
cbb0: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
cbc0: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50  nameLen+1];.  pP
cbd0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
cbe0: 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
cbf0: 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  tory[nameLen+1];
cc00: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
cc10: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75  ->zFilename, zFu
cc20: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
cc30: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  trcpy(pPager->zD
cc40: 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50  irectory, zFullP
cc50: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  athname);.  for(
cc60: 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26  i=nameLen; i>0 &
cc70: 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
cc80: 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
cc90: 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
cca0: 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
ccb0: 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
ccc0: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
ccd0: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c  >zJournal, zFull
cce0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c  Pathname);.  sql
ccf0: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
cd00: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
cd10: 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
cd20: 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a  al[nameLen], "-j
cd30: 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67  ournal");.  pPag
cd40: 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 23 69 66  er->fd = fd;.#if
cd50: 20 4f 53 5f 55 4e 49 58 0a 20 20 70 50 61 67 65   OS_UNIX.  pPage
cd60: 72 2d 3e 66 64 2e 70 50 61 67 65 72 20 3d 20 70  r->fd.pPager = p
cd70: 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20  Pager;.#endif.  
cd80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cd90: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
cda0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
cdb0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
cdc0: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
cdd0: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
cde0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
cdf0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
ce00: 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 50 61  >nRef = 0;.  pPa
ce10: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65  ger->dbSize = me
ce20: 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d  mDb-1;.  pPager-
ce30: 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49  >pageSize = SQLI
ce40: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
ce50: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
ce60: 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20  stmtSize = 0;.  
ce70: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
ce80: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
ce90: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
cea0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
ceb0: 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  00;.  pPager->st
cec0: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
ced0: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  CK;.  pPager->er
cee0: 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  rMask = 0;.  pPa
cef0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
cf00: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
cf10: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
cf20: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
cf30: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
cf40: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
cf50: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
cf60: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
cf70: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
cf80: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
cf90: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
cfa0: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
cfb0: 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
cfc0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
cfd0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
cfe0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
cff0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
d000: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
d010: 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61   = nExtra;.  pPa
d020: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
d030: 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  = PAGER_SECTOR_S
d040: 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  IZE;.  pPager->p
d050: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
d060: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
d070: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
d080: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
d090: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
d0a0: 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
d0b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d0c0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
d0d0: 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
d0e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
d0f0: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75  ite3pager_set_bu
d100: 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
d110: 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
d120: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
d130: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
d140: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
d150: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
d160: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
d170: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
d180: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
d190: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
d1a0: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
d1b0: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
d1c0: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
d1d0: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
d1e0: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
d1f0: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
d200: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
d210: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
d220: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
d230: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
d240: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
d250: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
d260: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
d270: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70   result sqlite3p
d280: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
d290: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
d2a0: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
d2b0: 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  y sqlite3pager_u
d2c0: 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nref()..*/.void 
d2d0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
d2e0: 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  _destructor(Page
d2f0: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
d300: 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69  (*xDesc)(void*,i
d310: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
d320: 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44  xDestructor = xD
d330: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  esc;.}../*.** Se
d340: 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
d350: 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
d360: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
d370: 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
d380: 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
d390: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
d3a0: 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
d3b0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
d3c0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
d3d0: 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72  .** value as a r
d3e0: 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62  esult of a rollb
d3f0: 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61  ack.  The callba
d400: 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d  ck gives higher-
d410: 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e  level code.** an
d420: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
d430: 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
d440: 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72  A section to agr
d450: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
d460: 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74  ored.** page dat
d470: 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
d480: 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e  e3pager_set_rein
d490: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
d4a0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
d4b0: 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  it)(void*,int)){
d4c0: 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
d4d0: 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
d4e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
d4f0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
d500: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
d510: 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 63 68 61  must only be cha
d520: 6e 67 65 64 20 77 68 65 6e 20 74 68 65 20 63 61  nged when the ca
d530: 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  che is empty..*/
d540: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
d550: 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28  er_set_pagesize(
d560: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
d570: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
d580: 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
d590: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
d5a0: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
d5b0: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 70 50 61  GE_SIZE );.  pPa
d5c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
d5d0: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
d5e0: 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
d5f0: 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
d600: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
d610: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
d620: 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
d630: 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4e  st points to.  N
d640: 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
d650: 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69   is done..*/.voi
d660: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  d sqlite3pager_r
d670: 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28 50  ead_fileheader(P
d680: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
d690: 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
d6a0: 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65  ar *pDest){.  me
d6b0: 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
d6c0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
d6d0: 3e 6d 65 6d 44 62 3d 3d 30 20 29 7b 0a 20 20 20  >memDb==0 ){.   
d6e0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
d6f0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
d700: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65 61      sqlite3OsRea
d710: 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  d(&pPager->fd, p
d720: 44 65 73 74 2c 20 4e 29 3b 0a 20 20 7d 0a 7d 0a  Dest, N);.  }.}.
d730: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
d740: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
d750: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
d760: 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61  isk file associa
d770: 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67  ted with.** pPag
d780: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
d790: 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
d7a0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
d7b0: 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61  {.  off_t n;.  a
d7c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
d7d0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
d7e0: 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
d7f0: 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
d800: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ->dbSize;.  }.  
d810: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
d820: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66  eSize(&pPager->f
d830: 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f  d, &n)!=SQLITE_O
d840: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
d850: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
d860: 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20  R_ERR_DISK;.    
d870: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d880: 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
d890: 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50  eSize;.  if( !pP
d8a0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 6e  ager->memDb && n
d8b0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
d8c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
d8d0: 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
d8e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
d8f0: 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
d900: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
d910: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d  >dbSize = n;.  }
d920: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
d930: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
d940: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
d950: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
d960: 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f  nal(Pager*);.../
d970: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61  *.** Unlink a pa
d980: 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
d990: 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
d9a0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65  of all pages whe
d9b0: 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61  re nRef==0).** a
d9c0: 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  nd from its hash
d9d0: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
d9e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d9f0: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64   unlinkPage(PgHd
da00: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
da10: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
da20: 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65  pPager;..  /* Ke
da30: 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e  ep the pFirstSyn
da40: 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ced pointer poin
da50: 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73  ting at the firs
da60: 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70  t synchronized p
da70: 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  age */.  if( pPg
da80: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
da90: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
daa0: 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
dab0: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69  extFree;.    whi
dac0: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
dad0: 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
dae0: 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
daf0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
db00: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
db10: 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
db20: 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
db30: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
db40: 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
db50: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
db60: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
db70: 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  xtFree;.  }else{
db80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
db90: 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67  ger->pFirst==pPg
dba0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
dbb0: 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
dbc0: 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69  extFree;.  }.  i
dbd0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
dbe0: 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  e ){.    pPg->pN
dbf0: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
dc00: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
dc10: 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
dc20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
dc30: 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
dc40: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
dc50: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
dc60: 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ee;.  }.  pPg->p
dc70: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
dc80: 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a  pPrevFree = 0;..
dc90: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
dca0: 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
dcb0: 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  able */.  if( pP
dcc0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
dcd0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
dce0: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
dcf0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
dd00: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
dd10: 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
dd20: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
dd30: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
dd40: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65  >pNextHash;.  }e
dd50: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d  lse{.    int h =
dd60: 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d   pager_hash(pPg-
dd70: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
dd80: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
dd90: 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20  h[h]==pPg );.   
dda0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
ddb0: 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
ddc0: 73 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  sh;.  }.  pPg->p
ddd0: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
dde0: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
ddf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
de00: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
de10: 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d  truncate an in-m
de20: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
de30: 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70   Delete.** all p
de40: 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20  ages whose pgno 
de50: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
de60: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
de70: 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
de80: 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64  d..** Referenced
de90: 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68   pages larger th
dea0: 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
deb0: 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f  e are zeroed..*/
dec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
ded0: 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65  oryTruncate(Page
dee0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
def0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64  Hdr *pPg;.  PgHd
df00: 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20  r **ppPg;.  int 
df10: 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
df20: 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67  >dbSize;..  ppPg
df30: 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c   = &pPager->pAll
df40: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
df50: 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20  = *ppPg)!=0 ){. 
df60: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
df70: 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  <=dbSize ){.    
df80: 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
df90: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
dfa0: 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  se if( pPg->nRef
dfb0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
dfc0: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
dfd0: 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
dfe0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
dff0: 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
e000: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
e010: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67  lse{.      *ppPg
e020: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
e030: 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
e040: 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  ge(pPg);.      s
e050: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
e060: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
e070: 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
e080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
e090: 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
e0a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e0b0: 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
e0c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
e0d0: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
e0e0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
e0f0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
e100: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
e110: 62 53 69 7a 65 3c 30 20 29 7b 0a 20 20 20 20 73  bSize<0 ){.    s
e120: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
e130: 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
e140: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
e150: 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
e160: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
e170: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
e180: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e190: 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
e1a0: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
e1b0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
e1c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e1d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
e1e0: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
e1f0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
e200: 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f   nPage;.    memo
e210: 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
e220: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  r);.    return S
e230: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e240: 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
e250: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
e260: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e270: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
e280: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
e290: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50  e3OsTruncate(&pP
e2a0: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
e2b0: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6f 66 66 5f  ->pageSize*(off_
e2c0: 74 29 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20  t)nPage);.  if( 
e2d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e2e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
e2f0: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d  ize = nPage;.  }
e300: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e310: 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
e320: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
e330: 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
e340: 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
e350: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
e360: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
e370: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
e380: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
e390: 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
e3a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
e3b0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
e3c0: 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
e3d0: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
e3e0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
e3f0: 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
e400: 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
e410: 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
e420: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
e430: 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
e440: 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
e450: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
e460: 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
e470: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
e480: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e490: 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65  pager_close(Page
e4a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
e4b0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
e4c0: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50 61 67  ;.  switch( pPag
e4d0: 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20  er->state ){.   
e4e0: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53 45   case PAGER_RESE
e4f0: 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50  RVED:.    case P
e500: 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20  AGER_SYNCED: .  
e510: 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58 43    case PAGER_EXC
e520: 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20  LUSIVE: {.      
e530: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
e540: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
e550: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
e560: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
e570: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
e580: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
e590: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
e5a0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
e5b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e5c0: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pen==0 );.      
e5d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e5e0: 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52   case PAGER_SHAR
e5f0: 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ED: {.      if( 
e600: 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
e610: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e620: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
e630: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
e640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e660: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
e670: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
e680: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
e690: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
e6a0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
e6b0: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
e6c0: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
e6d0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
e6e0: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
e6f0: 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
e700: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
e710: 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
e720: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
e730: 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
e740: 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
e750: 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
e760: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e770: 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
e780: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
e790: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
e7a0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
e7b0: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
e7c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
e7d0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64  lose(&pPager->fd
e7e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e7f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
e800: 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ==0 );.  /* Temp
e810: 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
e820: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
e830: 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
e840: 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
e850: 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
e860: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
e870: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
e880: 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 20  );.  ** }.  */. 
e890: 20 43 4c 52 5f 50 41 47 45 52 28 70 50 61 67 65   CLR_PAGER(pPage
e8a0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
e8b0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68  ->zFilename!=(ch
e8c0: 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 20 29  ar*)&pPager[1] )
e8d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
e8e0: 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
e8f0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ppen */.    sqli
e900: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
e910: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
e920: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
e930: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
e940: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
e950: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b  er->zDirectory);
e960: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
e970: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
e980: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e990: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e9a0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
e9b0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
e9c0: 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
e9d0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
e9e0: 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
e9f0: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
ea00: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
ea10: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
ea20: 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
ea30: 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
ea40: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
ea50: 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
ea60: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
ea70: 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
ea80: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
ea90: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
eaa0: 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
eab0: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
eac0: 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
ead0: 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
eae0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
eaf0: 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
eb00: 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
eb10: 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
eb20: 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
eb30: 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
eb40: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
eb50: 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
eb60: 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
eb70: 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
eb80: 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
eb90: 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
eba0: 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
ebb0: 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
ebc0: 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
ebd0: 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
ebe0: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
ebf0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
ec00: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
ec10: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
ec20: 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
ec30: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
ec40: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
ec50: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
ec60: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
ec70: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
ec80: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
ec90: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
eca0: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
ecb0: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
ecc0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
ecd0: 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
ece0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
ecf0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
ed00: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
ed10: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
ed20: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
ed30: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
ed40: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
ed50: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
ed60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ed70: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
ed80: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
ed90: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
eda0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
edb0: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
edc0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
edd0: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
ede0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
edf0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
ee00: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
ee10: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
ee20: 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
ee30: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
ee40: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
ee50: 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
ee60: 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
ee70: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
ee80: 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
ee90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eea0: 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
eeb0: 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50        REFINFO(pP
eec0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  g);.    }.  }.#e
eed0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
eee0: 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d  e_ref(P)   ((P)-
eef0: 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72  >nRef==0?_page_r
ef00: 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d  ef(P):(void)(P)-
ef10: 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a  >nRef++).#endif.
ef20: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
ef30: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
ef40: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
ef50: 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
ef60: 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
ef70: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
ef80: 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
ef90: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28  qlite3pager_ref(
efa0: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
efb0: 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
efc0: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
efd0: 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  );.  page_ref(pP
efe0: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
eff0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
f000: 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
f010: 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
f020: 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
f030: 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
f040: 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
f050: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
f060: 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
f070: 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
f080: 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
f090: 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f   disk.  It is no
f0a0: 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79  t safe to modify
f0b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
f0c0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
f0d0: 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a  l after.** the j
f0e0: 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
f0f0: 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20  synced.  If the 
f100: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f110: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65  e is modified be
f120: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fore.** the jour
f130: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e  nal is synced an
f140: 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  d a power failur
f150: 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e  e occurs, the un
f160: 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a  synced journal.*
f170: 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20  * data would be 
f180: 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c  lost and we woul
f190: 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63  d be unable to c
f1a0: 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61  ompletely rollba
f1b0: 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
f1c0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74  se changes.  Dat
f1d0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
f1e0: 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a   would occur..**
f1f0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
f200: 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74  e also updates t
f210: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
f220: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
f230: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28  he journal..** (
f240: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
f250: 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
f260: 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
f270: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
f280: 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20  rmation.).** If 
f290: 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73  the sync mode is
f2a0: 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73   FULL, two syncs
f2b0: 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69   will occur.  Fi
f2c0: 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  rst the whole jo
f2d0: 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63  urnal.** is sync
f2e0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65  ed, then the nRe
f2f0: 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
f300: 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e  ed, then a secon
f310: 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  d sync occurs..*
f320: 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
f330: 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65  ry databases, we
f340: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20   do not care if 
f350: 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  we are able to r
f360: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72  ollback.** after
f370: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
f380: 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  , so sync occurs
f390: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f3a0: 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
f3b0: 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f  needSync field o
f3c0: 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72  f every page cur
f3d0: 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20  rent held in.** 
f3e0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
f3f0: 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
f400: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
f410: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
f420: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f430: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
f440: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
f450: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
f460: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
f470: 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
f480: 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
f490: 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
f4a0: 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
f4b0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
f4c0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
f4d0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
f4e0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
f4f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f500: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
f510: 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
f520: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
f530: 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
f540: 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
f550: 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
f560: 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
f570: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
f580: 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
f590: 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
f5a0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
f5b0: 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
f5c0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
f5d0: 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
f5e0: 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
f5f0: 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
f600: 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
f610: 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
f620: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
f630: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f640: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
f650: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 6a 53 7a         off_t jSz
f660: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
f670: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
f680: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
f690: 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
f6a0: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
f6b0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
f6c0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
f6d0: 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a  rnalOff==jSz );.
f6e0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
f6f0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
f700: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
f710: 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
f720: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
f730: 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
f740: 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
f750: 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
f760: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
f770: 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
f780: 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
f790: 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
f7a0: 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
f7b0: 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
f7c0: 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
f7d0: 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
f7e0: 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
f7f0: 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
f800: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f810: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
f820: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
f830: 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
f840: 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
f850: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
f860: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f870: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
f880: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
f890: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
f8a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
f8b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f8c0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
f8d0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
f8e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
f8f0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
f900: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
f910: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
f920: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
f930: 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20  pPager->nRec);. 
f940: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
f950: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
f960: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
f970: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
f980: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f990: 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
f9a0: 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
f9b0: 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
f9c0: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
f9d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f9e0: 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
f9f0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
fa00: 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
fa10: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67  n rc;.      pPag
fa20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
fa30: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
fa40: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
fa50: 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
fa60: 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
fa70: 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
fa80: 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
fa90: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
faa0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
fab0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
fac0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
fad0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
fae0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
faf0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
fb00: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
fb10: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
fb20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
fb30: 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
fb40: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
fb50: 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
fb60: 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
fb70: 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
fb80: 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
fb90: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
fba0: 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
fbb0: 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
fbc0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
fbd0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
fbe0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
fbf0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
fc00: 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
fc10: 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
fc20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
fc30: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
fc40: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
fc50: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
fc60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fc70: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
fc80: 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
fc90: 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
fca0: 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
fcb0: 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
fcc0: 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
fcd0: 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
fce0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
fcf0: 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
fd00: 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
fd10: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
fd20: 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
fd30: 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
fd40: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
fd50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
fd60: 20 62 75 73 79 20 3d 20 31 3b 0a 0a 20 20 69 66   busy = 1;..  if
fd70: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
fd80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fd90: 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
fda0: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
fdb0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
fdc0: 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
fdd0: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
fde0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
fdf0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
fe00: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
fe10: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
fe20: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
fe30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
fe40: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
fe50: 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
fe60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
fe70: 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
fe80: 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
fe90: 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
fea0: 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
feb0: 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
fec0: 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
fed0: 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
fee0: 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
fef0: 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
ff00: 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
ff10: 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
ff20: 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
ff30: 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
ff40: 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
ff50: 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
ff60: 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
ff70: 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
ff80: 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
ff90: 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
ffa0: 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
ffb0: 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
ffc0: 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
ffd0: 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
ffe0: 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
fff0: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
10000 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
10010 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
10020 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
10030 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
10040 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
10050 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
10060 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
10070 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
10080 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
10090 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
100a0 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
100b0 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
100c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
100d0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
100e0 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
100f0 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
10100 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
10110 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64  ayback..  */.  d
10120 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  o {.    rc = sql
10130 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
10140 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
10150 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68 69 6c  E_LOCK);.  }whil
10160 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
10170 53 59 20 26 26 20 0a 20 20 20 20 20 20 70 50 61  SY && .      pPa
10180 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
10190 72 20 26 26 20 0a 20 20 20 20 20 20 70 50 61 67  r && .      pPag
101a0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
101b0 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20  ->xFunc && .    
101c0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
101d0 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50  andler->xFunc(pP
101e0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
101f0 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b  er->pArg, busy++
10200 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ).  );.  if( rc!
10210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10220 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10230 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
10240 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
10250 56 45 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c  VE;..  while( pL
10260 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
10270 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
10280 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
10290 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
102a0 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
102b0 29 2a 28 6f 66 66 5f 74 29 70 50 61 67 65 72 2d  )*(off_t)pPager-
102c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
102d0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
102e0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
102f0 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
10300 20 36 29 3b 0a 20 20 20 20 54 52 41 43 45 32 28   6);.    TRACE2(
10310 22 53 54 4f 52 45 20 70 61 67 65 20 25 64 5c 6e  "STORE page %d\n
10320 22 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ", pList->pgno);
10330 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10340 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
10350 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
10360 41 54 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67  ATA(pList), pPag
10370 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
10380 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
10390 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
103a0 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
103b0 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  no, 0);.    if( 
103c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
103d0 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
103e0 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20   = 0;.    pList 
103f0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
10400 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10410 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10420 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
10430 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
10440 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
10450 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
10460 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
10470 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
10480 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
10490 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
104a0 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
104b0 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
104c0 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
104d0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
104e0 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
104f0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c  er){.  PgHdr *p,
10500 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
10510 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50   = 0;.  for(p=pP
10520 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
10530 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
10540 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20     if( p->dirty 
10550 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72  ){.      p->pDir
10560 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ty = pList;.    
10570 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20    pList = p;.   
10580 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10590 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
105a0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
105b0 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
105c0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
105d0 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
105e0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
105f0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
10600 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
10610 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
10620 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
10630 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
10640 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
10650 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
10660 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
10670 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
10680 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
10690 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
106a0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
106b0 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
106c0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
106d0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
106e0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
106f0 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
10700 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
10710 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
10720 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
10730 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
10740 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
10750 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
10760 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
10770 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
10780 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
10790 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
107a0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
107b0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
107c0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
107d0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
107e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
107f0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
10800 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
10810 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
10820 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
10830 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
10840 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
10850 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
10860 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
10870 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
10880 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
10890 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
108a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
108b0 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
108c0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
108d0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
108e0 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
108f0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
10900 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
10910 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
10920 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
10930 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
10940 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
10950 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
10960 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
10970 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
10980 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
10990 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
109a0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
109b0 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
109c0 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
109d0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
109e0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
109f0 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  e3pager_get(Page
10a00 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
10a10 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
10a20 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
10a30 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
10a40 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
10a50 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
10a60 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
10a70 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
10a80 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
10a90 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
10aa0 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
10ab0 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
10ac0 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
10ad0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
10ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
10af0 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
10b00 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
10b10 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
10b20 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
10b30 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
10b40 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
10b50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10b60 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
10b70 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
10b80 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
10b90 29 7b 0a 20 20 20 20 69 6e 74 20 62 75 73 79 20  ){.    int busy 
10ba0 3d 20 31 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  = 1;.    do {.  
10bb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10bc0 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
10bd0 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
10be0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
10bf0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
10c00 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
10c10 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26  ->pBusyHandler &
10c20 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
10c30 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
10c40 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20  >xFunc && .     
10c50 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
10c60 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70  Handler->xFunc(p
10c70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
10c80 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b  ler->pArg, busy+
10c90 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  +).    );.    if
10ca0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10cb0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10cc0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
10cd0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
10ce0 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 20  GER_SHARED;..   
10cf0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
10d00 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
10d10 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
10d20 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
10d30 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
10d40 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
10d50 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
10d60 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
10d70 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
10d80 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
10d90 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
10da0 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
10db0 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
10dc0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
10dd0 26 26 0a 20 20 20 20 20 20 20 20 21 73 71 6c 69  &&.        !sqli
10de0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
10df0 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  edLock(&pPager->
10e00 66 64 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  fd) .    ){.    
10e10 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
10e20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
10e30 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
10e40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10e50 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
10e60 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a 20  it is.       ** 
10e70 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
10e80 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
10e90 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
10ea0 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
10eb0 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  .       ** EXCLU
10ec0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
10ed0 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
10ee0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
10ef0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  n the.       ** 
10f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
10f10 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
10f20 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
10f30 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
10f40 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
10f50 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
10f60 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
10f70 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
10f80 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20  lling it .      
10f90 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
10fa0 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20 42   ** .       ** B
10fb0 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
10fc0 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
10fd0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
10fe0 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20  uested, the.    
10ff0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
11000 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
11010 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
11020 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
11030 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62   to.       ** ob
11040 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58  tain it's own EX
11050 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
11060 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11070 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e..       */.   
11080 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11090 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
110a0 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
110b0 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  CK);.       if( 
110c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
110d0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
110e0 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
110f0 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
11100 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
11110 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
11120 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
11130 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11140 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
11150 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
11160 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20  R_EXCLUSIVE;..  
11170 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
11180 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
11190 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75  ding only.  Retu
111a0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  rn SQLITE_BUSY i
111b0 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61  f.       ** we a
111c0 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  re unable to ope
111d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
111e0 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20  le. .       **. 
111f0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
11200 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
11210 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
11220 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
11230 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e.       ** jour
11240 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
11250 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68  r open unless th
11260 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
11270 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20  file holds.     
11280 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
11290 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
112a0 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
112b0 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
112c0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
112d0 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  es opening the j
112e0 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61  ournal at the sa
112f0 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  me time..       
11300 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73  */.       rc = s
11310 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
11320 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Only(pPager->zJo
11330 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
11340 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28  jfd);.       if(
11350 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11360 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  {.         sqlit
11370 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
11380 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
11390 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
113a0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
113b0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
113c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
113d0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20  BUSY;.       }. 
113e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
113f0 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
11400 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
11410 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
11420 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
11430 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
11440 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
11450 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
11460 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
11470 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20  urnalHdr = 0;.. 
11480 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
11490 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
114a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
114b0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
114c0 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  te.       ** loc
114d0 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
114e0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
114f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11500 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
11510 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11520 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11560 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
11570 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
11580 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68  for page in cach
11590 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
115a0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
115b0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  er, pgno);.    i
115c0 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
115d0 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
115e0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
115f0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
11600 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
11610 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
11620 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
11630 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
11640 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
11650 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
11660 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
11670 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  h;.    pPager->n
11680 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Miss++;.    if( 
11690 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
116a0 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
116b0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
116c0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  0 || pPager->mem
116d0 44 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  Db ){.      /* C
116e0 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
116f0 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20   */.      pPg = 
11700 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
11710 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
11720 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11730 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20  + sizeof(u32) + 
11760 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20  pPager->nExtra. 
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70               + p
11790 50 61 67 65 72 2d 3e 6d 65 6d 44 62 2a 73 69 7a  Pager->memDb*siz
117a0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
117b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
117c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
117d0 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
117e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
117f0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
11800 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
11810 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
11820 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
11830 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20  GER_ERR_MEM;.   
11840 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11850 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11860 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
11870 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
11880 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg));.      if( 
11890 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
118a0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
118b0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
118c0 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
118d0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
118e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
118f0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
11900 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
11910 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
11920 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
11930 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
11940 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
11950 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
11960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
11970 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
11980 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
11990 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
119a0 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  at does not.    
119b0 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
119c0 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
119d0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
119e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
119f0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
11a00 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20  irstSynced;..   
11a10 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c     /* If we coul
11a20 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
11a30 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
11a40 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
11a50 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  ().      ** on t
11a60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11a70 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
11a80 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
11a90 69 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a  is is a.      **
11aa0 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
11ab0 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
11ac0 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
11ad0 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
11ae0 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  s.      ** it ca
11af0 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
11b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
11b10 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
11b20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
11b30 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
11b40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11b50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
11b60 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
11b70 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
11b80 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11b90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
11ba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11bb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
11bc0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
11bd0 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
11be0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
11bf0 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
11c00 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
11c10 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
11c20 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
11c30 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
11c40 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
11c50 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65 72 20  al..  ** header 
11c60 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
11c70 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
11c80 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
11c90 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65 61 64  ave..  ** alread
11ca0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
11cb0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
11cc0 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64  in case the head
11cd0 65 72 20 69 73 0a 09 20 20 2a 2a 20 74 72 61 73  er is..  ** tras
11ce0 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
11cf0 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
11d00 65 64 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ed)..          *
11d10 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  /.          pPag
11d20 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
11d30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11d50 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
11d60 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
11d70 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
11d80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
11d90 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
11da0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
11db0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
11dc0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
11dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11de0 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ERR;.          }
11df0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11e00 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
11e10 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d  >pFirst;.      }
11e20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11e30 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
11e40 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
11e50 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  he page to the d
11e60 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
11e70 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20  it is dirty..   
11e80 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
11e90 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
11ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
11eb0 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
11ec0 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  ;.        pPg->p
11ed0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
11ee0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
11ef0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50  ite_pagelist( pP
11f00 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  g );.        if(
11f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11f20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11f30 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
11f40 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
11f50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11f60 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
11f70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11f80 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
11f90 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  irty==0 );..    
11fa0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
11fb0 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
11fc0 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
11fd0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
11fe0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  hen.      ** set
11ff0 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
12000 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
12010 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
12020 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
12030 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ite_dont_rollbac
12040 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
12050 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
12060 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
12070 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  n..      ** It i
12080 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
12090 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
120a0 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
120b0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
120c0 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
120d0 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
120e0 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
120f0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
12100 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20  n't remember.   
12110 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61     ** that is wa
12120 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
12130 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
12140 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
12150 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ges must.      *
12160 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
12170 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
12180 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
12190 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
121a0 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
121b0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
121c0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
121d0 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
121e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
121f0 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
12200 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
12210 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
12220 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ash table.      
12230 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  */.      unlinkP
12240 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
12250 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b  pPager->nOvfl++;
12260 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
12270 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
12280 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
12290 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
122a0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
122b0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
122c0 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65    sqlite3CheckMe
122d0 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e  mory(pPager->aIn
122e0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29  Journal, pgno/8)
122f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12300 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12310 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pen );.      pPg
12320 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
12330 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
12340 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
12350 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
12360 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
12370 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nc = 0;.    }els
12380 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
12390 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
123a0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
123b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
123c0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
123d0 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  tmt && (int)pgno
123e0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
123f0 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
12400 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  && (pPager->aInS
12410 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  tmt[pgno/8] & (1
12420 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20  <<(pgno&7)))!=0 
12430 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  ){.      page_ad
12440 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
12450 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
12460 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76        page_remov
12470 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
12480 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
12490 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
124a0 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
124b0 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28   1;.    REFINFO(
124c0 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pPg);.    pPager
124d0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20  ->nRef++;.    h 
124e0 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e  = pager_hash(pgn
124f0 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  o);.    pPg->pNe
12500 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
12510 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  >aHash[h];.    p
12520 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
12530 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
12540 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
12550 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12560 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
12570 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
12580 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
12590 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
125a0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
125b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
125c0 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
125d0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
125e0 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
125f0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
12600 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
12610 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
12620 7a 65 3c 30 20 29 20 73 71 6c 69 74 65 33 70 61  ze<0 ) sqlite3pa
12630 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
12640 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
12650 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
12660 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12670 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
12680 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
12690 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
126a0 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
126b0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
126c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
126d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
126e0 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a  ze<(int)pgno ){.
126f0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
12700 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
12710 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
12720 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
12730 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
12740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12750 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
12760 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
12770 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
12780 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66  d, (pgno-1)*(off
12790 5f 74 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  _t)pPager->pageS
127a0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
127b0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
127c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
127d0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
127e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
127f0 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 32 28  );.      TRACE2(
12800 22 46 45 54 43 48 20 70 61 67 65 20 25 64 5c 6e  "FETCH page %d\n
12810 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ", pPg->pgno);. 
12820 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
12830 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
12840 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  (pPg), pPg->pgno
12850 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 3);.      if( 
12860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12870 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66  .        off_t f
12880 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ileSize;.       
12890 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
128a0 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
128b0 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53  fd,&fileSize)!=S
128c0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
128d0 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53          || fileS
128e0 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72  ize>=pgno*pPager
128f0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
12900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
12910 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52  ager_unref(PGHDR
12920 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a  _TO_DATA(pPg));.
12930 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12940 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   rc;.        }el
12950 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
12960 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
12970 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
12980 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
12990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
129a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
129b0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
129c0 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
129d0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
129e0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
129f0 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f  Hit++;.    page_
12a00 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
12a10 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f  *ppPage = PGHDR_
12a20 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
12a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
12a50 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
12a60 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
12a70 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
12a80 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
12a90 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
12aa0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
12ab0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12ac0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
12ad0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
12ae0 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
12af0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
12b00 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  3pager_get().  T
12b10 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
12b20 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
12b30 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
12b40 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20  3pager_get() is 
12b50 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
12b60 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
12b70 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
12b80 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
12b90 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
12ba0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
12bb0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
12bc0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
12bd0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
12be0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
12bf0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
12c00 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
12c10 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
12c20 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
12c30 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
12c40 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
12c50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
12c60 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
12c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
12c80 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  o!=0 );.  if( pP
12c90 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
12ca0 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
12cb0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
12cc0 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70  0;.  }.  pPg = p
12cd0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
12ce0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
12cf0 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
12d00 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
12d10 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg);.  return PG
12d20 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
12d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
12d40 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
12d50 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
12d60 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
12d70 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
12d80 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
12d90 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
12da0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
12db0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
12dc0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
12dd0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
12de0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
12df0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
12e00 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
12e10 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
12e20 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
12e30 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  3pager_unref(voi
12e40 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
12e50 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
12e60 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
12e70 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
12e80 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
12e90 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
12ea0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
12eb0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
12ec0 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
12ed0 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
12ee0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
12ef0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12f00 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
12f10 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
12f20 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
12f30 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
12f40 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
12f50 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
12f60 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
12f70 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
12f80 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
12f90 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
12fa0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
12fb0 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
12fc0 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
12fd0 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
12fe0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
12ff0 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
13000 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
13010 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
13020 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
13030 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
13040 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
13050 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
13060 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
13070 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
13080 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
13090 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
130a0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
130b0 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
130c0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
130d0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
130e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
130f0 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
13100 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
13110 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
13120 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
13130 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
13140 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
13150 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
13160 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
13170 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
13180 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
13190 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
131a0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
131b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
131c0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
131d0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
131e0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
131f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
13200 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
13210 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13220 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
13230 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
13240 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
13250 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
13260 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
13270 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
13280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13290 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
132a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
132b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
132c0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
132d0 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
132e0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
132f0 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
13300 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
13310 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
13320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13330 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
13340 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
13350 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
13360 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
13370 6d 65 6d 44 62 20 29 3b 0a 20 20 61 73 73 65 72  memDb );.  asser
13380 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
13390 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
133a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
133b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
133c0 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
133d0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
133e0 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74 65  rnal );.  sqlite
133f0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
13400 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
13410 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
13420 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
13430 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
13440 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
13450 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
13460 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13470 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
13480 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
13490 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
134a0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
134b0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
134c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
134d0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
134e0 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
134f0 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
13500 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
13510 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  ,pPager->tempFil
13520 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  e);.  pPager->jo
13530 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13540 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
13550 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
13560 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
13570 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
13590 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
135a0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
135b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
135c0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  al = 0;.    sqli
135d0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
135e0 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
135f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
13600 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
13610 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
13620 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71  urn rc;.  }.  sq
13630 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
13640 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  tory(pPager->zDi
13650 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72  rectory, &pPager
13660 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
13670 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
13680 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
13690 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
136a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
136b0 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
136c0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
136d0 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
136e0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
136f0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
13700 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
13710 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
13720 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
13730 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
13740 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
13750 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
13760 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
13770 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
13780 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
13790 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
137a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
137b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
137c0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
137d0 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
137e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
137f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
13800 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
13810 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
13820 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13830 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13840 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
13850 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
13860 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  c;  .}../*.** Ac
13870 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
13880 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
13890 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
138a0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
138b0 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
138c0 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
138d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
138e0 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
138f0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
13900 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
13910 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73  er_rollback() is
13920 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
13930 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
13940 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
13950 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
13960 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73  pager_unref() is
13970 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76   called to on ev
13980 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ery outstanding 
13990 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
139a0 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
139b0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
139c0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
139d0 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66  any open page of
139e0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
139f0 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20   file.  Nothing 
13a00 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68  changes about th
13a10 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75  e page - it is u
13a20 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a  sed merely to.**
13a30 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74   acquire a point
13a40 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
13a50 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73  structure and as
13a60 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72   proof that ther
13a70 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20  e is.** already 
13a80 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
13a90 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
13aa0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61  ** The second pa
13ab0 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
13ac0 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  s how much space
13ad0 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73   in bytes to res
13ae0 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61  erve for a.** ma
13af0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13b00 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74  e-name at the st
13b10 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
13b20 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72  al when it is cr
13b30 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  eated..**.** A j
13b40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
13b50 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73  pened if this is
13b60 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
13b70 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70   file.  For temp
13b80 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20  orary.** files, 
13b90 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74  the opening of t
13ba0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13bb0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
13bc0 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a  l there is an.**
13bd0 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
13be0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
13bf0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rnal..**.** If t
13c00 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
13c10 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20  lready reserved 
13c20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69  for writing, thi
13c30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13c40 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
13c50 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28  ite3pager_begin(
13c60 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
13c70 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
13c80 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
13c90 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
13ca0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
13cb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13cc0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
13cd0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
13ce0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13cf0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
13d00 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
13d10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
13d20 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
13d30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13d40 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
13d50 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
13d60 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
13d70 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13d80 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
13d90 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
13da0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
13db0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
13dc0 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 30 0a     }else{.#if 0.
13dd0 20 20 20 20 20 20 69 6e 74 20 62 75 73 79 20 3d        int busy =
13de0 20 31 3b 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   1;.      do {. 
13df0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13e00 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65  te3OsLock(&pPage
13e10 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
13e20 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 77 68  LOCK);.      }wh
13e30 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
13e40 42 55 53 59 20 26 26 20 0a 20 20 20 20 20 20 20  BUSY && .       
13e50 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
13e60 48 61 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20  Handler && .    
13e70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
13e80 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e  usyHandler->xFun
13e90 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  c && .          
13ea0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
13eb0 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67  dler->xFunc(pPag
13ec0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
13ed0 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a  ->pArg, busy++).
13ee0 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
13ef0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13f00 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
13f10 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
13f20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
13f30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13f40 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 64  .        /* We d
13f50 6f 20 6e 6f 74 20 63 61 6c 6c 20 74 68 65 20 62  o not call the b
13f60 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
13f70 20 77 65 20 66 61 69 6c 20 74 6f 20 67 65 74 20   we fail to get 
13f80 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
13f90 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
13fa0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 77 65 20 6d  only reason we m
13fb0 69 67 68 74 20 66 61 69 6c 20 69 73 20 62 65 63  ight fail is bec
13fc0 61 75 73 65 20 61 6e 6f 74 68 65 72 20 70 72 6f  ause another pro
13fd0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 0a  cess is holding.
13fe0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72          ** the r
13ff0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
14000 75 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f  ut the other pro
14010 63 65 73 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65  cess will not be
14020 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 20   able to.       
14030 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 73 20   ** release its 
14040 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 75 6e  reserved lock un
14050 74 69 6c 20 74 68 69 73 20 70 72 6f 63 65 73 73  til this process
14060 20 72 65 6c 65 61 73 65 73 20 69 74 73 20 73 68   releases its sh
14070 61 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ared.        ** 
14080 6c 6f 63 6b 2e 20 20 53 6f 20 77 65 20 6d 69 67  lock.  So we mig
14090 68 74 20 61 73 20 77 65 6c 6c 20 66 61 69 6c 20  ht as well fail 
140a0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c  in this process,
140b0 20 6c 65 74 20 69 74 20 72 65 6c 65 61 73 65 0a   let it release.
140c0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 73          ** its s
140d0 68 61 72 65 64 20 6c 6f 63 6b 20 73 6f 20 74 68  hared lock so th
140e0 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f  at the other pro
140f0 63 65 73 73 20 63 61 6e 20 63 6f 6d 6d 69 74 2e  cess can commit.
14100 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
14110 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
14130 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
14140 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
14150 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
14160 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
14170 20 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43   TRACE2("TRANSAC
14180 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 70 50 61 67  TION %d\n", pPag
14190 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20  er->fd.h);.     
141a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
141b0 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
141c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
141d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
141e0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
141f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
14200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14210 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14220 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
14230 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
14240 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
14250 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
14260 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
14270 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
14280 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
14290 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
142a0 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
142b0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
142c0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
142d0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
142e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
142f0 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
14300 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
14310 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
14320 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  res a RESERVED l
14330 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
14340 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53  ase.  If the RES
14350 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  ERVED.** lock co
14360 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
14370 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
14380 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
14390 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
143a0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
143b0 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
143c0 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
143d0 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
143e0 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
143f0 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
14400 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
14410 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
14420 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
14430 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
14440 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
14450 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
14460 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
14470 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
14480 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
14490 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
144a0 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
144b0 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
144c0 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
144d0 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
144e0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
144f0 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
14500 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
14510 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e3pager_commit()
14520 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67 65 72   or sqlite3pager
14530 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  _rollback() to.*
14540 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20  * reset..*/.int 
14550 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
14560 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  te(void *pData){
14570 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
14580 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
14590 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
145a0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
145b0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
145c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
145d0 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72   Check for error
145e0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
145f0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20  ger->errMask ){ 
14600 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
14610 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
14620 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
14630 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
14640 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14650 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
14660 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
14670 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
14680 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
14690 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
146a0 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
146b0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
146c0 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
146d0 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
146e0 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
146f0 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  way..  */.  pPg-
14700 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69 66  >dirty = 1;.  if
14710 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
14720 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74   && (pPg->inStmt
14730 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   || pPager->stmt
14740 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20  InUse==0) ){.   
14750 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
14760 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  che = 1;.    ret
14770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14780 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67   }..  /* If we g
14790 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
147a0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
147b0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
147c0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
147d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
147e0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
147f0 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
14800 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a  l.  ** or both..
14810 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73 74 20    **.  ** First 
14820 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
14830 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
14840 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
14850 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61 74 65   and.  ** create
14860 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
14870 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
14880 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
14890 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
148a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
148b0 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74  pager_begin(pDat
148c0 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  a);.  if( rc!=SQ
148d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
148e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
148f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14900 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
14910 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21  ERVED );.  if( !
14920 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14930 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
14940 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
14950 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
14960 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
14970 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14980 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
14990 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
149a0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
149b0 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
149c0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
149d0 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  .  pPager->dirty
149e0 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a  Cache = 1;..  /*
149f0 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
14a00 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
14a10 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
14a20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
14a30 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20  .  ** EXCLUSIVE 
14a40 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
14a50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14a60 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
14a70 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 2a 2a 20  nt page to.  ** 
14a80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14a90 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
14aa0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
14ab0 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  dy..  */.  if( !
14ac0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
14ad0 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  & (pPager->useJo
14ae0 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
14af0 3e 6d 65 6d 44 62 29 20 29 7b 0a 20 20 20 20 69  >memDb) ){.    i
14b00 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
14b10 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
14b20 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
14b30 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20   int szPg;.     
14b40 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20   u32 saved;.    
14b50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
14b60 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 50  mDb ){.        P
14b70 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
14b80 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
14b90 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
14ba0 20 20 20 20 20 20 54 52 41 43 45 32 28 22 4a 4f        TRACE2("JO
14bb0 55 52 4e 41 4c 20 70 61 67 65 20 25 64 5c 6e 22  URNAL page %d\n"
14bc0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
14bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
14be0 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b  ist->pOrig==0 );
14bf0 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
14c00 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
14c10 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
14c20 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
14c30 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
14c40 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
14c50 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
14c60 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
14c70 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
14c80 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14ca0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
14cb0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
14cc0 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
14cd0 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  sum;.        COD
14ce0 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
14cf0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
14d00 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d  .        cksum =
14d10 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
14d20 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
14d30 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
14d40 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 50  saved = *(u32*)P
14d50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
14d60 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
14d70 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28      store32bits(
14d80 63 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50 61 67  cksum, pPg, pPag
14d90 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14da0 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50         szPg = pP
14db0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
14dc0 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33  ;.        store3
14dd0 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c  2bits(pPg->pgno,
14de0 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20   pPg, -4);.     
14df0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14e00 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
14e10 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44  jfd, &((char*)pD
14e20 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b  ata)[-4], szPg);
14e30 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
14e40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73  >journalOff += s
14e50 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 54 52 41  zPg;.        TRA
14e60 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 70 61 67  CE3("JOURNAL pag
14e70 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
14e80 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
14e90 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
14ea0 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
14eb0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
14ec0 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
14ed0 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52      *(u32*)PGHDR
14ee0 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
14ef0 50 61 67 65 72 29 20 3d 20 73 61 76 65 64 3b 0a  Pager) = saved;.
14f00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
14f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14f20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
14f30 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
14f40 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
14f50 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
14f60 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
14f70 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  L;.          ret
14f80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
14f90 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
14fa0 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
14fb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14fc0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
14fd0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
14fe0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
14ff0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
15000 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
15010 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
15020 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
15030 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
15040 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
15050 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
15060 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
15070 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
15080 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
15090 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
150a0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
150b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  ;.          page
150c0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
150d0 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  t(pPg);.        
150e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
150f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
15100 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
15110 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
15120 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
15130 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 54 52 41  oSync;.      TRA
15140 43 45 33 28 22 41 50 50 45 4e 44 20 70 61 67 65  CE3("APPEND page
15150 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
15160 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  n", pPg->pgno, p
15170 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
15180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
15190 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
151a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
151b0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Sync = 1;.    }.
151c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
151d0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
151e0 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
151f0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
15200 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  n it,.  ** then 
15210 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
15220 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
15230 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
15240 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a    Note that.  **
15250 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
15260 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
15270 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
15280 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
15290 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 69 6e 20 74  format.  ** in t
152a0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
152b0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
152c0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2f 0a  he header..  */.
152d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
152e0 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d  mtInUse && !pPg-
152f0 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  >inStmt && (int)
15300 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
15310 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20  r->stmtSize ){. 
15320 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
15330 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
15340 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
15350 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
15360 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
15370 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
15380 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
15390 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
153a0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
153b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
153c0 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b  ist->pStmt==0 );
153d0 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53  .      pHist->pS
153e0 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
153f0 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
15400 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
15410 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
15420 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  t ){.        mem
15430 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  cpy(pHist->pStmt
15440 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
15450 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
15460 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
15470 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53  .      TRACE2("S
15480 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 70 61 67 65  TMT-JOURNAL page
15490 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
154a0 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  o);.    }else{. 
154b0 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
154c0 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
154d0 20 2d 34 29 3b 0a 20 20 20 20 20 20 43 4f 44 45   -4);.      CODE
154e0 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
154f0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
15500 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15510 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
15520 72 2d 3e 73 74 66 64 2c 20 28 28 63 68 61 72 2a  r->stfd, ((char*
15530 29 70 44 61 74 61 29 2d 34 2c 20 70 50 61 67 65  )pData)-4, pPage
15540 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a  r->pageSize+4);.
15550 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53 54        TRACE2("ST
15560 4d 54 2d 4a 4f 55 52 4e 41 4c 20 70 61 67 65 20  MT-JOURNAL page 
15570 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
15580 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
15590 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
155a0 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
155b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
155c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
155d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
155e0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
155f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
15600 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
15610 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
15620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15630 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
15640 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
15650 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
15660 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
15670 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
15680 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
15690 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
156a0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d  ->pgno&7);.    }
156b0 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f  .    page_add_to
156c0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
156d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
156e0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
156f0 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
15700 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
15710 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
15720 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
15730 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
15740 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
15750 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
15760 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  Db && pPager->db
15770 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
15780 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
15790 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
157a0 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
157b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
157c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
157d0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
157e0 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
157f0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
15800 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
15810 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
15820 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20  pager_write().  
15830 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
15840 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
15850 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
15860 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
15870 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
15880 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
15890 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f  r_iswriteable(vo
158a0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
158b0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
158c0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
158d0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64  .  return pPg->d
158e0 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
158f0 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
15900 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  nt of a single p
15910 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66  age with the inf
15920 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
15930 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
15940 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
15950 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65  3pager_overwrite
15960 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15970 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
15980 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20  *pData){.  void 
15990 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63  *pPage;.  int rc
159a0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
159b0 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
159c0 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29  r, pgno, &pPage)
159d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
159e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
159f0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
15a00 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
15a10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15a20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
15a30 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c  py(pPage, pData,
15a40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15a50 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
15a60 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
15a70 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
15a80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15a90 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
15aa0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
15ab0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
15ac0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
15ad0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
15ae0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
15af0 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61  n page "pgno" ba
15b00 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
15b10 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
15b20 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
15b30 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
15b40 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  y..**.** The ove
15b50 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
15b60 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
15b70 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
15b80 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
15b90 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
15ba0 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
15bb0 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
15bc0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
15bd0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
15be0 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
15bf0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
15c00 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
15c10 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
15c20 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
15c30 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
15c40 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
15c50 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
15c60 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
15c70 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
15c80 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
15c90 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
15ca0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
15cb0 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
15cc0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
15cd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15ce0 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77  led, set the alw
15cf0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
15d00 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62   to true..** Sub
15d10 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
15d20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
15d30 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
15d40 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
15d50 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
15d60 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
15d70 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
15d80 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
15d90 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
15da0 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
15db0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
15dc0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
15dd0 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
15de0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
15df0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
15e00 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
15e10 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
15e20 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
15e30 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
15e40 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
15e50 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
15e60 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
15e70 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
15e80 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
15e90 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
15ea0 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
15eb0 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  * the dont_rollb
15ec0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
15ed0 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
15ee0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63  cause the page c
15ef0 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69  ontains.** criti
15f00 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
15f10 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
15f20 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65  re it gets rolle
15f30 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a  d back in spite.
15f40 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72  ** of the dont_r
15f50 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
15f60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
15f70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28  ager_dont_write(
15f80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
15f90 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
15fa0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
15fb0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20  pPager->memDb ) 
15fc0 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d  return;..  pPg =
15fd0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
15fe0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  ager, pgno);.  p
15ff0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
16000 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
16010 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20  g && pPg->dirty 
16020 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
16030 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
16040 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
16050 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
16060 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
16070 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
16080 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
16090 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
160a0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
160b0 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
160c0 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
160d0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
160e0 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
160f0 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
16100 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
16110 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
16120 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
16130 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
16140 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
16150 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
16160 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
16170 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
16180 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
16190 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
161a0 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
161b0 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
161c0 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
161d0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
161e0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
161f0 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
16200 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
16210 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
16220 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
16230 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
16240 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
16250 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
16260 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
16270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41  }else{.      TRA
16280 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE3("DONT_WRITE 
16290 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
162a0 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e  , pgno, pPager->
162b0 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 70 50 67  fd.h);.      pPg
162c0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
162d0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
162e0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
162f0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
16300 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
16310 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
16320 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
16330 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
16340 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
16350 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
16360 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
16370 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
16380 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
16390 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
163a0 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
163b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
163c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
163d0 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
163e0 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
163f0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
16400 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
16410 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
16420 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
16430 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
16440 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
16450 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
16460 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
16470 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  en==0 ) return;.
16480 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
16490 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
164a0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
164b0 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d  ack || pPager->m
164c0 65 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 20  emDb ) return;. 
164d0 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
164e0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
164f0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
16500 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
16510 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16520 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
16530 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
16540 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
16550 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
16560 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
16570 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
16580 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
16590 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
165a0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
165b0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
165c0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
165d0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
165e0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
165f0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
16600 20 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44   }.    TRACE3("D
16610 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67  ONT_ROLLBACK pag
16620 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
16630 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72  Pg->pgno, pPager
16640 2d 3e 66 64 2e 68 29 3b 0a 20 20 7d 0a 20 20 69  ->fd.h);.  }.  i
16650 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
16660 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
16670 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
16680 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
16690 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
166a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
166b0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
166c0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
166d0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
166e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
166f0 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
16700 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
16710 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
16720 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
16730 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f  no&7);.    page_
16740 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
16750 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  (pPg);.  }.}.../
16760 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
16770 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
16780 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
16790 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
167a0 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
167b0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
167c0 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
167d0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
167e0 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
167f0 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
16800 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  >pStmt = 0;.}../
16810 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
16820 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
16830 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65  atabase and rele
16840 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
16850 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
16860 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f   commit fails fo
16870 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20  r any reason, a 
16880 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74  rollback attempt
16890 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20   is made.** and 
168a0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
168b0 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
168c0 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64  he commit worked
168d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  , SQLITE_OK.** i
168e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
168f0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
16900 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
16910 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
16920 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
16930 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
16940 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52  rMask==PAGER_ERR
16950 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
16960 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  = sqlite3pager_r
16970 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
16980 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
169a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
169b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
169c0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
169d0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
169e0 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
169f0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
16a00 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
16a10 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
16a20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
16a30 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
16a40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16a50 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  E_ERROR;.  }.  T
16a60 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64  RACE2("COMMIT %d
16a70 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
16a80 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
16a90 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ->memDb ){.    p
16aa0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
16ab0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
16ac0 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c  Pager);.    whil
16ad0 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  e( pPg ){.      
16ae0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
16af0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
16b00 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
16b10 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
16b20 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
16b30 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
16b40 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
16b50 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
16b60 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
16b70 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
16b80 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
16b90 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  rty;.    }.#ifnd
16ba0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f  ef NDEBUG.    fo
16bb0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
16bc0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
16bd0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
16be0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
16bf0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
16c00 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
16c10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16c20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  !pPg->alwaysRoll
16c30 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73  back );.      as
16c40 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f  sert( !pHist->pO
16c50 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rig );.      ass
16c60 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74  ert( !pHist->pSt
16c70 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  mt );.    }.#end
16c80 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  if.    pPager->p
16c90 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
16ca0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
16cb0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
16cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16cd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
16ce0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
16cf0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74  0 ){.    /* Exit
16d00 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20   early (without 
16d10 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63  doing the time-c
16d20 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33  onsuming sqlite3
16d30 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a  OsSync() calls).
16d40 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20      ** if there 
16d50 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61  have been no cha
16d60 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
16d70 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
16d80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16d90 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
16da0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
16db0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
16dc0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
16dd0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
16de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16df0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16e00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
16e10 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16e20 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65  pager_sync(pPage
16e30 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  r, 0);.  if( rc!
16e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16e50 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
16e60 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ort;.  }.  rc = 
16e70 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
16e80 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  k(pPager);.  pPa
16e90 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
16ea0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
16eb0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
16ec0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
16ed0 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65  wrong during the
16ee0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
16ef0 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f  .  */.commit_abo
16f00 72 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rt:.  rc = sqlit
16f10 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
16f20 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
16f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16f40 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16f50 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74  _FULL;.  }.  ret
16f60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16f70 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
16f80 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
16f90 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
16fa0 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
16fb0 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
16fc0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
16fd0 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
16fe0 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
16ff0 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
17000 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
17010 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
17020 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
17030 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
17040 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
17050 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
17060 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
17070 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
17080 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  (SQLITE_PROTOCOL
17090 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  ) or unless some
170a0 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
170b0 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
170c0 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
170d0 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
170e0 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
170f0 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
17100 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
17110 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
17120 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
17130 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
17140 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
17150 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
17160 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
17170 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17180 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
17190 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
171a0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
171b0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
171c0 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
171d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
171e0 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61  fd.h);.  if( pPa
171f0 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
17200 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
17210 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
17220 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
17230 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
17240 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
17250 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
17260 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
17270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
17280 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
17290 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
172a0 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
172b0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
172c0 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
172d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
172e0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
172f0 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
17300 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
17310 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
17320 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17330 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
17340 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
17350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
17360 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
17370 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
17380 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
17390 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
173a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
173b0 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22 52         TRACE2("R
173c0 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 5c  OLLBACK-PAGE %d\
173d0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20  n", p->pgno);.  
173e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
173f0 20 20 20 54 52 41 43 45 32 28 22 50 41 47 45 20     TRACE2("PAGE 
17400 25 64 20 69 73 20 63 6c 65 61 6e 5c 6e 22 2c 20  %d is clean\n", 
17410 70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  p->pgno);.      
17420 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
17430 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
17440 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
17450 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
17460 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
17470 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
17480 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74      p->pPrevStmt
17490 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20   = p->pNextStmt 
174a0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
174b0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
174c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
174d0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50  ger->xReiniter(P
174e0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
174f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17500 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
17510 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61    .    }.    pPa
17520 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
17530 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
17540 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  ze = pPager->ori
17550 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d  gDbSize;.    mem
17560 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
17570 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
17580 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
17590 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
175a0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
175b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
175c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
175d0 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
175e0 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
175f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
17600 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
17610 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
17620 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
17630 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
17640 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17650 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
17660 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70  >errMask!=0 && p
17670 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
17680 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
17690 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
176a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
176b0 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
176c0 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
176d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
176e0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
176f0 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
17700 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
17710 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
17720 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
17730 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63   int rc2;.    rc
17740 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f   = pager_reload_
17750 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
17760 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75     rc2 = pager_u
17770 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
17780 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
17790 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
177a0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
177b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
177c0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
177d0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
177e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
177f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
17800 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
17810 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
17820 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
17830 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20  R_CORRUPT;.  }. 
17840 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
17850 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72  = -1;.  return r
17860 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17870 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
17880 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
17890 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
178a0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
178b0 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
178c0 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79  se is (in theory
178d0 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ) writable..*/.i
178e0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
178f0 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  isreadonly(Pager
17900 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
17910 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
17920 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Only;.}../*.** T
17930 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
17940 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
17950 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
17960 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
17970 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 50 61  e3pager_stats(Pa
17980 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
17990 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b  static int a[9];
179a0 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
179b0 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
179c0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
179d0 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
179e0 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
179f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
17a00 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
17a10 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
17a20 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61   = pPager->errMa
17a30 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  sk;.  a[6] = pPa
17a40 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
17a50 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
17a60 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67  s;.  a[8] = pPag
17a70 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74  er->nOvfl;.  ret
17a80 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn a;.}../*.** 
17a90 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  Set the statemen
17aa0 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74  t rollback point
17ab0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
17ac0 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63  tine should be c
17ad0 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  alled with the t
17ae0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
17af0 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70  al already.** op
17b00 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65  en.  A new state
17b10 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
17b20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e  created that can
17b30 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c   be used to roll
17b40 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20  back.** changes 
17b50 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  of a single SQL 
17b60 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61  command within a
17b70 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74   larger transact
17b80 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
17b90 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
17ba0 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
17bb0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
17bc0 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
17bd0 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
17be0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
17bf0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
17c00 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d 54  ;.  TRACE2("STMT
17c10 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 70 50  -BEGIN %d\n", pP
17c20 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69  ager->fd.h);.  i
17c30 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  f( pPager->memDb
17c40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
17c50 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
17c60 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
17c70 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
17c80 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
17c90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17ca0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
17cb0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
17cc0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
17cd0 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
17ce0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17cf0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17d00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17d10 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  pen );.  pPager-
17d20 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74  >aInStmt = sqlit
17d30 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
17d40 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
17d50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
17d60 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
17d70 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
17d80 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
17d90 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65  ED_LOCK);.    re
17da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
17db0 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
17dc0 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
17dd0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
17de0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
17df0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
17e00 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
17e10 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
17e20 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  led;.  assert( p
17e30 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
17e40 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   == pPager->jour
17e50 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66  nalOff );.#endif
17e60 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
17e70 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a  Size = pPager->j
17e80 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
17e90 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
17ea0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
17eb0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
17ec0 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  rOff = 0;.  pPag
17ed0 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20  er->stmtCksum = 
17ee0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
17ef0 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  t;.  if( !pPager
17f00 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
17f10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
17f20 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
17f30 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66  mp, &pPager->stf
17f40 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
17f50 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
17f60 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61  _failed;.    pPa
17f70 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
17f80 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
17f90 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  tmtNRec = 0;.  }
17fa0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
17fb0 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
17fc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
17fd0 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
17fe0 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
17ff0 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  >aInStmt ){.    
18000 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
18010 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->aInStmt);.   
18020 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
18030 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
18040 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18050 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65  Commit a stateme
18060 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
18070 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
18080 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
18090 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
180a0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
180b0 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
180c0 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45  pNext;.    TRACE
180d0 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
180e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
180f0 2e 68 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  .h);.    if( !pP
18100 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
18110 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
18120 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  ek(&pPager->stfd
18130 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  , 0);.      /* s
18140 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
18150 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
18160 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  0); */.      sql
18170 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d  iteFree( pPager-
18180 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  >aInStmt );.    
18190 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
181a0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
181b0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
181c0 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
181d0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70  =pNext){.      p
181e0 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
181f0 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73  tStmt;.      ass
18200 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74  ert( pPg->inStmt
18210 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
18220 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
18230 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
18240 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
18250 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
18260 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
18270 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
18280 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
18290 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
182a0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
182b0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
182c0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
182d0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
182e0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
182f0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
18300 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
18310 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
18320 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
18330 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
18340 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
18350 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
18360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
18380 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ack a statement.
18390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
183a0 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61  ager_stmt_rollba
183b0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
183c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
183d0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
183e0 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43  nUse ){.    TRAC
183f0 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
18400 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  K %d\n", pPager-
18410 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20  >fd.h);.    if( 
18420 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
18430 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
18440 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  g;.      for(pPg
18450 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
18460 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
18470 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20  extStmt){.      
18480 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
18490 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
184a0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
184b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
184c0 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
184d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
184e0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
184f0 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  , pHist->pStmt, 
18500 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18520 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
18530 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
18540 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
18550 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
18560 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
18570 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
18580 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20  er->stmtSize;.  
18590 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
185a0 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
185b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
185c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
185d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74     rc = pager_st
185e0 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  mt_playback(pPag
185f0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
18600 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
18610 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
18620 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
18630 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18640 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
18650 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
18660 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18670 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
18680 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
18690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
186a0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
186b0 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66   *sqlite3pager_f
186c0 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
186d0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
186e0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
186f0 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
18700 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
18710 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
18720 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
18730 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61   char *sqlite3pa
18740 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65  ger_dirname(Page
18750 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
18760 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69  turn pPager->zDi
18770 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  rectory;.}../*.*
18780 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
18790 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
187a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
187b0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
187c0 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72  qlite3pager_jour
187d0 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
187e0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
187f0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
18800 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  l;.}../*.** Set 
18810 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
18820 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
18830 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
18840 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72  t_codec(.  Pager
18850 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
18860 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a   (*xCodec)(void*
18870 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
18880 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
18890 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
188a0 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
188b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
188c0 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
188d0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
188e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
188f0 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
18900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18910 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
18920 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62  ,.** stored at b
18930 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61  yte 24 of the pa
18940 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ger file..*/.sta
18950 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
18960 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
18970 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18980 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a  .  void *pPage;.
18990 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
189a0 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
189b0 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  unter;.  int rc;
189c0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65  ..  /* Open page
189d0 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
189e0 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
189f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
18a00 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31  er_get(pPager, 1
18a10 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
18a20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18a30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
18a40 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
18a50 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
18a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18a70 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
18a80 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75    /* Read the cu
18a90 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62  rrent value at b
18aa0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67  yte 24. */.  pPg
18ab0 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  Hdr = DATA_TO_PG
18ac0 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68  HDR(pPage);.  ch
18ad0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72  ange_counter = r
18ae0 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50  etrieve32bits(pP
18af0 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a  gHdr, 24);..  /*
18b00 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
18b10 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
18b20 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
18b30 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
18b40 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
18b50 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74  ++;.  store32bit
18b60 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  s(change_counter
18b70 2c 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a  , pPgHdr, 24);..
18b80 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
18b90 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
18ba0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67   */.  sqlite3pag
18bb0 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
18bc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18bd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
18be0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
18bf0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
18c00 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
18c10 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
18c20 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
18c30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18c40 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
18c50 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
18c60 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
18c70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
18c80 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
18c90 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
18ca0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
18cb0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
18cc0 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
18cd0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
18ce0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18cf0 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
18d00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
18d10 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74  synced, all dirt
18d20 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  y pages written.
18d30 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
18d40 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
18d50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
18d60 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74  nced. The only t
18d70 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d  hing that.** rem
18d80 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
18d90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
18da0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
18db0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
18dc0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
18dd0 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
18de0 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
18df0 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
18e00 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
18e10 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
18e20 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
18e30 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
18e40 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  n sqlite3pager_s
18e50 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69  ync() call..*/.i
18e60 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
18e70 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
18e80 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
18e90 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
18ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18eb0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
18ec0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   an in-memory db
18ed0 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61  , or no pages ha
18ee0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
18ef0 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a  to, or this.  **
18f00 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
18f10 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
18f20 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
18f30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
18f40 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
18f50 52 5f 53 59 4e 43 45 44 20 26 26 20 21 70 50 61  R_SYNCED && !pPa
18f60 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50  ger->memDb && pP
18f70 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
18f80 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
18f90 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
18fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18fb0 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  pen );..    /* I
18fc0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
18fd0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
18fe0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
18ff0 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
19000 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
19010 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69  , then no sync i
19020 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
19030 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74   happens when it
19040 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   is.    ** writt
19050 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  en, then the pro
19060 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70  cess fails to up
19070 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
19080 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20  ERVED to an.    
19090 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
190a0 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65  k. The next time
190b0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69   the process tri
190c0 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  es to commit the
190d0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
190e0 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65  ion the m-j name
190f0 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
19100 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e  dy been written.
19110 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19120 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
19130 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  er ){.      rc =
19140 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
19150 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
19160 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19180 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
19190 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
191a0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
191b0 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
191c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
191d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
191e0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20  _exit;.      rc 
191f0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
19200 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
19210 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19220 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
19230 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57  .    }..    /* W
19240 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
19250 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
19260 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
19270 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
19280 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
19290 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
192a0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
192b0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
192c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
192d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
192e0 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  exit;..    /* Sy
192f0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
19300 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
19310 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
19320 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
19330 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50  qlite3OsSync(&pP
19340 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 7d  ager->fd);.    }
19350 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
19360 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
19370 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  ED;.  }..sync_ex
19380 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
19390 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
193a0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
193b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
193c0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
193d0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  rn the current s
193e0 74 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65  tate of the file
193f0 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69   lock for the gi
19400 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68  ven pager..** Th
19410 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
19420 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b  s one of NO_LOCK
19430 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
19440 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a  ESERVED_LOCK,.**
19450 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f   PENDING_LOCK, o
19460 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
19470 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19480 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28  pager_lockstate(
19490 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
194a0 23 69 66 64 65 66 20 4f 53 5f 54 45 53 54 0a 20  #ifdef OS_TEST. 
194b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
194c0 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b  fd->fd.locktype;
194d0 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
194e0 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74  pPager->fd.lockt
194f0 79 70 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65  ype;.#endif.}.#e
19500 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
19510 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50  ITE_TEST./*.** P
19520 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
19530 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
19540 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
19550 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
19560 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
19570 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  _refdump(Pager *
19580 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
19590 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
195a0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
195b0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
195c0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
195d0 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
195e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72 69  ontinue;.    pri
195f0 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
19600 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d 25  dr=0x%08x nRef=%
19610 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
19620 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47  g->pgno, (int)PG
19630 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
19640 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
19650 7d 0a 7d 0a 23 65 6e 64 69 66 0a                 }.}.#endif.