/ Hex Artifact Content
Login

Artifact 705a61117f05d7dd031762408f9a279834e88c3a:


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 36  : pager.c,v 1.16
0350: 34 20 32 30 30 34 2f 30 39 2f 32 34 20 32 32 3a  4 2004/09/24 22:
0360: 33 32 3a 33 31 20 64 72 68 20 45 78 70 20 24 0a  32:31 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 23  d off.*/.#if 0.#
0450: 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29  define TRACE1(X)
0460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
0470: 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65  bugPrintf(X).#de
0480: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0490: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
04a0: 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65  gPrintf(X,Y).#de
04b0: 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c  fine TRACE3(X,Y,
04c0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04d0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04e0: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
04f0: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0500: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0510: 57 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  W).#else.#define
0520: 20 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69   TRACE1(X).#defi
0530: 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 0a 23  ne TRACE2(X,Y).#
0540: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0550: 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Y,Z).#define TRA
0560: 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 65 6e  CE4(X,Y,Z,W).#en
0570: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
0580: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0590: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
05a0: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
05b0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
05c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
05d0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
05e0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
05f0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
0600: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0620: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0630: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0640: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0670: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0680: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0690: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
06a0: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
06b0: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
06c0: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
06d0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
06e0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
06f0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
0700: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
0710: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
0720: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0730: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0750: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0760: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0770: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
07a0: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
07b0: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
07c0: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
07d0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
07e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
07f0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
0820: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0830: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0840: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0860: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0870: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0880: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0890: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08a0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
08b0: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
08c0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
08d0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0900: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0910: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0940: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0950: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0960: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0970: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0980: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
09b0: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
09c0: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
09f0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0a00: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0a10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a20: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0a30: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0a40: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0a50: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0a60: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0a70: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0a80: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0ab0: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0ac0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ad0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0af0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0b00: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0b10: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0b40: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0b50: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74  o is to remove t
0b60: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
0b80: 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65  nal file and the
0b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
0ba0: 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  l be.**         
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
0bc0: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0bd0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0be0: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0bf0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0c00: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0c10: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
0c20: 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74  occurs, the stat
0c30: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0c40: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a   PAGER_SHARED..*
0c50: 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65  * After all page
0c60: 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65  s have been rele
0c70: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
0c80: 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a  e_page_unref(),.
0c90: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61  ** the state tra
0ca0: 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f  nsitions back to
0cb0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0cc0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a  The first time.*
0cd0: 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 70 61  * that sqlite3pa
0ce0: 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63  ger_write() is c
0cf0: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0d00: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0d10: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0d20: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0d30: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0d40: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0d50: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0d60: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0d70: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0d80: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0d90: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0da0: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0db0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0dc0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0dd0: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0de0: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0df0: 53 49 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e  SIVE occurs when
0e00: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
0e10: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
0e20: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0e30: 66 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20  file.  After an 
0e40: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
0e50: 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71  lback().** or sq
0e60: 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69  lite_pager_commi
0e70: 74 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 67  t(), the state g
0e80: 6f 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  oes back to PAGE
0e90: 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65  R_SHARED..*/.#de
0ea0: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
0eb0: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
0ec0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
0ed0: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
0ee0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
0ef0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
0f00: 58 43 4c 55 53 49 56 45 20 20 20 33 0a 23 64 65  XCLUSIVE   3.#de
0f10: 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45  fine PAGER_SYNCE
0f20: 44 20 20 20 20 20 20 34 0a 0a 0a 2f 2a 0a 2a 2a  D      4.../*.**
0f30: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
0f40: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
0f50: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
0f60: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
0f70: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
0f80: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
0f90: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
0fa0: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
0fb0: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
0fc0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
0fd0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
0fe0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
0ff0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1000: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1010: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70 61 67   call sqlite3pag
1020: 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20 61 20  er_write() on a 
1030: 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61  page prior to ma
1040: 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69  king.** any modi
1050: 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61  fications to tha
1060: 74 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72  t page.  The fir
1070: 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 70  st time sqlite3p
1080: 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20  ager_write().** 
1090: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f  is called, the o
10a0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
10b0: 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65  tents are writte
10c0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
10d0: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  ack.** journal a
10e0: 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e  nd PgHdr.inJourn
10f0: 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65  al and PgHdr.nee
1100: 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20  dSync are set.  
1110: 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74  Later, once.** t
1120: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  he journal page 
1130: 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f  has made it onto
1140: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
1150: 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  e, PgHdr.needSyn
1160: 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e  c.** is cleared.
1170: 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70    The modified p
1180: 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72  age cannot be wr
1190: 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
11a0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
11c0: 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  til the journal 
11d0: 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73  pages has been s
11e0: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e  ynced to disk an
11f0: 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e  d the.** PgHdr.n
1200: 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e  eedSync has been
1210: 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
1220: 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20  The PgHdr.dirty 
1230: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
1240: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1250: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1260: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1270: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1280: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1290: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
12a0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
12b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
12c0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
12d0: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
12e0: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
12f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1310: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
1320: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
1330: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
1340: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
1350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1360: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1370: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1380: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1390: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
13a0: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
13b0: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
13c0: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
13d0: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
13e0: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
13f0: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1400: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1410: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1420: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1430: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1440: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
1450: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
1460: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
1470: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
1480: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1490: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
14a0: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
14b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
14c0: 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77  UE if has been w
14d0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
14e0: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
14f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1500: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1510: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
1520: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
1530: 20 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20    u8 dirty;     
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e   /* TRUE if we n
1560: 65 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63  eed to write bac
1570: 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  k changes */.  u
1580: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a0: 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65   Sync journal be
15b0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69  fore writing thi
15c0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61  s page */.  u8 a
15d0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
15f0: 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  sable dont_rollb
1600: 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70  ack() for this p
1610: 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  age */.  short i
1620: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1630: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1640: 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68  r of users of th
1650: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
1660: 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20  dr *pDirty;     
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1680: 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74 65  irty pages sorte
1690: 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f 20  d by PgHdr.pgno 
16a0: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
16b0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
16c0: 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c  f page data foll
16d0: 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20 2a  ow this header *
16e0: 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78  /.  /* Pager.nEx
16f0: 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63  tra bytes of loc
1700: 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  al data follow t
1710: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
1720: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e  };../*.** For an
1730: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20   in-memory only 
1740: 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65  database, some e
1750: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
1760: 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f   is recorded abo
1770: 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20  ut.** each page 
1780: 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73 20  so that changes 
1790: 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
17a0: 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69  ck.  (Journal fi
17b0: 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75  les are not.** u
17c0: 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  sed for in-memor
17d0: 79 20 64 61 74 61 62 61 73 65 73 2e 29 20 20 54  y databases.)  T
17e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66  he following inf
17f0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65  ormation is adde
1800: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20  d to.** the end 
1810: 6f 66 20 65 76 65 72 79 20 45 58 54 52 41 20 62  of every EXTRA b
1820: 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  lock for in-memo
1830: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
1840: 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  .** This informa
1850: 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20  tion could have 
1860: 62 65 65 6e 20 61 64 64 65 64 20 64 69 72 65 63  been added direc
1870: 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64 72  tly to the PgHdr
1880: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42   structure..** B
1890: 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64  ut then it would
18a0: 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72   take up an extr
18b0: 61 20 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f  a 8 bytes of sto
18c0: 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67  rage on every Pg
18d0: 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20  Hdr.** even for 
18e0: 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62  disk-based datab
18f0: 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67  ases.  Splitting
1900: 20 69 74 20 6f 75 74 20 73 61 76 65 73 20 38 20   it out saves 8 
1910: 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20  bytes.  This.** 
1920: 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67  is only a saving
1930: 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68  s of 0.8% but th
1940: 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65 73 20  ose percentages 
1950: 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64  add up..*/.typed
1960: 65 66 20 73 74 72 75 63 74 20 50 67 48 69 73 74  ef struct PgHist
1970: 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73  ory PgHistory;.s
1980: 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20  truct PgHistory 
1990: 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20  {.  u8 *pOrig;  
19a0: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70     /* Original p
19b0: 61 67 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f  age text.  Resto
19c0: 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20  re to this on a 
19d0: 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  full rollback */
19e0: 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20  .  u8 *pStmt;   
19f0: 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20    /* Text as it 
1a00: 77 61 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  was at the begin
1a10: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72  ning of the curr
1a20: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ent statement */
1a30: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63  .};../*.** A mac
1a40: 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f  ro used for invo
1a50: 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69  king the codec i
1a60: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a  f there is one.*
1a70: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a80: 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69  HAS_CODEC.# defi
1a90: 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58  ne CODEC(P,D,N,X
1aa0: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20  ) if( P->xCodec 
1ab0: 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  ){ P->xCodec(P->
1ac0: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
1ad0: 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ; }.#else.# defi
1ae0: 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58  ne CODEC(P,D,N,X
1af0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1b00: 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  Convert a pointe
1b10: 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74  r to a PgHdr int
1b20: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  o a pointer to i
1b30: 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62  ts data.** and b
1b40: 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64  ack again..*/.#d
1b50: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44  efine PGHDR_TO_D
1b60: 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29  ATA(P)  ((void*)
1b70: 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69  (&(P)[1])).#defi
1b80: 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52  ne DATA_TO_PGHDR
1b90: 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29  (D)  (&((PgHdr*)
1ba0: 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e  (D))[-1]).#defin
1bb0: 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  e PGHDR_TO_EXTRA
1bc0: 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28  (G,P) ((void*)&(
1bd0: 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29  (char*)(&(G)[1])
1be0: 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d  )[(P)->pageSize]
1bf0: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
1c00: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
1c10: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
1c20: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
1c30: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
1c40: 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28  PGR)->pageSize+(
1c50: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
1c60: 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f  /*.** How big to
1c70: 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
1c80: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  able used for lo
1c90: 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79  cating in-memory
1ca0: 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67   pages.** by pag
1cb0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65  e number..*/.#de
1cc0: 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32  fine N_PG_HASH 2
1cd0: 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  048../*.** Hash 
1ce0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
1cf0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
1d00: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28  ash(PN)  ((PN)&(
1d10: 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f  N_PG_HASH-1))../
1d20: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
1d30: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
1d40: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1d50: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1d60: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
1d70: 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  r {.  char *zFil
1d80: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1d90: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1da0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1db0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
1dc0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1dd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
1de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
1df0: 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72   char *zDirector
1e00: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
1e10: 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64  Directory hold d
1e20: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
1e30: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f  nal files */.  O
1e40: 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20  sFile fd, jfd;  
1e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1e60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
1e70: 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  or database and 
1e80: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46  journal */.  OsF
1e90: 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20 20 20  ile stfd;       
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1eb0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
1ec0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
1ed0: 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74  bjournal*/.  int
1ee0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
1ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f00: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1f10: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
1f20: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
1f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1f40: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
1f50: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
1f60: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f80: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
1f90: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
1fa0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
1fb0: 20 20 6f 66 66 5f 74 20 73 74 6d 74 4a 53 69 7a    off_t stmtJSiz
1fc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1fd0: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
1fe0: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
1ff0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2020: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
2030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
2040: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2060: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
2070: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
2080: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
2090: 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20  int stmtNRec;   
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20b0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
20c0: 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72   in stmt subjour
20d0: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  nal */.  int nEx
20e0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
20f0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
2100: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
2110: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2120: 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ge */.  void (*x
2130: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
2140: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
2150: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2160: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
2170: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2180: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
2190: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
21a0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
21b0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
21c0: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
21d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
21f0: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
2200: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2220: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2230: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2240: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2270: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2280: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2290: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
22a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22b0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
22c0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
22d0: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
22e0: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
22f0: 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f  ss, nOvfl;     /
2300: 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69  * Cache hits, mi
2310: 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f  ssing, and LRU o
2320: 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 76 6f  verflows */.  vo
2330: 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
2340: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
2350: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
2360: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
2370: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
2380: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
2390: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
23a0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
23b0: 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  () */.  u8 journ
23c0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
23d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
23e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
23f0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
2400: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2410: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2420: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2430: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2440: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2450: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2470: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2480: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2490: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
24a0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
24b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
24c0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
24d0: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
24e0: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2500: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
2510: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
2520: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
2530: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
2540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2550: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
2560: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
2570: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
2580: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a0: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
25b0: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
25c0: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
25d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
25e0: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
25f0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
2600: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
2610: 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b  s */.  u8 state;
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
2640: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
2650: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
2660: 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20    u8 errMask;   
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2680: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
2690: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
26a0: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
26b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26c0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
26d0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
26e0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
26f0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
2700: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
2710: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
2720: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
2730: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2740: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2750: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
2760: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
2770: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2780: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
2790: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
27a0: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
27b0: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
27c0: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
27d0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
27e0: 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  sable dont_rollb
27f0: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
2800: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
2810: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2830: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
2840: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61 49   I/O */.  u8 *aI
2850: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
2860: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2870: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2880: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2890: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
28a0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
28b0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
28c0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
28d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
28e0: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2900: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
2910: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
2920: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
2930: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
2940: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
2950: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2960: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
2970: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
2980: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
2990: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
29a0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
29b0: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
29c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
29d0: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
29e0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
29f0: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
2a00: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2a10: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
2a20: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
2a30: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
2a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2a50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2a60: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
2a70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 6f 66 66 5f 74  urnal */.  off_t
2a80: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
2a90: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2aa0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e  t byte offset in
2ab0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ac0: 65 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 6a 6f 75  e */.  off_t jou
2ad0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
2ae0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
2af0: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
2b00: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
2b10: 20 20 6f 66 66 5f 74 20 73 74 6d 74 48 64 72 4f    off_t stmtHdrO
2b20: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ff;           /*
2b30: 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   First journal h
2b40: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 68  eader written th
2b50: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
2b60: 20 20 6f 66 66 5f 74 20 73 74 6d 74 43 6b 73 75    off_t stmtCksu
2b70: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m;            /*
2b80: 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20   cksumInit when 
2b90: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
2ba0: 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  arted */.  int s
2bb0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
2bc0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
2bd0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
2be0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
2bf0: 0a 20 20 50 67 48 64 72 20 2a 61 48 61 73 68 5b  .  PgHdr *aHash[
2c00: 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f  N_PG_HASH];    /
2c10: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20  * Hash table to 
2c20: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
2c30: 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a  to PgHdr */.};..
2c40: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
2c50: 62 69 74 73 20 74 68 61 74 20 63 61 6e 20 62 65  bits that can be
2c60: 20 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72   set in Pager.er
2c70: 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e  rMask..*/.#defin
2c80: 65 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  e PAGER_ERR_FULL
2c90: 20 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20       0x01  /* a 
2ca0: 77 72 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a  write() failed *
2cb0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
2cc0: 45 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30  ERR_MEM      0x0
2cd0: 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66  2  /* malloc() f
2ce0: 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ailed */.#define
2cf0: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
2d00: 20 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72      0x04  /* err
2d10: 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  or in the lockin
2d20: 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64  g protocol */.#d
2d30: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
2d40: 43 4f 52 52 55 50 54 20 20 30 78 30 38 20 20 2f  CORRUPT  0x08  /
2d50: 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f  * database or jo
2d60: 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
2d70: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
2d80: 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30  R_ERR_DISK     0
2d90: 78 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20  x10  /* general 
2da0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d  disk I/O error -
2db0: 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65 3f   bad hard drive?
2dc0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e   */../*.** Journ
2dd0: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
2de0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
2df0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
2e00: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
2e10: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
2e20: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
2e30: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
2e40: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
2e50: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
2e60: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
2e70: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
2e80: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
2e90: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
2ea0: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
2eb0: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
2ec0: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
2ed0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
2ee0: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
2ef0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
2f00: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
2f10: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
2f20: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
2f30: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
2f40: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
2f50: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
2f60: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
2f70: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
2f80: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
2f90: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
2fa0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
2fb0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
2fc0: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
2fd0: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
2fe0: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
2ff0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3000: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3010: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3020: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3030: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
3040: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3050: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
3060: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
3070: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
3080: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3090: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
30a0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
30b0: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
30c0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
30d0: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
30e0: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
30f0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3100: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3110: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3120: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3130: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
3140: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3150: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3160: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
3170: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3180: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3190: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
31a0: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
31b0: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
31c0: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
31d0: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
31e0: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
31f0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3200: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3210: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3220: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3230: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
3240: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3250: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3260: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
3270: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3280: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3290: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
32a0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
32b0: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
32c0: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
32d0: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
32e0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
32f0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3300: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3310: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
3320: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
3330: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
3340: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
3350: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
3360: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
3370: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
3380: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
3390: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
33a0: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
33b0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
33c0: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
33d0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
33e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
33f0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3400: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3410: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
3420: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
3430: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
3440: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
3450: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
3460: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
3470: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
3480: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
3490: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
34a0: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
34b0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
34c0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
34d0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
34e0: 53 69 7a 65 29 0a 0a 23 64 65 66 69 6e 65 20 50  Size)..#define P
34f0: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
3500: 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65   512../*.** Page
3510: 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a   number PAGER_MJ
3520: 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75  _PGNO is never u
3530: 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  sed in an SQLite
3540: 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73   database (it is
3550: 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72  .** reserved for
3560: 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20   working around 
3570: 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20  a windows/posix 
3580: 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  incompatibility)
3590: 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20  . It is.** used 
35a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  in the journal t
35b0: 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74  o signify that t
35c0: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
35d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35e0: 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20   .** is devoted 
35f0: 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73  to storing a mas
3600: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
3610: 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   - there are no 
3620: 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a  more pages to.**
3630: 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20   roll back. See 
3640: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e  comments for fun
3650: 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65  ction writeMaste
3660: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64  rJournal() for d
3670: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69  etails..*/.#defi
3680: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
3690: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
36a0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
36b0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  ))../*.** Enable
36c0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
36d0: 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64   tracking (for d
36e0: 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a  ebugging) here:.
36f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3700: 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65  _TEST.  int page
3710: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
3720: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
3730: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
3740: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
3750: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
3760: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
3770: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
3780: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
3790: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
37a0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
37b0: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
37c0: 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20  %p nRef=%d\n",. 
37d0: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50        p->pgno, P
37e0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
37f0: 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a   p->nRef.    );.
3800: 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20      cnt++;   /* 
3810: 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74  Something to set
3820: 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e   a breakpoint on
3830: 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65   */.  }.# define
3840: 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67   REFINFO(X)  pag
3850: 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65  er_refinfo(X).#e
3860: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46  lse.# define REF
3870: 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a  INFO(X).#endif..
3880: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
3890: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
38a0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
38b0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
38c0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
38d0: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
38e0: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
38f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
3900: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
3910: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
3920: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
3930: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
3940: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
3950: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
3960: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
3970: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
3980: 65 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ead32bits(OsFile
3990: 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29   *fd, u32 *pRes)
39a0: 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69  {.  u32 res;.  i
39b0: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  nt rc;.  rc = sq
39c0: 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
39d0: 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73  &res, sizeof(res
39e0: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
39f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
3a00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
3a10: 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61  4];.    memcpy(a
3a20: 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20 20 20  c, &res, 4);.   
3a30: 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32   res = (ac[0]<<2
3a40: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
3a50: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
3a60: 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52  ac[3];.  }.  *pR
3a70: 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65 74 75  es = res;.  retu
3a80: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3a90: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
3aa0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
3ab0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
3ac0: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
3ad0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
3ae0: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
3af0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
3b00: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
3b10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
3b20: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
3b30: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
3b40: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
3b50: 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d 20   ac[4];.  ac[0] 
3b60: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
3b70: 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76  ff;.  ac[1] = (v
3b80: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
3b90: 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e    ac[2] = (val>>
3ba0: 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  8) & 0xff;.  ac[
3bb0: 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b  3] = val & 0xff;
3bc0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3bd0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
3be0: 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   4);.}../*.** Wr
3bf0: 69 74 65 20 74 68 65 20 33 32 2d 62 69 74 20 69  ite the 32-bit i
3c00: 6e 74 65 67 65 72 20 27 76 61 6c 27 20 69 6e 74  nteger 'val' int
3c10: 6f 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  o the page ident
3c20: 69 66 69 65 64 20 62 79 20 70 61 67 65 20 68 65  ified by page he
3c30: 61 64 65 72 0a 2a 2a 20 27 70 27 20 61 74 20 6f  ader.** 'p' at o
3c40: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 2e 0a  ffset 'offset'..
3c50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3c60: 74 6f 72 65 33 32 62 69 74 73 28 75 33 32 20 76  tore32bits(u32 v
3c70: 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20 69 6e  al, PgHdr *p, in
3c80: 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73  t offset){.  uns
3c90: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a  igned char *ac;.
3ca0: 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e    ac = &((unsign
3cb0: 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54  ed char*)PGHDR_T
3cc0: 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65  O_DATA(p))[offse
3cd0: 74 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  t];.  ac[0] = (v
3ce0: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
3cf0: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
3d00: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
3d10: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
3d20: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
3d30: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a   val & 0xff;.}..
3d40: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
3d50: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
3d60: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
3d70: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
3d80: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
3d90: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
3da0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
3db0: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
3dc0: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
3dd0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
3de0: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
3df0: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
3e00: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
3e10: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
3e20: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
3e30: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
3e40: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
3e50: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  [3];.}.../*.** C
3e60: 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73 20  onvert the bits 
3e70: 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  in the pPager->e
3e80: 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61  rrMask into an a
3e90: 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74  pproprate.** ret
3ea0: 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  urn code..*/.sta
3eb0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
3ec0: 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  rcode(Pager *pPa
3ed0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
3ee0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
3ef0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
3f00: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  k & PAGER_ERR_LO
3f10: 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  CK )    rc = SQL
3f20: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
3f30: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
3f40: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
3f50: 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53  DISK )    rc = S
3f60: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69  QLITE_IOERR;.  i
3f70: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
3f80: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46  sk & PAGER_ERR_F
3f90: 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51  ULL )    rc = SQ
3fa0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28  LITE_FULL;.  if(
3fb0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3fc0: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d   & PAGER_ERR_MEM
3fd0: 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49   )     rc = SQLI
3fe0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20  TE_NOMEM;.  if( 
3ff0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4000: 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  & PAGER_ERR_CORR
4010: 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UPT ) rc = SQLIT
4020: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74  E_CORRUPT;.  ret
4030: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4040: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
4050: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
4060: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
4070: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
4080: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
4090: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
40a0: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
40b0: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
40c0: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
40d0: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
40e0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
40f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
4100: 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20  *pzMaster is.** 
4110: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
4120: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  the memory and S
4130: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
4140: 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
4150: 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65  st.** sqliteFree
4160: 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a  () *pzMaster..**
4170: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
4180: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
4190: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70  me is present *p
41a0: 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74  zMaster is set t
41b0: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
41c0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
41d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
41e0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f  dMasterJournal(O
41f0: 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  sFile *pJrnl, ch
4200: 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a  ar **pzMaster){.
4210: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
4220: 6c 65 6e 3b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a  len;.  off_t szJ
4230: 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
4240: 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e   int i;.  unsign
4250: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
4260: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
4270: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
4280: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70   header */..  *p
4290: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  zMaster = 0;..  
42a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
42b0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
42c0: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
42d0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c  QLITE_OK || szJ<
42e0: 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  16 ) return rc;.
42f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
4300: 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a  sSeek(pJrnl, szJ
4310: 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  -16);.  if( rc!=
4320: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
4330: 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20  rn rc;. .  rc = 
4340: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
4350: 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  , &len);.  if( r
4360: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
4370: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
4380: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
4390: 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69  nl, &cksum);.  i
43a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
43b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
43c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
43d0: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
43e0: 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21  c, 8);.  if( rc!
43f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65  =SQLITE_OK || me
4400: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
4410: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
4420: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
4430: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
4440: 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d  k(pJrnl, szJ-16-
4450: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
4460: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
4470: 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73  rn rc;..  *pzMas
4480: 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ter = (char *)sq
4490: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31  liteMalloc(len+1
44a0: 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73  );.  if( !*pzMas
44b0: 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ter ){.    retur
44c0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
44d0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
44e0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
44f0: 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b  *pzMaster, len);
4500: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4510: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
4520: 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72  teFree(*pzMaster
4530: 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72  );.    *pzMaster
4540: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
4550: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
4560: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
4570: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
4580: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
4590: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  me */.  for(i=0;
45a0: 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20   i<len; i++){.  
45b0: 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d    cksum -= (*pzM
45c0: 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20  aster)[i];.  }. 
45d0: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
45e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
45f0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
4600: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
4610: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
4620: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
4630: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
4640: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
4650: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
4660: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
4670: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
4680: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
4690: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
46a0: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
46b0: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
46c0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
46d0: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
46e0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
46f0: 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  *pzMaster);.    
4700: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  *pzMaster = 0;. 
4710: 20 7d 0a 20 20 28 2a 70 7a 4d 61 73 74 65 72 29   }.  (*pzMaster)
4720: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
4730: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
4740: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
4750: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  eek the journal 
4760: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
4770: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
4780: 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72  or boundary wher
4790: 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  e a.** journal h
47a0: 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61  eader may be rea
47b0: 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61  d or written. Pa
47c0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  ger.journalOff i
47d0: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a  s updated with.*
47e0: 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f  * the new seek o
47f0: 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ffset..**.** i.e
4800: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
4810: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
4820: 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20   Input Offset   
4830: 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75             Outpu
4840: 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d  t Offset.** ----
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4870: 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20  ---.** 0        
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20   0.** 512       
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48b0: 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20  512.** 100      
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48d0: 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20   512.** 2000    
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
4900: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75  atic int seekJou
4910: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
4920: 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20  Pager){.  off_t 
4930: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 6f 66  offset = 0;.  of
4940: 66 5f 74 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  f_t c = pPager->
4950: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
4960: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
4970: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
4980: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4990: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
49a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
49b0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
49c0: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
49d0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
49e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
49f0: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
4a00: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
4a10: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
4a20: 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65  ager) );.  pPage
4a30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
4a40: 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  offset;.  return
4a50: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
4a60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
4a70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
4a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
4a90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
4aa0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
4ab0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4ac0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
4ad0: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
4ae0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
4af0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4b00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4b10: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
4b20: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
4b30: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
4b40: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
4b50: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
4b60: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
4b70: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
4b80: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
4b90: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
4ba0: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
4bb0: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
4bc0: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
4bd0: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
4be0: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
4bf0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
4c00: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
4c10: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
4c20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
4c30: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
4c40: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
4c50: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
4c60: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
4c70: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
4c80: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
4c90: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
4ca0: 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75  - 24) bytes of u
4cb0: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
4cc0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
4cd0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
4ce0: 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 69 6e   *pPager){..  in
4cf0: 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e  t rc = seekJourn
4d00: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
4d10: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
4d20: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
4d30: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
4d40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
4d50: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
4d60: 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a  tmtHdrOff==0 ){.
4d70: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
4d80: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
4d90: 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d  >journalHdr;.  }
4da0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
4db0: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
4dc0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
4dd0: 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a  ..  /* FIX ME: .
4de0: 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62    **.  ** Possib
4df0: 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e  ly for a pager n
4e00: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
4e10: 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
4e20: 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74  magic should not
4e30: 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
4e40: 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66   until nRec is f
4e50: 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74  illed in as part
4e60: 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75   of next syncJou
4e70: 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20  rnal(). .  **.  
4e80: 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62  ** Actually mayb
4e90: 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  e the whole jour
4ea0: 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c  nal header shoul
4eb0: 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74  d be delayed unt
4ec0: 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69  il that.  ** poi
4ed0: 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  nt. Think about 
4ee0: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  this..  */.  rc 
4ef0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
4f00: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
4f10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
4f20: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
4f30: 69 63 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ic));..  if( rc=
4f40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4f50: 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69    /* The nRec Fi
4f60: 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20  eld. 0xFFFFFFFF 
4f70: 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72  for no-sync jour
4f80: 6e 61 6c 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20  nals. */.    rc 
4f90: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
4fa0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
4fb0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
4fc0: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
4fd0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
4fe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
4ff0: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
5000: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65  -hash initialise
5010: 72 20 2a 2f 20 0a 20 20 20 20 73 71 6c 69 74 65  r */ .    sqlite
5020: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
5030: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
5040: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
5050: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20  cksumInit);.    
5060: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
5070: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
5080: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5090: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
50a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
50b0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
50c0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
50d0: 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  /.    rc = write
50e0: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
50f0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  jfd, pPager->dbS
5100: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ize);.  }.  if( 
5110: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5120: 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 73 73 75  .    /* The assu
5130: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
5140: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
5150: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69   */.    rc = wri
5160: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
5170: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
5180: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 7d 0a  ectorSize);.  }.
5190: 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
51a0: 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65  l header has bee
51b0: 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73  n written succes
51c0: 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65  sfully. Seek the
51d0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
51e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
51f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
5200: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
5210: 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  ector..  */.  if
5220: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5230: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
5240: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
5250: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
5260: 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 72 63  alOff-1);.    rc
5270: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
5280: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
5290: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a  "\000", 1);.  }.
52a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52b0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
52c0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
52d0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
52e0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
52f0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
5300: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
5310: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
5320: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
5330: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
5340: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
5350: 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  e. See comments 
5360: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
5370: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
5380: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
5390: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75  on of.** the jou
53a0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
53b0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
53c0: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
53d0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e  successfully, *n
53e0: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
53f0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
5400: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
5410: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
5420: 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73  r and *dbSize is
5430: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
5440: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5450: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
5460: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
5470: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
5480: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
5490: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
54a0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
54b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
54c0: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
54d0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
54e0: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
54f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
5500: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
5510: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
5520: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
5530: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
5540: 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61  rned and *nRec a
5550: 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e  nd *dbSize are n
5560: 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52  ot set.  If JOUR
5570: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
5580: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
5590: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
55a0: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
55b0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
55c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
55d0: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
55e0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
55f0: 72 2c 20 0a 20 20 6f 66 66 5f 74 20 6a 6f 75 72  r, .  off_t jour
5600: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
5610: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
5620: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
5630: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
5640: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
5650: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
5660: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
5670: 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73  der */..  rc = s
5680: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
5690: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
56a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
56b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
56c0: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
56d0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
56e0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
56f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5700: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
5710: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
5720: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
5730: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
5740: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
5750: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5760: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
5770: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
5780: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
5790: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
57a0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
57b0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
57c0: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
57d0: 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20  >jfd, pNRec);.  
57e0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
57f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
5800: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
5810: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  jfd, &pPager->ck
5820: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
5830: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
5840: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
5850: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
5860: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
5870: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5880: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
5890: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
58a0: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
58b0: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
58c0: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
58d0: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
58e0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
58f0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
5900: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
5910: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
5920: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
5930: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
5940: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
5950: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
5960: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
5970: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
5980: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
5990: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
59a0: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
59b0: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
59c0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
59d0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70   = read32bits(&p
59e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32  Pager->jfd, (u32
59f0: 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74   *)&pPager->sect
5a00: 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  orSize);.  if( r
5a10: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
5a20: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5a30: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
5a40: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
5a50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5a60: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
5a70: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
5a80: 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e  alOff);.  return
5a90: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
5aa0: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
5ab0: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
5ac0: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
5ad0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
5ae0: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
5af0: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
5b00: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
5b10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5b20: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
5b30: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
5b40: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
5b50: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
5b60: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
5b70: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
5b80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
5b90: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
5ba0: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
5bb0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
5bc0: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
5bd0: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
5be0: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
5bf0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
5c00: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
5c10: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
5c20: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
5c30: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
5c40: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
5c50: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
5c60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
5c70: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
5c80: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
5c90: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
5ca0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
5cb0: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
5cc0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
5cd0: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
5ce0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
5cf0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
5d00: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
5d10: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
5d20: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
5d30: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
5d40: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
5d50: 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20    int i; .  u32 
5d60: 63 6b 73 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69  cksum = 0; ..  i
5d70: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
5d80: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
5d90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
5da0: 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  OK;.  pPager->se
5db0: 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20  tMaster = 1;..  
5dc0: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61  len = strlen(zMa
5dd0: 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ster);.  for(i=0
5de0: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
5df0: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
5e00: 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  ter[i];.  }..  /
5e10: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
5e20: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
5e30: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
5e40: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
5e50: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
5e60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5e70: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
5e80: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
5e90: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
5ea0: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
5eb0: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
5ec0: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
5ed0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
5ee0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
5ef0: 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  c = seekJournalH
5f00: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
5f10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5f20: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
5f30: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
5f40: 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b  rnalOff += (len+
5f50: 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  20);..  rc = wri
5f60: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
5f70: 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f  ->jfd, PAGER_MJ_
5f80: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
5f90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5fa0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5fb0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5fc0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
5fd0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
5fe0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5ff0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6000: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69   rc;..  rc = wri
6010: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
6020: 2d 3e 6a 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69  ->jfd, len);.  i
6030: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6040: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6050: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
6060: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
6070: 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
6080: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6090: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
60a0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
60b0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  &pPager->jfd, aJ
60c0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
60d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
60e0: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
60f0: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 72  eedSync = 1;.  r
6100: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6110: 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65  ** Add or remove
6120: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
6130: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
6140: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  es that are in t
6150: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
6160: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
6170: 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61  he Pager keeps a
6180: 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f   separate list o
6190: 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  f pages that are
61a0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a   currently in.**
61b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
61c0: 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65  ournal.  This he
61d0: 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 70  lps the sqlite3p
61e0: 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
61f0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
6200: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
6210: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
6220: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
6230: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
6240: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
6250: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
6260: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
6270: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
6280: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
6290: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
62a0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
62b0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
62c0: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
62d0: 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75  g->inStmt ) retu
62e0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rn;.  assert( pP
62f0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  g->pPrevStmt==0 
6300: 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  && pPg->pNextStm
6310: 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  t==0 );.  pPg->p
6320: 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20  PrevStmt = 0;.  
6330: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  if( pPager->pStm
6340: 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  t ){.    pPager-
6350: 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  >pStmt->pPrevStm
6360: 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  t = pPg;.  }.  p
6370: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
6380: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20  pPager->pStmt;. 
6390: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
63a0: 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53   pPg;.  pPg->inS
63b0: 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69  tmt = 1;.}.stati
63c0: 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f  c void page_remo
63d0: 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
63e0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
63f0: 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d   if( !pPg->inStm
6400: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  t ) return;.  if
6410: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
6420: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6430: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e  pPg->pPrevStmt->
6440: 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29  pNextStmt==pPg )
6450: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
6460: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Stmt->pNextStmt 
6470: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
6480: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6490: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
64a0: 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29  er->pStmt==pPg )
64b0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
64c0: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e  r->pStmt = pPg->
64d0: 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20  pNextStmt;.  }. 
64e0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53   if( pPg->pNextS
64f0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
6500: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  t( pPg->pNextStm
6510: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50  t->pPrevStmt==pP
6520: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  g );.    pPg->pN
6530: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
6540: 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53  mt = pPg->pPrevS
6550: 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  tmt;.  }.  pPg->
6560: 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
6570: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
6580: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74  = 0;.  pPg->inSt
6590: 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mt = 0;.}../*.**
65a0: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
65b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
65c0: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
65d0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
65e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
65f0: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
6600: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
6610: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
6620: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
6630: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
6640: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
6650: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
6660: 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f  [pager_hash(pgno
6670: 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26  )];.  while( p &
6680: 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20  & p->pgno!=pgno 
6690: 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  ){.    p = p->pN
66a0: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72  extHash;.  }.  r
66b0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
66c0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
66d0: 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20  abase and clear 
66e0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
66f0: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
6700: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
6710: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
6720: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
6730: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
6740: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
6750: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
6760: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
6770: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
6780: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
6790: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
67a0: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
67b0: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
67c0: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
67d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
67e0: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
67f0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
6800: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
6810: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
6820: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
6830: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
6840: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
6850: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
6860: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61  (pPg);.  }.  pPa
6870: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
6880: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
6890: 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70  tSynced = 0;.  p
68a0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
68b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  ;.  pPager->pAll
68c0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70   = 0;.  memset(p
68d0: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
68e0: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
68f0: 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65  aHash));.  pPage
6900: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
6910: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
6920: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
6930: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
6940: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
6950: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
6960: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
6970: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
6980: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
6990: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
69a0: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  OCK;.  pPager->d
69b0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50  bSize = -1;.  pP
69c0: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
69d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
69e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
69f0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65   );.}../*.** Whe
6a00: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6a10: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
6a20: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
6a30: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
6a40: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
6a50: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
6a60: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
6a70: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
6a80: 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65   releases.** the
6a90: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61   database lock a
6aa0: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48  nd acquires a SH
6ab0: 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73  ARED lock in its
6ac0: 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75   place.  The jou
6ad0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20  rnal.** file is 
6ae0: 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73  deleted and clos
6af0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
6b00: 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67  Consider keeping
6b10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6b20: 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f  e open for tempo
6b30: 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  rary databases..
6b40: 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69  ** This might gi
6b50: 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
6b60: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20   improvement on 
6b70: 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70  windows where op
6b80: 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20  ening.** a file 
6b90: 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20  is an expensive 
6ba0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
6bb0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75  atic int pager_u
6bc0: 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72  nwritelock(Pager
6bd0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
6be0: 64 72 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  dr *pPg;.  asser
6bf0: 74 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  t( !pPager->memD
6c00: 62 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  b );.  if( pPage
6c10: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
6c20: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
6c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6c40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61  .  }.  sqlite3pa
6c50: 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
6c60: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
6c70: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
6c80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
6c90: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73  Close(&pPager->s
6ca0: 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tfd);.    pPager
6cb0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
6cc0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
6cd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
6ce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
6cf0: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
6d00: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
6d10: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
6d20: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
6d30: 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
6d40: 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  rnal);.    sqlit
6d50: 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
6d60: 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  InJournal );.   
6d70: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
6d80: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nal = 0;.    for
6d90: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
6da0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
6db0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
6dc0: 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
6dd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
6de0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
6df0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
6e00: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
6e10: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
6e20: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
6e30: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
6e40: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6e50: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
6e60: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
6e70: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
6e80: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
6e90: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
6ea0: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
6eb0: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
6ec0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
6ed0: 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f  RED;.  pPager->o
6ee0: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
6ef0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
6f00: 65 72 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  er = 0;.  return
6f10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6f20: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
6f30: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
6f40: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
6f50: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
6f60: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
6f70: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
6f80: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
6f90: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
6fa0: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
6fb0: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
6fc0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
6fd0: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
6fe0: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
6ff0: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
7000: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
7010: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
7020: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
7030: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
7040: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
7050: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
7060: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
7070: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
7080: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
7090: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
70a0: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
70b0: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
70c0: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
70d0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
70e0: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
70f0: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
7100: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
7110: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
7120: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
7130: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
7140: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
7150: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
7160: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
7170: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
7180: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
7190: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
71a0: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
71b0: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
71c0: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
71d0: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
71e0: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
71f0: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
7200: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
7210: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
7220: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
7230: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
7240: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
7250: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
7260: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
7270: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
7280: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
7290: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
72a0: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
72b0: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
72c0: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
72d0: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
72e0: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
72f0: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
7300: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
7310: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
7320: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
7330: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
7340: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
7350: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
7360: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44  , const char *aD
7370: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
7380: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
7390: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
73a0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
73b0: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
73c0: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
73d0: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
73e0: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
73f0: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
7400: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
7410: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
7420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7430: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
7440: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
7450: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
7460: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a  is one page..**.
7470: 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d  ** If useCksum==
7480: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
7490: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
74a0: 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20   use checksums. 
74b0: 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72   Checksums.** ar
74c0: 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74  e not used in st
74d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
74e0: 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65   because stateme
74f0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e  nt journals do n
7500: 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75  ot.** need to su
7510: 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c  rvive power fail
7520: 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ures..*/.static 
7530: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
7540: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65  ck_one_page(Page
7550: 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c  r *pPager, OsFil
7560: 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43  e *jfd, int useC
7570: 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ksum){.  int rc;
7580: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
75b0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
75c0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
75d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
75e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
75f0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
7600: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
7610: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
7640: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
7650: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44 61  king */.  u8 aDa
7660: 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ta[SQLITE_MAX_PA
7670: 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 54 65  GE_SIZE];  /* Te
7680: 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  mp storage for a
7690: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 72 63 20 3d   page */..  rc =
76a0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
76b0: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
76c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
76d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
76e0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
76f0: 66 64 2c 20 26 61 44 61 74 61 2c 20 70 50 61 67  fd, &aData, pPag
7700: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
7710: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7720: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7730: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7740: 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
7750: 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20  pageSize + 4;.. 
7760: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
7770: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
7780: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
7790: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
77a0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
77b0: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
77c0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
77d0: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
77e0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
77f0: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
7800: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
7810: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
7820: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
7830: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
7840: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
7850: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
7860: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
7870: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
7880: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
7890: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
78a0: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
78b0: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
78c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
78d0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
78e0: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
78f0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
7900: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7910: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
7920: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
7930: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
7940: 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  s(jfd, &cksum);.
7950: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
7960: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
7970: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
7980: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 4;.    if( pag
7990: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
79a0: 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 21 3d 63   pgno, aData)!=c
79b0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
79c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
79d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
79e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
79f0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
7a00: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
7a10: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
7a20: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
7a30: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
7a40: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
7a50: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
7a60: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
7a70: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
7a80: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
7a90: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
7aa0: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
7ab0: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
7ac0: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
7ad0: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
7ae0: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
7af0: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
7b00: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
7b10: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
7b20: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
7b30: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
7b40: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
7b50: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
7b60: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
7b70: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
7b80: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
7b90: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
7ba0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
7bb0: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
7bc0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
7bd0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
7be0: 7c 20 70 50 67 20 29 3b 0a 20 20 54 52 41 43 45  | pPg );.  TRACE
7bf0: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
7c00: 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  age %d\n", pPage
7c10: 72 2d 3e 66 64 2e 68 2c 20 70 67 6e 6f 29 3b 0a  r->fd.h, pgno);.
7c20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7c30: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
7c40: 53 49 56 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  SIVE ){.    sqli
7c50: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
7c60: 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
7c70: 28 6f 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 70  (off_t)pPager->p
7c80: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  ageSize);.    rc
7c90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7ca0: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  e(&pPager->fd, a
7cb0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
7cc0: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69  geSize);.  }.  i
7cd0: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
7ce0: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
7cf0: 65 76 65 72 20 62 65 20 72 6f 6c 6c 65 64 20 62  ever be rolled b
7d00: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
7d10: 73 65 2c 20 65 78 63 65 70 74 20 66 6f 72 20 70  se, except for p
7d20: 61 67 65 0a 20 20 20 20 2a 2a 20 31 20 77 68 69  age.    ** 1 whi
7d30: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
7d40: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
7d50: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
7d60: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
7d70: 2a 2a 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a  ** active..    *
7d80: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
7d90: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
7da0: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
7db0: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20  Pg->pgno==1 );. 
7dc0: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
7dd0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
7de0: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
7df0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
7e00: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
7e10: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
7e20: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
7e30: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
7e40: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
7e50: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
7e60: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
7e70: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
7e80: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
7e90: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
7ea0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
7eb0: 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
7ec0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
7ed0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
7ee0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
7ef0: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
7f00: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
7f10: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
7f20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7f30: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
7f40: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
7f50: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
7f60: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
7f70: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
7f80: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
7f90: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
7fa0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
7fb0: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
7fc0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
7fd0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
7fe0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
7ff0: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
8000: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8010: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
8020: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
8030: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
8040: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
8050: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
8060: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
8070: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
8080: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
8090: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
80a0: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
80b0: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
80c0: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
80d0: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
80e0: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
80f0: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
8100: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
8110: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
8120: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
8130: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
8140: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8150: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
8160: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
8170: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
8180: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
8190: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
81a0: 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20   master;.  char 
81b0: 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
81c0: 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
81d0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
81e0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 6f 66 66  al file */.  off
81f0: 5f 74 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  _t nMasterJourna
8200: 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  l;     /* Size o
8210: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
8220: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   file */..  /* O
8230: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
8240: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c  ournal file excl
8250: 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20  usively in case 
8260: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
8270: 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69  ss.  ** is runni
8280: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
8290: 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69  also. Not that i
82a0: 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68  t makes too much
82b0: 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a   difference..  *
82c0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61 73 74  /.  memset(&mast
82d0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61  er, 0, sizeof(ma
82e0: 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d 20 73  ster));.  rc = s
82f0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
8300: 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d  Only(zMaster, &m
8310: 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63  aster);.  if( rc
8320: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
8330: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
8340: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
8350: 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
8360: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d  te3OsFileSize(&m
8370: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
8380: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
8390: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
83a0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
83b0: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
83c0: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
83d0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
83e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
83f0: 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  terPtr = 0;..   
8400: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
8410: 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
8420: 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
8430: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
8440: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61  .    ** sqliteMa
8450: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
8460: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
8470: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
8480: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
8490: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
84a0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  liteMalloc(nMast
84b0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
84c0: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
84d0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
84e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
84f0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
8500: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
8510: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8520: 4f 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20  OsRead(&master, 
8530: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
8540: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
8550: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8560: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
8570: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
8580: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
8590: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
85a0: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
85b0: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
85c0: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
85d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
85e0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
85f0: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
8600: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
8610: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
8620: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
8630: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
8640: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
8650: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
8660: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
8670: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
8680: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
8690: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
86a0: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
86b0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
86c0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
86d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
86e0: 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 0a 20  File journal;.. 
86f0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6a         memset(&j
8700: 6f 75 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f  ournal, 0, sizeo
8710: 66 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20  f(journal));.   
8720: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8730: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
8740: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e  zJournal, &journ
8750: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
8760: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8770: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
8780: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
8790: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
87a0: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
87b0: 65 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e  erJournal(&journ
87c0: 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29  al, &zMasterPtr)
87d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
87e0: 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61  3OsClose(&journa
87f0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
8800: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8810: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
8820: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
8830: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
8840: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 50 74 72    if( zMasterPtr
8850: 20 26 26 20 21 73 74 72 63 6d 70 28 7a 4d 61 73   && !strcmp(zMas
8860: 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
8870: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
8880: 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
8890: 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
88a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
88b0: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
88c0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
88d0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
88e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
88f0: 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
8900: 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b  trlen(zJournal)+
8910: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
8920: 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  .  sqlite3OsDele
8930: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
8940: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
8950: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
8960: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
8970: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
8980: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
8990: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
89a0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
89b0: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d  se(&master);.  }
89c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
89d0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72  ./*.** Make ever
89e0: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  y page in the ca
89f0: 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20 77  che agree with w
8a00: 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20  hat is on disk. 
8a10: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
8a20: 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20 64  .** reread the d
8a30: 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65  isk to reset the
8a40: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 61   state of the ca
8a50: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
8a60: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8a70: 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61  d after a rollba
8a80: 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65  ck in which some
8a90: 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63 61   of the dirty ca
8aa0: 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64  che.** pages had
8ab0: 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
8ac0: 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e  ten out to disk.
8ad0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
8ae0: 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61  l back the.** ca
8af0: 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  che content and 
8b00: 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  the easiest way 
8b10: 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f  to do that is to
8b20: 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20   reread the old 
8b30: 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20  content.** back 
8b40: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a  from the disk..*
8b50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
8b60: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
8b70: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8b80: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
8b90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8ba0: 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  OK;.  for(pPg=pP
8bb0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
8bc0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
8bd0: 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  ll){.    char zB
8be0: 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  uf[SQLITE_MAX_PA
8bf0: 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66  GE_SIZE];.    if
8c00: 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20  ( !pPg->dirty ) 
8c10: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8c20: 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
8c30: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
8c40: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
8c50: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
8c60: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
8c70: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6f 66 66  r->pageSize*(off
8c80: 5f 74 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  _t)(pPg->pgno-1)
8c90: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
8ca0: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
8cb0: 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
8cc0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8cd0: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  ;.      TRACE3("
8ce0: 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65 20  REFETCH %d page 
8cf0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
8d00: 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  d.h, pPg->pgno);
8d10: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
8d20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44  break;.      COD
8d30: 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c  EC(pPager, zBuf,
8d40: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a   pPg->pgno, 2);.
8d50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d60: 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
8d70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8d80: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
8d90: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
8da0: 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50  | memcmp(zBuf, P
8db0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
8dc0: 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
8dd0: 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  ize) ){.      me
8de0: 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
8df0: 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70  TA(pPg), zBuf, p
8e00: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8e10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
8e20: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
8e30: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
8e40: 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52  >xReiniter(PGHDR
8e50: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
8e60: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8e70: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8e80: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
8e90: 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
8ea0: 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
8eb0: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
8ec0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8ed0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
8ee0: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   0;.    pPg->dir
8ef0: 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
8f00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8f10: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d  * Truncate the m
8f20: 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20  ain file of the 
8f30: 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74  given pager to t
8f40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
8f50: 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e  es.** indicated.
8f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8f70: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
8f80: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
8f90: 20 6e 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72   nPage){.  retur
8fa0: 6e 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  n sqlite3OsTrunc
8fb0: 61 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ate(&pPager->fd,
8fc0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8fd0: 65 2a 28 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b  e*(off_t)nPage);
8fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
8ff0: 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
9000: 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
9010: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
9020: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
9030: 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
9040: 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
9050: 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
9060: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
9070: 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
9080: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
9090: 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
90a0: 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
90b0: 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
90c0: 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
90d0: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
90e0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
90f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
9100: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
9110: 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
9120: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
9130: 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
9140: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
9150: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
9160: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
9170: 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
9180: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
9190: 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
91a0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
91b0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
91c0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
91d0: 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
91e0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
91f0: 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
9200: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
9210: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
9220: 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
9230: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
9240: 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
9250: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
9260: 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 69  *  (5)  4 byte i
9270: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
9280: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9290: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
92a0: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
92b0: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
92c0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
92d0: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
92e0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
92f0: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
9300: 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20  al.).**  (6)  N 
9310: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
9320: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
9330: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
9340: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
9350: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
9360: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
9370: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
9380: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
9390: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
93a0: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
93b0: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
93c0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
93d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
93e0: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
93f0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
9400: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
9410: 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a  TF-8..**  (7)  Z
9420: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
9430: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
9440: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
9450: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
9460: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
9470: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
9480: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
9490: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
94a0: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
94b0: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
94c0: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
94d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
94e0: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
94f0: 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61 62  first 6 items ab
9500: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
9510: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
9520: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
9530: 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65 6d   of the 7th item
9540: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
9550: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
9560: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
9570: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
9580: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
9590: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
95a0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
95b0: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
95c0: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
95d0: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
95e0: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
95f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
9600: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
9610: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
9620: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
9630: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
9640: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
9650: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
9660: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
9670: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
9680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
9690: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
96a0: 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
96b0: 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
96c0: 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
96d0: 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
96e0: 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
96f0: 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
9700: 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
9710: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
9720: 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
9730: 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
9740: 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
9750: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
9760: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
9770: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
9780: 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
9790: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
97a0: 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
97b0: 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
97c0: 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
97d0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
97e0: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
97f0: 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
9800: 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
9810: 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
9820: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
9830: 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
9840: 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
9850: 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
9860: 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
9870: 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
9880: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
9890: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
98a0: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
98b0: 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
98c0: 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
98d0: 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
98e0: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
98f0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
9900: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
9910: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
9920: 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
9930: 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
9940: 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
9950: 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
9960: 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
9970: 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
9980: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
9990: 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
99a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
99b0: 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
99c0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
99d0: 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
99e0: 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
99f0: 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
9a00: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
9a10: 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
9a20: 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
9a30: 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
9a40: 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
9a50: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
9a60: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
9a70: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
9a80: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
9a90: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
9aa0: 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b  r){.  off_t szJ;
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ac0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
9ad0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
9ae0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
9af0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
9b00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
9b10: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
9b20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
9b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9b40: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9b50: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
9b60: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
9b70: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
9b80: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
9b90: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
9ba0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
9bb0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
9bc0: 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
9bd0: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
9be0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
9bf0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
9c00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9c10: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
9c20: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
9c30: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
9c40: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
9c50: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
9c60: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
9c70: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
9c80: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9c90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
9ca0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
9cb0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
9cc0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
9cd0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
9ce0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
9cf0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
9d00: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
9d10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9d20: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
9d30: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
9d40: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
9d50: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
9d60: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
9d70: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
9d80: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
9d90: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
9da0: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
9db0: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
9dc0: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
9dd0: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
9de0: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
9df0: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
9e00: 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67 65 72  rJournal(&pPager
9e10: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
9e20: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
9e30: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
9e40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9e50: 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26  OK || (zMaster &
9e60: 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  & !sqlite3OsFile
9e70: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29  Exists(zMaster))
9e80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
9e90: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
9ea0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
9eb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9ec0: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
9ed0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
9ee0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
9ef0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
9f00: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
9f10: 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   0);.  pPager->j
9f20: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
9f30: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
9f40: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
9f50: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
9f60: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
9f70: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
9f80: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
9f90: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
9fa0: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
9fb0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
9fc0: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
9fd0: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
9fe0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
9ff0: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
a000: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
a010: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
a020: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
a030: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
a040: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
a050: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
a060: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
a070: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
a080: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
a090: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
a0a0: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
a0b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
a0c0: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
a0d0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
a0e0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
a0f0: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
a100: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
a110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
a120: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
a130: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
a140: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a150: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
a160: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
a170: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
a180: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
a190: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
a1a0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
a1b0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
a1c0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
a1d0: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
a1e0: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
a1f0: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
a200: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
a210: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
a220: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
a230: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
a240: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
a250: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
a260: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
a270: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
a280: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
a290: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
a2a0: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
a2b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a2c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
a2d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
a2e0: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
a2f0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
a300: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
a310: 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
a320: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
a330: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
a340: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
a350: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
a360: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
a370: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
a380: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
a390: 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67  ack to it's orig
a3a0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
a3b0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
a3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
a3d0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
a3e0: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
a3f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
a400: 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70  igDbSize==0 || p
a410: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
a420: 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20  e==mxPg );.     
a430: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
a440: 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
a450: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
a460: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a470: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
a480: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
a490: 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
a4a0: 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
a4b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20     }..    /* rc 
a4c0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
a4d0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f  &pPager->jfd, JO
a4e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
a4f0: 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66  ger)); */.    if
a500: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a510: 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62  ) goto end_playb
a520: 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  ack;.  .    /* C
a530: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
a540: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
a550: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
a560: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
a570: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
a580: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
a590: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
a5a0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
a5b0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
a5c0: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
a5d0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
a5e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a5f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
a600: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
a610: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
a620: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
a630: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
a640: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
a650: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a660: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a670: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
a680: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
a690: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a6a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67   }.  }..  /* Pag
a6b0: 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
a6c0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
a6d0: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76   journal but nev
a6e0: 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77  er synced.  ** w
a6f0: 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65  here not restore
a700: 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62  d by the loop ab
a710: 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f  ove.  We have to
a720: 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20   restore those. 
a730: 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65 61   ** pages by rea
a740: 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66  ding them back f
a750: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
a760: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
a770: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
a780: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67  LITE_OK );.  pag
a790: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
a7a0: 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c  pPager);..end_pl
a7b0: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
a7c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a7d0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
a7e0: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
a7f0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61  );.  }.  if( zMa
a800: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
a810: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
a820: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
a830: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
a840: 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a  ll return true,.
a850: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
a860: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
a870: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
a880: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 65 72  r journal. If er
a890: 72 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f 63 63  rors .    ** occ
a8a0: 75 72 20 64 75 72 69 6e 67 20 74 68 69 73 20 70  ur during this p
a8b0: 72 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65 20 74  rocess, ignore t
a8c0: 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  hem..    */.    
a8d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a8e0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
a8f0: 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74  _delmaster(zMast
a900: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
a910: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
a920: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  r);.  }..  /* Th
a930: 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
a940: 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
a950: 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
a960: 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
a970: 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
a980: 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
a990: 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
a9a0: 64 69 66 66 65 72 65 6e 74 20 50 41 47 45 52 5f  different PAGER_
a9b0: 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a  SECTOR_SIZE.  **
a9c0: 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
a9d0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
a9e0: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
a9f0: 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70  rocess..  */.  p
aa00: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
aa10: 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52  e = PAGER_SECTOR
aa20: 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  _SIZE;.  return 
aa30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
aa40: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
aa50: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
aa60: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
aa70: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
aa80: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
aa90: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
aaa0: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
aab0: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
aac0: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
aad0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
aae0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
aaf0: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
ab00: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
ab10: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
ab20: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
ab30: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
ab40: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
ab50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
ab60: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
ab70: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
ab80: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
ab90: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
aba0: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
abb0: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
abc0: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
abd0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
abe0: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
abf0: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
ac00: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
ac10: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
ac20: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
ac30: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
ac40: 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20  Pager){.  off_t 
ac50: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
ac60: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
ac70: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
ac80: 2f 0a 20 20 6f 66 66 5f 74 20 68 64 72 4f 66 66  /.  off_t hdrOff
ac90: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  ;.  int nRec;   
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
acb0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
acc0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
acf0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
ad00: 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
ad10: 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65  urnalOff;.#ifnde
ad20: 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20  f NDEBUG .  {.  
ad30: 20 20 6f 66 66 5f 74 20 6f 73 5f 73 7a 4a 3b 0a    off_t os_szJ;.
ad40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ad50: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
ad60: 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a  er->jfd, &os_szJ
ad70: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
ad80: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
ad90: 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  n rc;.    assert
ada0: 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b  ( szJ==os_szJ );
adb0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
adc0: 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20  * Set hdrOff to 
add0: 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  be the offset to
ade0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
adf0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
ae00: 6e 0a 20 20 2a 2a 20 74 68 69 73 20 73 74 61 74  n.  ** this stat
ae10: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
ae20: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
ae30: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
ae40: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
ae50: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
ae60: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
ae70: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
ae80: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
ae90: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
aea0: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
aeb0: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
aec0: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
aed0: 0a 20 20 7d 0a 20 20 0a 0a 20 20 2f 2a 20 54 72  .  }.  ..  /* Tr
aee0: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
aef0: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
af00: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
af10: 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
af20: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
af30: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
af40: 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  ze);.  pPager->d
af50: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
af60: 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  stmtSize;..  /* 
af70: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
af80: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
af90: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
afa0: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
afb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
afc0: 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50  >stmtInUse && pP
afd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
afe0: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  n );.  sqlite3Os
aff0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74  Seek(&pPager->st
b000: 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d  fd, 0);.  nRec =
b010: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
b020: 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
b030: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
b040: 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
b050: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
b060: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
b070: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
b080: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
b090: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
b0a0: 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
b0b0: 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
b0c0: 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
b0d0: 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
b0e0: 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
b0f0: 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
b100: 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
b110: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
b120: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
b130: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
b140: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
b150: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
b160: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
b170: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
b180: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
b190: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b1a0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
b1b0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
b1c0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c   }..  /* Now rol
b1d0: 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63  l some pages bac
b1e0: 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  k from the trans
b1f0: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20  action journal. 
b200: 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a  Pager.stmtJSize.
b210: 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a    ** was the siz
b220: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
b230: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
b240: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
b250: 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65  arted, so.  ** e
b260: 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
b270: 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
b280: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69   rolled back, ei
b290: 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ther into the.  
b2a0: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
b2b0: 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f   memory cache, o
b2c0: 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
b2d0: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a  * If it is not z
b2e0: 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ero, then Pager.
b2f0: 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68  stmtHdrOff is th
b300: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
b310: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
b320: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
b330: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64  header written d
b340: 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65  uring this state
b350: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
b360: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
b370: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
b380: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
b390: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
b3a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b3b0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
b3c0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
b3d0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
b3e0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
b3f0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
b400: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
b410: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
b420: 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74  tCksum;.  assert
b430: 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ( JOURNAL_HDR_SZ
b440: 28 70 50 61 67 65 72 29 3c 28 70 50 61 67 65 72  (pPager)<(pPager
b450: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b  ->pageSize+8) );
b460: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
b470: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20  ->journalOff <= 
b480: 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d  (hdrOff-(pPager-
b490: 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b  >pageSize+8)) ){
b4a0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
b4b0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
b4c0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
b4d0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
b4e0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
b4f0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
b500: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b510: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
b520: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
b530: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
b540: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
b550: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52 65  J ){.    u32 nRe
b560: 63 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  c;.    u32 dummy
b570: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
b580: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
b590: 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64  , szJ, &nRec, &d
b5a0: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72  ummy);.    if( r
b5b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b5c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
b5d0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
b5e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
b5f0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
b600: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
b610: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  c==0 ){.      nR
b620: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
b630: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
b640: 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  / (pPager->pageS
b650: 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20  ize+8);.    }.  
b660: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
b670: 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  i>=0 && pPager->
b680: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
b690: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ; i--){.      rc
b6a0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
b6b0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
b6c0: 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  r, &pPager->jfd,
b6d0: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
b6e0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
b6f0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
b700: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b710: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
b720: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
b730: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
b740: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
b750: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
b760: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
b770: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b780: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
b790: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
b7a0: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
b7b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 20  QLITE_CORRUPT;  
b7c0: 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20  /* bkpt-CORRUPT 
b7d0: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
b7e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b7f0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a  ff = szJ;.    /*
b800: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
b810: 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  che(pPager); */.
b820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
b840: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
b850: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
b860: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
b870: 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  allowed..**.** T
b880: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
b890: 72 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74  r is the absolut
b8a0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d  e value of the m
b8b0: 78 50 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e  xPage parameter.
b8c0: 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73  .** If mxPage is
b8d0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e   negative, the n
b8e0: 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c  oSync flag is al
b8f0: 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20  so set.  noSync 
b900: 62 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c  bypasses.** call
b910: 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 53 79  s to sqlite3OsSy
b920: 6e 63 28 29 2e 20 20 54 68 65 20 70 61 67 65 72  nc().  The pager
b930: 20 72 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65   runs much faste
b940: 72 20 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e  r with noSync on
b950: 2c 0a 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20  ,.** but if the 
b960: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
b970: 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
b980: 65 20 69 73 20 61 6e 20 61 62 72 75 70 74 20 70  e is an abrupt p
b990: 6f 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65  ower .** failure
b9a0: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
b9b0: 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ile might be lef
b9c0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
b9d0: 74 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65  tent and.** unre
b9e0: 70 61 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20  pairable state. 
b9f0: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
ba00: 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65  3pager_set_cache
ba10: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
ba20: 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
ba30: 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 3d 30  .  if( mxPage>=0
ba40: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ba50: 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
ba60: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 69  >tempFile;.    i
ba70: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
ba80: 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
ba90: 53 79 6e 63 20 3d 20 30 3b 20 0a 20 20 7d 65 6c  Sync = 0; .  }el
baa0: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
bab0: 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  noSync = 1;.    
bac0: 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50 61 67 65  mxPage = -mxPage
bad0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78 50 61  ;.  }.  if( mxPa
bae0: 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>10 ){.    pPa
baf0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78  ger->mxPage = mx
bb00: 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
bb10: 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
bb20: 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e = 10;.  }.}../
bb30: 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
bb40: 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
bb50: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
bb60: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
bb70: 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
bb80: 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
bb90: 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
bba0: 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
bbb0: 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
bbc0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
bbd0: 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
bbe0: 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
bbf0: 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
bc00: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
bc10: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
bc20: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
bc30: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
bc40: 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
bc50: 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
bc60: 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
bc70: 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
bc80: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
bc90: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
bca0: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
bcb0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
bcc0: 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
bcd0: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
bce0: 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
bcf0: 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
bd00: 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
bd10: 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
bd20: 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
bd30: 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
bd50: 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
bd60: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
bd70: 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
bd80: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
bd90: 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
bda0: 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
bdb0: 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
bdc0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
bdd0: 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
bde0: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
bdf0: 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
be00: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
be10: 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
be20: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
be30: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
be40: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
be50: 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
be60: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
be70: 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
be80: 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
be90: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
bea0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
beb0: 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
bec0: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
bed0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bee0: 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
bef0: 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
bf00: 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
bf10: 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
bf20: 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
bf30: 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
bf40: 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
bf50: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
bf60: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
bf70: 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
bf80: 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
bf90: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
bfa0: 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
bfb0: 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
bfc0: 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
bfd0: 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
bfe0: 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
bff0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
c000: 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
c010: 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
c020: 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
c030: 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  3..*/.void sqlit
c040: 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65  e3pager_set_safe
c050: 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a  ty_level(Pager *
c060: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
c070: 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  l){.  pPager->no
c080: 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
c090: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
c0a0: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
c0b0: 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
c0c0: 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
c0d0: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
c0e0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
c0f0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
c100: 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
c110: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
c120: 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
c130: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
c140: 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a  le into zName.**
c150: 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20   (zName must be 
c160: 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f  at least SQLITE_
c170: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79  TEMPNAME_SIZE by
c180: 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74  tes long.)  Writ
c190: 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65  e.** the file de
c1a0: 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66  scriptor into *f
c1b0: 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
c1c0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
c1d0: 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  or some.** other
c1e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
c1f0: 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  e fail..**.** Th
c200: 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
c210: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
c220: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
c230: 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  e when it is.** 
c240: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
c250: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  c int sqlite3pag
c260: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72  er_opentemp(char
c270: 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20   *zFile, OsFile 
c280: 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  *fd){.  int cnt 
c290: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
c2a0: 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a   do{.    cnt--;.
c2b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d      sqlite3OsTem
c2c0: 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29  pFileName(zFile)
c2d0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c2e0: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
c2f0: 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b  e(zFile, fd, 1);
c300: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
c310: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
c320: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
c330: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
c340: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
c350: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
c360: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
c370: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c380: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
c390: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
c3a0: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
c3b0: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
c3c0: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
c3d0: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
c3e0: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
c3f0: 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
c400: 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  _get() and is on
c410: 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
c420: 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
c430: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
c440: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67  using sqlite3pag
c450: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  er_unref()..**.*
c460: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
c470: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
c480: 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
c490: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
c4a0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
c4b0: 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
c4c0: 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
c4d0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
c4e0: 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
c4f0: 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
c500: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
c510: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
c520: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
c530: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
c540: 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
c550: 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
c560: 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
c570: 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
c580: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
c590: 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
c5a0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
c5b0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
c5c0: 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a  open(.  Pager **
c5d0: 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
c5e0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
c5f0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
c600: 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
c610: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
c620: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
c630: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c640: 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
c650: 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
c660: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
c670: 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
c680: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
c690: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
c6a0: 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20 20 20  urnal           
c6b0: 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65 20 61  /* TRUE to use a
c6c0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
c6d0: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
c6e0: 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  /.){.  Pager *pP
c6f0: 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46  ager;.  char *zF
c700: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
c710: 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a  .  int nameLen;.
c720: 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20 69    OsFile fd;.  i
c730: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c740: 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  K;.  int i;.  in
c750: 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  t tempFile = 0;.
c760: 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
c770: 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
c780: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  = 0;.  char zTem
c790: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
c7a0: 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50  E_SIZE];..  *ppP
c7b0: 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  ager = 0;.  mems
c7c0: 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f  et(&fd, 0, sizeo
c7d0: 66 28 66 64 29 29 3b 0a 20 20 69 66 28 20 73 71  f(fd));.  if( sq
c7e0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
c7f0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
c800: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
c810: 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e    }.  if( zFilen
c820: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
c830: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73  [0] ){.    if( s
c840: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
c850: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
c860: 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
c870: 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61  1;.      zFullPa
c880: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  thname = sqliteS
c890: 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 20  trDup("");.     
c8a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c8b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c8c0: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
c8d0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
c8e0: 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  athname(zFilenam
c8f0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46  e);.      if( zF
c900: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
c910: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
c920: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
c930: 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  te(zFullPathname
c940: 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79  , &fd, &readOnly
c950: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c960: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
c970: 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
c980: 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
c990: 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  &fd);.    zFilen
c9a0: 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  ame = zTemp;.   
c9b0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
c9c0: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
c9d0: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
c9e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
c9f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ca00: 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
ca10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ca20: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
ca30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
ca40: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 72  lose(&fd);.    r
ca50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ca60: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  EM;.  }.  if( rc
ca70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ca80: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
ca90: 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  e(&fd);.    sqli
caa0: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
cab0: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
cac0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65  n rc;.  }.  name
cad0: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75  Len = strlen(zFu
cae0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70  llPathname);.  p
caf0: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61  Pager = sqliteMa
cb00: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50  lloc( sizeof(*pP
cb10: 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a  ager) + nameLen*
cb20: 33 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20  3 + 30 );.  if( 
cb30: 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pPager==0 ){.   
cb40: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
cb50: 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &fd);.    sqlite
cb60: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
cb70: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
cb80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cb90: 7d 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e  }.  TRACE3("OPEN
cba0: 20 25 64 20 25 73 5c 6e 22 2c 20 66 64 2e 68 2c   %d %s\n", fd.h,
cbb0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
cbc0: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
cbd0: 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
cbe0: 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67  Pager[1];.  pPag
cbf0: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d  er->zDirectory =
cc00: 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
cc10: 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ame[nameLen+1];.
cc20: 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
cc30: 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44  al = &pPager->zD
cc40: 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e  irectory[nameLen
cc50: 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50  +1];.  strcpy(pP
cc60: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
cc70: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
cc80: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
cc90: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46  ->zDirectory, zF
cca0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
ccb0: 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69  for(i=nameLen; i
ccc0: 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
ccd0: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
cce0: 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
ccf0: 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
cd00: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
cd10: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61   0;.  strcpy(pPa
cd20: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
cd30: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
cd40: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
cd50: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
cd60: 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  rcpy(&pPager->zJ
cd70: 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c  ournal[nameLen],
cd80: 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20   "-journal");.  
cd90: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
cda0: 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 70  .#if OS_UNIX.  p
cdb0: 50 61 67 65 72 2d 3e 66 64 2e 70 50 61 67 65 72  Pager->fd.pPager
cdc0: 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69   = pPager;.#endi
cdd0: 66 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f.  pPager->jour
cde0: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  nalOpen = 0;.  p
cdf0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
ce00: 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
ce10: 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
ce20: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
ce30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
ce40: 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61  InUse = 0;.  pPa
ce50: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20  ger->nRef = 0;. 
ce60: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
ce70: 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
ce80: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
ce90: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
cea0: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67  AGE_SIZE;.  pPag
ceb0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
cec0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
ced0: 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  JSize = 0;.  pPa
cee0: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
cef0: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
cf00: 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72   = 100;.  pPager
cf10: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
cf20: 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  UNLOCK;.  pPager
cf30: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20  ->errMask = 0;. 
cf40: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
cf50: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
cf60: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
cf70: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
cf80: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
cf90: 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Only;.  pPager->
cfa0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
cfb0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
cfc0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
cfd0: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
cfe0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
cff0: 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
d000: 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70  noSync?0:1);.  p
d010: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
d020: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
d030: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
d040: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
d050: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   0;.  pPager->nE
d060: 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20  xtra = nExtra;. 
d070: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
d080: 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54  ize = PAGER_SECT
d090: 4f 52 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65  OR_SIZE;.  pPage
d0a0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
d0b0: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50  = 0;.  memset(pP
d0c0: 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
d0d0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
d0e0: 48 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67  Hash));.  *ppPag
d0f0: 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
d100: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
d120: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
d130: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
d140: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
d150: 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50 61  t_busyhandler(Pa
d160: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73  ger *pPager, Bus
d170: 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
d180: 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65  andler){.  pPage
d190: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
d1a0: 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = pBusyHandler;.
d1b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
d1c0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
d1d0: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
d1e0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
d1f0: 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
d200: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
d210: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
d220: 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
d230: 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
d240: 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
d250: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
d260: 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
d270: 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
d280: 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
d290: 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
d2a0: 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
d2b0: 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
d2c0: 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
d2d0: 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
d2e0: 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
d2f0: 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
d300: 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67  ed by sqlite3pag
d310: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  er_unref()..*/.v
d320: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
d330: 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28  _set_destructor(
d340: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
d350: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69  oid (*xDesc)(voi
d360: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
d370: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
d380: 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
d390: 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
d3a0: 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
d3b0: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
d3c0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
d3d0: 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
d3e0: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
d3f0: 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
d400: 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
d410: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
d420: 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
d430: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
d440: 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
d450: 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
d460: 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
d470: 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
d480: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
d490: 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
d4a0: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
d4b0: 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
d4c0: 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
d4d0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
d4e0: 72 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  reiniter(Pager *
d4f0: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
d500: 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e  Reinit)(void*,in
d510: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
d520: 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
d530: 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
d540: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
d550: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
d560: 69 7a 65 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65  ize must only be
d570: 20 63 68 61 6e 67 65 64 20 77 68 65 6e 20 74 68   changed when th
d580: 65 20 63 61 63 68 65 20 69 73 20 65 6d 70 74 79  e cache is empty
d590: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d5a0: 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73  3pager_set_pages
d5b0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
d5c0: 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  r, int pageSize)
d5d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  {.  assert( page
d5e0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
d5f0: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
d600: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
d610: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d620: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  e = pageSize;.}.
d630: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
d640: 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
d650: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
d660: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
d670: 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
d680: 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
d690: 2e 20 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63  .  No error chec
d6a0: 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f  king is done..*/
d6b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
d6c0: 65 72 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64  er_read_filehead
d6d0: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
d6e0: 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
d6f0: 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
d700: 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
d710: 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 70 50 61  0, N);.  if( pPa
d720: 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 7b  ger->memDb==0 ){
d730: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
d740: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
d750: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  0);.    sqlite3O
d760: 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66  sRead(&pPager->f
d770: 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20  d, pDest, N);.  
d780: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
d790: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
d7a0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
d7b0: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
d7c0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
d7d0: 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  pPager..*/.int s
d7e0: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
d7f0: 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
d800: 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e 3b  ger){.  off_t n;
d810: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d820: 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
d830: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
d840: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
d850: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
d860: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  }.  if( sqlite3O
d870: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
d880: 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49  r->fd, &n)!=SQLI
d890: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
d8a0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
d8b0: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a  PAGER_ERR_DISK;.
d8c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d8d0: 7d 0a 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d  }.  n /= pPager-
d8e0: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28  >pageSize;.  if(
d8f0: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
d900: 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  && n==PENDING_BY
d910: 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
d920: 69 7a 65 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a  ize ){.    n++;.
d930: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
d940: 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
d950: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
d960: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
d970: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
d980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
d990: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
d9a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
d9b0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
d9c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  .../*.** Unlink 
d9d0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
d9e0: 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
d9f0: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
da00: 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
da10: 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
da20: 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
da30: 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
da40: 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
da50: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
da60: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
da70: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
da80: 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73  * Keep the pFirs
da90: 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20  tSynced pointer 
daa0: 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
dab0: 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a  first synchroniz
dac0: 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  ed page */.  if(
dad0: 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46   pPg==pPager->pF
dae0: 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
daf0: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
db00: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
db10: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
db20: 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
db30: 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
db40: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
db50: 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
db60: 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  }..  /* Unlink f
db70: 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
db80: 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
db90: 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
dba0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
dbb0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
dbc0: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65  >pNextFree;.  }e
dbd0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
dbe0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
dbf0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
dc00: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
dc10: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
dc20: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
dc30: 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  tFree ){.    pPg
dc40: 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
dc50: 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
dc60: 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  revFree;.  }else
dc70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
dc80: 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
dc90: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
dca0: 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
dcb0: 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50  evFree;.  }.  pP
dcc0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
dcd0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
dce0: 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  0;..  /* Unlink 
dcf0: 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
dd00: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66  sh table */.  if
dd10: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
dd20: 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
dd30: 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
dd40: 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
dd50: 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  sh;.  }.  if( pP
dd60: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a  g->pPrevHash ){.
dd70: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
dd80: 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
dd90: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
dda0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
ddb0: 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
ddc0: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
ddd0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
dde0: 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b  aHash[h]==pPg );
ddf0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
de00: 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65  sh[h] = pPg->pNe
de10: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70 50  xtHash;.  }.  pP
de20: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
de30: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
de40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
de50: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
de60: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20   to truncate an 
de70: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
de80: 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61  se.  Delete.** a
de90: 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
dea0: 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68  gno is larger th
deb0: 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
dec0: 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
ded0: 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65  enced..** Refere
dee0: 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
def0: 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
df00: 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
df10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
df20: 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
df30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
df40: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
df50: 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
df60: 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
df70: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
df80: 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
df90: 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
dfa0: 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
dfb0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
dfc0: 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
dfd0: 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
dfe0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
dff0: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
e000: 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
e010: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
e020: 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
e030: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
e040: 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
e050: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
e060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
e070: 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
e080: 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69  tAll;.      unli
e090: 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
e0a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
e0b0: 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
e0c0: 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
e0d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
e0e0: 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
e0f0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
e100: 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
e110: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e120: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
e130: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
e140: 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
e150: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 70 61   rc;.  sqlite3pa
e160: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
e170: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
e180: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
e190: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
e1a0: 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
e1b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
e1c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
e1d0: 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61  e>=(unsigned)pPa
e1e0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
e1f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e200: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
e210: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
e220: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
e230: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
e240: 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
e250: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
e260: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e270: 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  }.  rc = syncJou
e280: 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
e290: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e2a0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
e2b0: 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  rc;.  }.  rc = p
e2c0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
e2d0: 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
e2e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e2f0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
e300: 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
e310: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
e330: 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
e340: 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
e350: 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
e360: 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
e370: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
e380: 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
e390: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
e3a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
e3b0: 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
e3c0: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
e3d0: 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
e3e0: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
e3f0: 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
e400: 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
e410: 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
e420: 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
e430: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
e440: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
e450: 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
e460: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
e470: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
e480: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
e490: 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dump..*/.int sql
e4a0: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
e4b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
e4c0: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
e4d0: 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20  Next;.  switch( 
e4e0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b  pPager->state ){
e4f0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
e500: 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61  RESERVED:.    ca
e510: 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a  se PAGER_SYNCED:
e520: 20 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52   .    case PAGER
e530: 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20  _EXCLUSIVE: {.  
e540: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
e550: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
e560: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
e570: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
e580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
e590: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
e5a0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
e5b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
e5c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
e5d0: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
e5e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e5f0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
e600: 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  SHARED: {.      
e610: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
e620: 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Db ){.        sq
e630: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
e640: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
e650: 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
e660: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e670: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
e680: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
e690: 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ng */.      brea
e6a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
e6b0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
e6c0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
e6d0: 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44  ext){.#ifndef ND
e6e0: 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 50 61  EBUG.    if( pPa
e6f0: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
e700: 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
e710: 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
e720: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
e730: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e740: 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
e750: 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
e760: 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
e770: 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
e780: 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
e790: 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
e7a0: 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  dif.    pNext = 
e7b0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
e7c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
e7d0: 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32  g);.  }.  TRACE2
e7e0: 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70  ("CLOSE %d\n", p
e7f0: 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
e800: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
e810: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61  pPager->fd);.  a
e820: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
e830: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
e840: 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
e850: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
e860: 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
e870: 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
e880: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
e890: 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
e8a0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
e8b0: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
e8c0: 2a 20 7d 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  * }.  */.  if( p
e8d0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
e8e0: 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67 65 72  !=(char*)&pPager
e8f0: 5b 31 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [1] ){.    asser
e900: 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  t( 0 );  /* Cann
e910: 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  ot happen */.   
e920: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
e930: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
e940: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
e950: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
e960: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
e970: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
e980: 6f 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ory);.  }.  sqli
e990: 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
e9a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e9b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
e9c0: 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
e9d0: 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
e9e0: 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
e9f0: 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65  Pgno sqlite3page
ea00: 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69  r_pagenumber(voi
ea10: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
ea20: 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f  dr *p = DATA_TO_
ea30: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
ea40: 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
ea50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
ea60: 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
ea70: 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
ea80: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
ea90: 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
eaa0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
eab0: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
eac0: 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
ead0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
eae0: 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
eaf0: 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
eb00: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
eb10: 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
eb20: 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
eb30: 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
eb40: 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
eb50: 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
eb60: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
eb70: 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
eb80: 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
eb90: 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
eba0: 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
ebb0: 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
ebc0: 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
ebd0: 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
ebe0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
ebf0: 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
ec00: 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
ec10: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
ec20: 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
ec30: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
ec40: 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
ec50: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
ec60: 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
ec70: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
ec80: 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
ec90: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
eca0: 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
ecb0: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
ecc0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
ecd0: 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
ece0: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
ecf0: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
ed00: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
ed10: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
ed20: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
ed30: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
ed40: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
ed50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ed60: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
ed70: 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
ed80: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
ed90: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
eda0: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
edb0: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
edc0: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
edd0: 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
ede0: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
edf0: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
ee00: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
ee10: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
ee20: 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
ee30: 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
ee40: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
ee50: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
ee60: 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 76 6f  TEST.  static vo
ee70: 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
ee80: 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
ee90: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
eea0: 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
eeb0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
eec0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
eed0: 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e  f++;.      REFIN
eee0: 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  FO(pPg);.    }. 
eef0: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
ef00: 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20  e page_ref(P)   
ef10: 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70  ((P)->nRef==0?_p
ef20: 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64  age_ref(P):(void
ef30: 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65  )(P)->nRef++).#e
ef40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
ef50: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
ef60: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
ef70: 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
ef80: 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
ef90: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
efa0: 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
efb0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
efc0: 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  _ref(void *pData
efd0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
efe0: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
eff0: 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72  pData);.  page_r
f000: 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
f010: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f020: 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
f030: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65  ournal.  In othe
f040: 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
f050: 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
f060: 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
f070: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
f080: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
f090: 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
f0a0: 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
f0b0: 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20  he.** disk.  It 
f0c0: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d  is not safe to m
f0d0: 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e  odify the origin
f0e0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
f0f0: 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20   until after.** 
f100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
f110: 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66  been synced.  If
f120: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
f130: 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69  tabase is modifi
f140: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
f150: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
f160: 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66  ed and a power f
f170: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74  ailure occurs, t
f180: 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72  he unsynced jour
f190: 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c  nal.** data woul
f1a0: 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65  d be lost and we
f1b0: 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65   would be unable
f1c0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72   to completely r
f1d0: 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64  ollback the.** d
f1e0: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
f1f0: 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
f200: 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75  ption would occu
f210: 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  r..** .** This r
f220: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61  outine also upda
f230: 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65  tes the nRec fie
f240: 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ld in the header
f250: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
f260: 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74  .** (See comment
f270: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70  s on the pager_p
f280: 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
f290: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
f2a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a   information.).*
f2b0: 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f  * If the sync mo
f2c0: 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20  de is FULL, two 
f2d0: 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72  syncs will occur
f2e0: 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f  .  First the who
f2f0: 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73  le journal.** is
f300: 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68   synced, then th
f310: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
f320: 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20  updated, then a 
f330: 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75  second sync occu
f340: 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  rs..**.** For te
f350: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
f360: 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  s, we do not car
f370: 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
f380: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
f390: 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  after a power fa
f3a0: 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f  ilure, so sync o
f3b0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ccurs..**.** Thi
f3c0: 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
f3d0: 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
f3e0: 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
f3f0: 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
f400: 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
f410: 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
f420: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
f430: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
f440: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
f450: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
f460: 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
f470: 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
f480: 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
f490: 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
f4a0: 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
f4b0: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
f4c0: 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
f4d0: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
f4e0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
f4f0: 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
f500: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
f510: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
f520: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
f530: 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   );.      /* ass
f540: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
f550: 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
f560: 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
f570: 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
f580: 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
f590: 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
f5a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
f5b0: 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
f5c0: 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
f5d0: 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
f5e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
f5f0: 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
f600: 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
f610: 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
f620: 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
f630: 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
f640: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
f650: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
f660: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
f670: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
f680: 74 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72  t jSz;.        r
f690: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
f6a0: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
f6b0: 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20  fd, &jSz);.     
f6c0: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
f6d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
f6e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f6f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53  ->journalOff==jS
f700: 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
f710: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
f720: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
f730: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
f740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f750: 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
f760: 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
f770: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
f780: 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
f790: 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
f7a0: 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
f7b0: 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
f7c0: 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
f7d0: 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
f7e0: 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
f7f0: 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
f800: 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
f810: 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
f820: 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
f830: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
f840: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
f850: 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
f860: 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
f870: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
f880: 64 2e 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d.h);.          
f890: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
f8a0: 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
f8b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f8c0: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
f8d0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
f8e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
f8f0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
f900: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f910: 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
f920: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
f930: 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
f940: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
f950: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
f960: 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
f970: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
f980: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f990: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
f9a0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
f9b0: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20  rnalOff);.      
f9c0: 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
f9d0: 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
f9e0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
f9f0: 64 2e 68 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  d.h);.      rc =
fa00: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26   sqlite3OsSync(&
fa10: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
fa20: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
fa30: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
fa40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa50: 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
fa60: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
fa70: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
fa80: 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e    /* Erase the n
fa90: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f  eedSync flag fro
faa0: 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20  m every page..  
fab0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67    */.    for(pPg
fac0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
fad0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
fae0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
faf0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
fb00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
fb10: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
fb20: 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
fb30: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
fb40: 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
fb50: 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
fb60: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
fb70: 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
fb80: 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
fb90: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
fba0: 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
fbb0: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
fbc0: 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
fbd0: 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
fbe0: 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
fbf0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
fc00: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
fc10: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
fc20: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
fc30: 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
fc40: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
fc50: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
fc60: 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70  ynced==pPager->p
fc70: 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e  First );.  }.#en
fc80: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
fc90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
fca0: 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
fcb0: 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
fcc0: 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
fcd0: 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
fce0: 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
fcf0: 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
fd00: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
fd10: 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65  ile and mark the
fd20: 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61  m all.** as clea
fd30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
fd40: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
fd50: 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
fd60: 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
fd70: 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
fd80: 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a    int busy = 1;.
fd90: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
fda0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fdb0: 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
fdc0: 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
fdd0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
fde0: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
fdf0: 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
fe00: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
fe10: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
fe20: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
fe30: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
fe40: 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
fe50: 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
fe60: 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
fe70: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
fe80: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
fe90: 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
fea0: 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
feb0: 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
fec0: 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
fed0: 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
fee0: 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
fef0: 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
ff00: 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
ff10: 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
ff20: 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
ff30: 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
ff40: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
ff50: 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
ff60: 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
ff70: 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
ff80: 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
ff90: 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
ffa0: 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
ffb0: 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
ffc0: 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
ffd0: 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
ffe0: 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
fff0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
10000 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10010 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
10020 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
10030 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
10040 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
10050 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
10060 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
10070 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
10080 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
10090 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
100a0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
100b0 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
100c0 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
100d0 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
100e0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
100f0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
10100 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
10110 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
10120 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
10130 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
10140 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  /.  do {.    rc 
10150 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
10160 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  &pPager->fd, EXC
10170 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
10180 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
10190 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20 20  TE_BUSY && .    
101a0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
101b0 61 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20  andler && .     
101c0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
101d0 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20  ndler->xFunc && 
101e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
101f0 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75  BusyHandler->xFu
10200 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  nc(pPager->pBusy
10210 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62  Handler->pArg, b
10220 75 73 79 2b 2b 29 0a 20 20 29 3b 0a 20 20 69 66  usy++).  );.  if
10230 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10240 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10250 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10260 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
10270 43 4c 55 53 49 56 45 3b 0a 0a 20 20 77 68 69 6c  CLUSIVE;..  whil
10280 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  e( pList ){.    
10290 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64  assert( pList->d
102a0 69 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c 69  irty );.    sqli
102b0 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
102c0 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70  r->fd, (pList->p
102d0 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 70 50  gno-1)*(off_t)pP
102e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
102f0 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65  .    CODEC(pPage
10300 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
10310 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
10320 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 54 52  pgno, 6);.    TR
10330 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70  ACE3("STORE %d p
10340 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  age %d\n", pPage
10350 72 2d 3e 66 64 2e 68 2c 20 70 4c 69 73 74 2d 3e  r->fd.h, pList->
10360 70 67 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d 20  pgno);.    rc = 
10370 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
10380 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
10390 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
103a0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
103b0 7a 65 29 3b 0a 20 20 20 20 43 4f 44 45 43 28 70  ze);.    CODEC(p
103c0 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
103d0 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
103e0 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  st->pgno, 0);.  
103f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
10400 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
10410 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
10420 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
10430 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Dirty;.  }.  ret
10440 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10450 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20  ../*.** Collect 
10460 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65  every dirty page
10470 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69   into a dirty li
10480 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  st and.** return
10490 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
104a0 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c  e head of that l
104b0 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20  ist.  All pages 
104c0 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64  are.** collected
104d0 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
104e0 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a  e still in use..
104f0 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
10500 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64  *pager_get_all_d
10510 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72  irty_pages(Pager
10520 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
10530 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20  dr *p, *pList;. 
10540 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f   pList = 0;.  fo
10550 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
10560 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
10570 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ll){.    if( p->
10580 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  dirty ){.      p
10590 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74  ->pDirty = pList
105a0 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
105b0 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  p;.    }.  }.  r
105c0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
105d0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
105e0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
105f0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
10600 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
10610 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
10620 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75  rst page is acqu
10630 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72  ired. .** This r
10640 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70  ead lock is drop
10650 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ped when the las
10660 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
10670 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74  ed..**.** A _get
10680 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
10690 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
106a0 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
106b0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
106c0 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
106d0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
106e0 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
106f0 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
10700 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
10710 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
10720 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
10730 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
10740 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
10750 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
10760 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
10770 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
10780 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
10790 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
107a0 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
107b0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
107c0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
107d0 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
107e0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
107f0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
10800 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
10810 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
10820 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
10830 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
10840 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
10850 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61  e also sqlite3pa
10860 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42  ger_lookup().  B
10870 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
10880 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61   and _lookup() a
10890 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
108a0 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
108b0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
108c0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
108d0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
108e0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
108f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
10900 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
10910 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
10920 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75   _lookup().** ju
10930 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
10940 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
10950 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
10960 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
10970 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
10980 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
10990 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
109a0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
109b0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
109c0 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29   Since _lookup()
109d0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
109e0 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
109f0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
10a00 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
10a10 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
10a20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
10a30 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
10a40 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
10a50 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67   **ppPage){.  Pg
10a60 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
10a70 72 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  rc;..  /* Make s
10a80 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20  ure we have not 
10a90 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c  hit any critical
10aa0 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20   errors..  */ . 
10ab0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
10ac0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10ad0 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70 70  pgno!=0 );.  *pp
10ae0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
10af0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
10b00 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55  & ~(PAGER_ERR_FU
10b10 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LL) ){.    retur
10b20 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
10b30 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
10b40 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
10b50 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
10b60 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
10b70 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
10b80 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
10b90 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
10ba0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
10bb0 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==0 && !pPager->
10bc0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
10bd0 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 64   busy = 1;.    d
10be0 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
10bf0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
10c00 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
10c10 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 77 68 69  _LOCK);.    }whi
10c20 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
10c30 55 53 59 20 26 26 20 0a 20 20 20 20 20 20 20 20  USY && .        
10c40 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
10c50 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 20  dler && .       
10c60 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
10c70 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20  ndler->xFunc && 
10c80 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
10c90 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78  >pBusyHandler->x
10ca0 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75  Func(pPager->pBu
10cb0 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c  syHandler->pArg,
10cc0 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 29 3b 0a   busy++).    );.
10cd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10cf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10d00 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
10d10 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
10d20 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
10d30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
10d40 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
10d50 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
10d60 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
10d70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
10d80 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
10d90 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
10da0 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
10db0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10dc0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
10dd0 6e 61 6c 20 26 26 20 0a 20 20 20 20 20 20 20 20  nal && .        
10de0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
10df0 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
10e00 72 6e 61 6c 29 20 26 26 0a 20 20 20 20 20 20 20  rnal) &&.       
10e10 20 21 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b   !sqlite3OsCheck
10e20 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 26 70 50  ReservedLock(&pP
10e30 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 20 29  ager->fd) .    )
10e40 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b  {.       int rc;
10e50 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ..       /* Get 
10e60 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
10e70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
10e80 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
10e90 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
10ea0 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
10eb0 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20  that a RESERVED 
10ec0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61  lock is not obta
10ed0 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20  ined on the way 
10ee0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  to the.       **
10ef0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
10f00 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
10f10 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
10f20 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
10f30 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
10f40 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
10f50 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
10f60 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
10f70 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64   the.       ** d
10f80 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
10f90 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
10fa0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
10fb0 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a  ill rolling it .
10fc0 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a         ** back..
10fd0 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
10fe0 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
10ff0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
11000 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
11010 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
11020 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  e.       ** seco
11030 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20  nd process will 
11040 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  get to this poin
11050 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
11060 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20  d fail to.      
11070 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20   ** obtain it's 
11080 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
11090 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
110a0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  se file..       
110b0 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73  */.       rc = s
110c0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
110d0 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
110e0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
110f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11100 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11110 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
11120 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
11130 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
11140 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
11150 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
11160 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11170 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
11180 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
11190 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
111a0 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70  E;..       /* Op
111b0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
111c0 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
111d0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
111e0 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a  BUSY if.       *
111f0 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  * we are unable 
11200 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
11210 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
11220 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54    **.       ** T
11230 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11240 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
11250 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c   be locked itsel
11260 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a  f.  The.       *
11270 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
11280 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
11290 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
112a0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
112b0 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69  .       ** a wri
112c0 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72  te lock, so ther
112d0 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63  e is never any c
112e0 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20  hance of two or 
112f0 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70  more.       ** p
11300 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67  rocesses opening
11310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20   the journal at 
11320 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
11330 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11340 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
11350 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65  enReadOnly(pPage
11360 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
11370 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
11380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
113a0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
113b0 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  (&pPager->fd, NO
113c0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
113d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
113e0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
113f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
11400 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
11410 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
11420 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11430 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 1;.       pPag
11440 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
11450 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  ed = 0;.       p
11460 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11470 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  f = 0;.       pP
11480 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
11490 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 0;.       pPag
114a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
114b0 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50   0;..       /* P
114c0 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
114d0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
114e0 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
114f0 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20  se write.       
11500 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
11510 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
11520 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ock..       */. 
11530 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
11540 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
11550 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
11560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11570 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
11580 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  c;.       }.    
11590 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  }.    pPg = 0;. 
115a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
115b0 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69  earch for page i
115c0 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70  n cache */.    p
115d0 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
115e0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
115f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
11600 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72  >memDb && pPager
11610 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
11620 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
11630 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
11640 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
11650 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67   }.  }.  if( pPg
11660 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
11670 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
11680 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70   is not in the p
11690 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
116a0 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61    int h;.    pPa
116b0 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20  ger->nMiss++;.  
116c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
116d0 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61  age<pPager->mxPa
116e0 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46  ge || pPager->pF
116f0 69 72 73 74 3d 3d 30 20 7c 7c 20 70 50 61 67 65  irst==0 || pPage
11700 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
11710 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
11720 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  w page */.      
11730 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  pPg = sqliteMall
11740 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
11750 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  Pg) + pPager->pa
11760 67 65 53 69 7a 65 20 0a 20 20 20 20 20 20 20 20  geSize .        
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75        + sizeof(u
11790 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  32) + pPager->nE
117a0 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20  xtra.           
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 20 20 2b 20 70 50 61 67 65 72 2d 3e 6d 65 6d     + pPager->mem
117d0 44 62 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  Db*sizeof(PgHist
117e0 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ory) );.      if
117f0 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
11800 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
11810 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
11820 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69 74      pager_unwrit
11830 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
11840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11850 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
11860 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45   |= PAGER_ERR_ME
11870 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  M;.        retur
11880 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
11890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
118a0 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a  mset(pPg, 0, siz
118b0 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20  eof(*pPg));.    
118c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
118d0 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mDb ){.        m
118e0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48  emset(PGHDR_TO_H
118f0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
11900 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69  , 0, sizeof(PgHi
11910 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d  story));.      }
11920 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
11930 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
11940 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c     pPg->pNextAll
11950 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b   = pPager->pAll;
11960 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
11970 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  All = pPg;.     
11980 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b   pPager->nPage++
11990 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
119a0 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67     /* Find a pag
119b0 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
119c0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
119d0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
119e0 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69  t.      ** requi
119f0 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66  re us to do an f
11a00 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f  sync() on the jo
11a10 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  urnal..      */.
11a20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67        pPg = pPag
11a30 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11a40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77  ;..      /* If w
11a50 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  e could not find
11a60 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
11a70 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
11a80 20 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20 2a   fsync().      *
11a90 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
11aa0 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
11ab0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11ac0 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
11ad0 20 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77      ** very slow
11ae0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77   operation, so w
11af0 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61  e work hard to a
11b00 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f  void it.  But so
11b10 6d 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a  metimes.      **
11b20 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c   it can't be hel
11b30 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ped..      */.  
11b40 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
11b50 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  {.        int rc
11b60 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
11b70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
11b80 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
11b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
11ba0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
11bb0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
11bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11bd0 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ERR;.        }. 
11be0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
11bf0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
11c00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
11c10 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
11c20 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f  , write a new jo
11c30 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74  urnal header int
11c40 6f 20 74 68 65 0a 09 20 20 2a 2a 20 6a 6f 75 72  o the..  ** jour
11c50 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69  nal file. This i
11c60 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20  s done to avoid 
11c70 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  ever modifying a
11c80 20 6a 6f 75 72 6e 61 6c 0a 09 20 20 2a 2a 20 68   journal..  ** h
11c90 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e  eader that is in
11ca0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f  volved in the ro
11cb0 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20  llback of pages 
11cc0 74 68 61 74 20 68 61 76 65 0a 09 20 20 2a 2a 20  that have..  ** 
11cd0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
11ce0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
11cf0 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68  base (in case th
11d00 65 20 68 65 61 64 65 72 20 69 73 0a 09 20 20 2a  e header is..  *
11d10 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74  * trashed when t
11d20 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
11d30 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20   updated)..     
11d40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11d50 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
11d60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   0;.          as
11d70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
11d80 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a  urnalOff > 0 );.
11d90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
11da0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
11db0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
11dc0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
11dd0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11de0 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
11df0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
11e00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11e10 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
11e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
11e30 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70  .        pPg = p
11e40 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20  Pager->pFirst;. 
11e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
11e60 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
11e70 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  0 );..      /* W
11e80 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
11e90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11ea0 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
11eb0 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
11ec0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
11ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
11ee0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
11ef0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
11f00 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
11f10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
11f20 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
11f30 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  st( pPg );.     
11f40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11f60 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
11f70 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
11f80 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
11f90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
11fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11fb0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
11fc0 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
11fd0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
11fe0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
11ff0 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
12000 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
12010 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ack, then.      
12020 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
12030 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
12040 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
12050 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  bling the.      
12060 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72  ** sqlite_dont_r
12070 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
12080 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
12090 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
120a0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
120b0 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
120c0 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
120d0 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
120e0 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
120f0 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67  ack.      ** mig
12100 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
12110 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
12120 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
12130 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
12140 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  er.      ** that
12150 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
12160 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
12170 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
12180 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
12190 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65       ** be marke
121a0 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
121b0 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
121c0 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   out..      */. 
121d0 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c       if( pPg->al
121e0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
121f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
12200 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
12210 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
12220 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65     /* Unlink the
12230 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
12240 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
12250 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
12260 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
12270 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
12280 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f        pPager->nO
12290 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  vfl++;.    }.   
122a0 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
122b0 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  o;.    if( pPage
122c0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->aInJournal &&
122d0 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
122e0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
122f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
12300 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65  heckMemory(pPage
12310 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->aInJournal, p
12320 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73  gno/8);.      as
12330 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
12340 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
12350 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
12360 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e  l = (pPager->aIn
12370 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20  Journal[pgno/8] 
12380 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
12390 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  !=0;.      pPg->
123a0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
123b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
123c0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
123d0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
123e0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
123f0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
12400 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e  ->aInStmt && (in
12410 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
12420 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20  stmtSize.       
12430 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72        && (pPager
12440 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38  ->aInStmt[pgno/8
12450 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
12460 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
12470 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
12480 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
12490 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65  else{.      page
124a0 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
124b0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
124c0 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74   }.    pPg->dirt
124d0 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 0;.    pPg->
124e0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45  nRef = 1;.    RE
124f0 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20  FINFO(pPg);.    
12500 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
12510 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61      h = pager_ha
12520 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50  sh(pgno);.    pP
12530 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
12540 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
12550 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
12560 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
12570 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
12580 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ash ){.      ass
12590 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
125a0 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  ash->pPrevHash==
125b0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  0 );.      pPg->
125c0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
125d0 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
125e0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
125f0 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
12600 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
12610 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
12620 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
12630 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
12640 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
12650 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
12660 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
12670 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
12680 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12690 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
126a0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
126b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
126c0 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
126d0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
126e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
126f0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
12700 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20  e<(int)pgno ){. 
12710 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
12720 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
12730 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
12740 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
12750 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
12760 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
12770 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
12780 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
12790 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
127a0 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f  , (pgno-1)*(off_
127b0 74 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  t)pPager->pageSi
127c0 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ze);.      rc = 
127d0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
127e0 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
127f0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
12800 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
12810 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  ;.      TRACE3("
12820 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
12830 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
12840 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  h, pPg->pgno);. 
12850 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
12860 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
12870 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  (pPg), pPg->pgno
12880 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 3);.      if( 
12890 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
128a0 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 66  .        off_t f
128b0 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ileSize;.       
128c0 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
128d0 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
128e0 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53  fd,&fileSize)!=S
128f0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
12900 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53          || fileS
12910 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72  ize>=pgno*pPager
12920 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
12930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
12940 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52  ager_unref(PGHDR
12950 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a  _TO_DATA(pPg));.
12960 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12970 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   rc;.        }el
12980 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
12990 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
129a0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
129b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
129c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
129d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
129e0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
129f0 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
12a00 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
12a10 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
12a20 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f  Hit++;.    page_
12a30 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
12a40 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f  *ppPage = PGHDR_
12a50 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
12a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12a70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
12a80 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
12a90 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
12aa0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
12ab0 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
12ac0 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
12ad0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
12ae0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12af0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
12b00 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
12b10 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
12b20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
12b30 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  3pager_get().  T
12b40 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
12b50 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
12b60 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
12b70 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20  3pager_get() is 
12b80 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
12b90 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
12ba0 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
12bb0 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
12bc0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
12bd0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
12be0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
12bf0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
12c00 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
12c10 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
12c20 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
12c30 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
12c40 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
12c50 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
12c60 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
12c70 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
12c80 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
12c90 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
12ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
12cb0 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  o!=0 );.  if( pP
12cc0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
12cd0 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
12ce0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
12cf0 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70  0;.  }.  pPg = p
12d00 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
12d10 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
12d20 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
12d30 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
12d40 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg);.  return PG
12d50 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
12d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
12d70 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
12d80 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
12d90 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
12da0 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
12db0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
12dc0 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
12dd0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
12de0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
12df0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
12e00 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
12e10 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
12e20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
12e30 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
12e40 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
12e50 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
12e60 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  3pager_unref(voi
12e70 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
12e80 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
12e90 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
12ea0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
12eb0 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
12ec0 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
12ed0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
12ee0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
12ef0 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
12f00 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
12f10 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
12f20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12f30 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
12f40 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
12f50 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
12f60 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
12f70 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
12f80 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
12f90 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
12fa0 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
12fb0 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
12fc0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
12fd0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
12fe0 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
12ff0 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
13000 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
13010 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
13020 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
13030 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
13040 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
13050 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
13060 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
13070 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
13080 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
13090 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
130a0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
130b0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
130c0 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
130d0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
130e0 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
130f0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
13100 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
13110 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
13120 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
13130 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
13140 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
13150 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
13160 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
13170 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
13180 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
13190 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
131a0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
131b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
131c0 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
131d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
131e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
131f0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
13200 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
13210 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
13220 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
13230 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
13240 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13250 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
13260 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
13270 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
13280 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
13290 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
132a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
132b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
132c0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
132d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
132e0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
132f0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
13300 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
13310 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
13320 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
13330 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
13340 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
13350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13360 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
13370 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
13380 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
13390 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
133a0 6d 65 6d 44 62 20 29 3b 0a 20 20 61 73 73 65 72  memDb );.  asser
133b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
133c0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
133d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
133e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
133f0 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
13400 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
13410 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74 65  rnal );.  sqlite
13420 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
13430 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
13440 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
13450 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
13460 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
13470 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
13480 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
13490 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
134a0 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
134b0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
134c0 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
134d0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
134e0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
134f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13500 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
13510 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
13520 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
13530 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
13540 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  ,pPager->tempFil
13550 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  e);.  pPager->jo
13560 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13570 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
13580 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
13590 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
135a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
135b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
135c0 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
135d0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
135e0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
135f0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  al = 0;.    sqli
13600 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
13610 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
13620 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
13630 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
13640 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
13650 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71  urn rc;.  }.  sq
13660 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
13670 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  tory(pPager->zDi
13680 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72  rectory, &pPager
13690 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
136a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
136b0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
136c0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
136d0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
136e0 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
136f0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
13700 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
13710 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
13720 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
13730 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
13740 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
13750 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
13760 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
13770 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
13780 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
13790 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
137a0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
137b0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
137c0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
137d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
137e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
137f0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
13800 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
13810 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13820 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
13830 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
13840 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
13850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13860 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13870 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
13880 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
13890 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  c;  .}../*.** Ac
138a0 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
138b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
138c0 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
138d0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
138e0 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
138f0 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
13900 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
13910 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
13920 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
13930 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
13940 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73  er_rollback() is
13950 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
13960 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
13970 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
13980 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
13990 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73  pager_unref() is
139a0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76   called to on ev
139b0 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ery outstanding 
139c0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
139d0 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
139e0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
139f0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
13a00 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66  any open page of
13a10 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13a20 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20   file.  Nothing 
13a30 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68  changes about th
13a40 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75  e page - it is u
13a50 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a  sed merely to.**
13a60 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74   acquire a point
13a70 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
13a80 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73  structure and as
13a90 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72   proof that ther
13aa0 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20  e is.** already 
13ab0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
13ac0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
13ad0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61  ** The second pa
13ae0 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
13af0 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  s how much space
13b00 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73   in bytes to res
13b10 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61  erve for a.** ma
13b20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13b30 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74  e-name at the st
13b40 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
13b50 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72  al when it is cr
13b60 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  eated..**.** A j
13b70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
13b80 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73  pened if this is
13b90 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
13ba0 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70   file.  For temp
13bb0 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20  orary.** files, 
13bc0 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74  the opening of t
13bd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13be0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
13bf0 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a  l there is an.**
13c00 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
13c10 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
13c20 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rnal..**.** If t
13c30 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
13c40 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20  lready reserved 
13c50 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69  for writing, thi
13c60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13c70 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
13c80 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28  ite3pager_begin(
13c90 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
13ca0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
13cb0 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
13cc0 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
13cd0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
13ce0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13cf0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
13d00 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
13d10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13d20 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
13d30 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
13d40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
13d50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
13d60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13d70 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
13d80 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
13d90 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
13da0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13db0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
13dc0 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
13dd0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
13de0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
13df0 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
13e00 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
13e10 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 20 20 20  ERVED_LOCK.     
13e20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20   int busy = 1;. 
13e30 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
13e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13e50 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
13e60 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
13e70 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
13e80 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
13e90 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70 50  && .          pP
13ea0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
13eb0 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  er && .         
13ec0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
13ed0 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20  ndler->xFunc && 
13ee0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
13ef0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
13f00 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70  >xFunc(pPager->p
13f10 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72  BusyHandler->pAr
13f20 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 20  g, busy++).     
13f30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
13f40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
13f50 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
13f60 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
13f70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
13f80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13f90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
13fa0 64 6f 20 6e 6f 74 20 63 61 6c 6c 20 74 68 65 20  do not call the 
13fb0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
13fc0 6e 20 77 65 20 66 61 69 6c 20 74 6f 20 67 65 74  n we fail to get
13fd0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
13fe0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
13ff0 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 77 65 20   only reason we 
14000 6d 69 67 68 74 20 66 61 69 6c 20 69 73 20 62 65  might fail is be
14010 63 61 75 73 65 20 61 6e 6f 74 68 65 72 20 70 72  cause another pr
14020 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
14030 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
14040 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
14050 42 75 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  But the other pr
14060 6f 63 65 73 73 20 77 69 6c 6c 20 6e 6f 74 20 62  ocess will not b
14070 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  e able to.      
14080 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 73    ** release its
14090 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 75   reserved lock u
140a0 6e 74 69 6c 20 74 68 69 73 20 70 72 6f 63 65 73  ntil this proces
140b0 73 20 72 65 6c 65 61 73 65 73 20 69 74 73 20 73  s releases its s
140c0 68 61 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  hared.        **
140d0 20 6c 6f 63 6b 2e 20 20 53 6f 20 77 65 20 6d 69   lock.  So we mi
140e0 67 68 74 20 61 73 20 77 65 6c 6c 20 66 61 69 6c  ght as well fail
140f0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
14100 2c 20 6c 65 74 20 69 74 20 72 65 6c 65 61 73 65  , let it release
14110 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20  .        ** its 
14120 73 68 61 72 65 64 20 6c 6f 63 6b 20 73 6f 20 74  shared lock so t
14130 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
14140 6f 63 65 73 73 20 63 61 6e 20 63 6f 6d 6d 69 74  ocess can commit
14150 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
14160 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
14180 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
14190 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
141a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
141b0 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
141c0 20 20 54 52 41 43 45 32 28 22 54 52 41 4e 53 41    TRACE2("TRANSA
141d0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 70 50 61  CTION %d\n", pPa
141e0 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
141f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
14200 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
14210 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
14220 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
14230 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
14240 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14250 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
14260 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14270 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
14280 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
14290 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
142a0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
142b0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
142c0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
142d0 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
142e0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
142f0 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
14300 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
14310 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
14320 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
14330 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14340 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
14350 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
14360 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
14370 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
14380 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
14390 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
143a0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
143b0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
143c0 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
143d0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
143e0 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
143f0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
14400 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
14410 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
14420 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
14430 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
14440 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
14450 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
14460 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
14470 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
14480 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
14490 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
144a0 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
144b0 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
144c0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
144d0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
144e0 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
144f0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
14500 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
14510 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
14520 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
14530 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
14540 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
14550 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
14560 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
14570 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67 65  ) or sqlite3page
14580 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  r_rollback() to.
14590 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74  ** reset..*/.int
145a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
145b0 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ite(void *pData)
145c0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
145d0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
145e0 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
145f0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
14600 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
14610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
14620 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
14630 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
14640 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b  ager->errMask ){
14650 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67   .    return pag
14660 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
14670 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
14680 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
14690 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
146a0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
146b0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
146c0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
146d0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
146e0 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
146f0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
14700 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
14710 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
14720 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
14730 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
14740 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  away..  */.  pPg
14750 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69  ->dirty = 1;.  i
14760 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
14770 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d  l && (pPg->inStm
14780 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  t || pPager->stm
14790 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
147a0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
147b0 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 72 65  ache = 1;.    re
147c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
147d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
147e0 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
147f0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14800 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
14810 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  .  ** written to
14820 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14830 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
14840 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
14850 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  al.  ** or both.
14860 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73 74  .  **.  ** First
14870 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
14880 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
14890 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
148a0 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61 74  s and.  ** creat
148b0 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
148c0 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
148d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
148e0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
148f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
14900 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61  3pager_begin(pDa
14910 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ta);.  if( rc!=S
14920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
14940 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14950 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
14960 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20  SERVED );.  if( 
14970 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
14980 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
14990 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
149a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
149b0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
149c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
149d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
149e0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
149f0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14a00 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67  nalOpen || !pPag
14a10 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
14a20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74  ;.  pPager->dirt
14a30 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 2f  yCache = 1;..  /
14a40 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
14a50 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
14a60 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
14a70 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
14a80 6e 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45  n.  ** EXCLUSIVE
14a90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
14aa0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
14ab0 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
14ac0 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 2a 2a  ent page to.  **
14ad0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14ae0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
14af0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
14b00 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ady..  */.  if( 
14b10 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
14b20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a  && (pPager->useJ
14b30 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
14b40 2d 3e 6d 65 6d 44 62 29 20 29 7b 0a 20 20 20 20  ->memDb) ){.    
14b50 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
14b60 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
14b70 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
14b80 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
14b90 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20    u32 saved;.   
14ba0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
14bb0 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emDb ){.        
14bc0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
14bd0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
14be0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
14bf0 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a         TRACE3("J
14c00 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
14c10 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
14c20 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  .h, pPg->pgno);.
14c30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14c40 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
14c50 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
14c60 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65  ->pOrig = sqlite
14c70 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
14c80 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
14c90 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
14ca0 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
14cb0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
14cc0 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f  t->pOrig, PGHDR_
14cd0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
14ce0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
14cf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14d10 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
14d20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
14d30 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
14d40 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 63  o, 7);.        c
14d50 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
14d60 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  um(pPager, pPg->
14d70 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20  pgno, pData);.  
14d80 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28        saved = *(
14d90 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58  u32*)PGHDR_TO_EX
14da0 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
14db0 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33  ;.        store3
14dc0 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67  2bits(cksum, pPg
14dd0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
14de0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 50  ze);.        szP
14df0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
14e00 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
14e10 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d  store32bits(pPg-
14e20 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b  >pgno, pPg, -4);
14e30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14e40 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
14e50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68  ager->jfd, &((ch
14e60 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20  ar*)pData)[-4], 
14e70 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70  szPg);.        p
14e80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14e90 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20  f += szPg;.     
14ea0 20 20 20 54 52 41 43 45 34 28 22 4a 4f 55 52 4e     TRACE4("JOURN
14eb0 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
14ec0 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
14ee0 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d  ager->fd.h, pPg-
14ef0 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
14f00 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 43  Sync);.        C
14f10 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
14f20 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30  ta, pPg->pgno, 0
14f30 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 75 33 32  );.        *(u32
14f40 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  *)PGHDR_TO_EXTRA
14f50 28 70 50 67 2c 20 70 50 61 67 65 72 29 20 3d 20  (pPg, pPager) = 
14f60 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69  saved;.        i
14f70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
14f90 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
14fa0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
14fb0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
14fc0 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
14fd0 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
14fe0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15000 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
15010 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15020 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
15030 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
15040 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
15050 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
15060 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
15070 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 70  no&7);.        p
15080 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
15090 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
150a0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
150b0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
150c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
150d0 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
150e0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
150f0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
15100 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f         page_add_
15110 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
15120 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15130 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
15140 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
15150 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
15160 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
15170 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
15180 3b 0a 20 20 20 20 20 20 54 52 41 43 45 34 28 22  ;.      TRACE4("
15190 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
151a0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
151b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
151c0 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50  pPager->fd.h, pP
151d0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
151e0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 20  edSync);.    }. 
151f0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
15200 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 50  Sync ){.      pP
15210 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
15220 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
15230 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
15240 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15250 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
15260 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
15270 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
15280 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65   in it,.  ** the
15290 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
152a0 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
152b0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
152c0 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
152d0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
152e0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
152f0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
15300 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
15310 6c 20 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 69 6e  l format.  ** in
15320 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
15330 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
15340 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 2a   the header..  *
15350 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
15360 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
15370 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
15380 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
15390 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
153a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
153b0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
153c0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
153d0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
153e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
153f0 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
15400 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
15410 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
15420 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
15430 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15440 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
15450 29 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e  );.      pHist->
15460 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  pStmt = sqliteMa
15470 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
15480 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
15490 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
154a0 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  tmt ){.        m
154b0 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74  emcpy(pHist->pSt
154c0 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  mt, PGHDR_TO_DAT
154d0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
154e0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
154f0 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33 28   }.      TRACE3(
15500 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
15510 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 61   page %d\n", pPa
15520 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d 3e  ger->fd.h, pPg->
15530 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pgno);.    }else
15540 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 33 32 62  {.      store32b
15550 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  its(pPg->pgno, p
15560 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 43  Pg, -4);.      C
15570 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
15580 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
15590 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
155a0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
155b0 61 67 65 72 2d 3e 73 74 66 64 2c 20 28 28 63 68  ager->stfd, ((ch
155c0 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20 70 50  ar*)pData)-4, pP
155d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
155e0 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
155f0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
15600 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 61   page %d\n", pPa
15610 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d 3e  ger->fd.h, pPg->
15620 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44  pgno);.      COD
15630 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
15640 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b  , pPg->pgno, 0);
15650 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15670 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
15680 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
15690 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
156a0 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
156b0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20  GER_ERR_FULL;.  
156c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
156d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
156e0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b  Pager->stmtNRec+
156f0 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
15700 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
15710 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  !=0 );.      pPa
15720 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
15730 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
15740 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
15750 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f 61 64     }.    page_ad
15760 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
15770 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  Pg);.  }..  /* U
15780 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
15790 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
157a0 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
157b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
157c0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
157d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
157e0 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
157f0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
15800 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72  >memDb && pPager
15810 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e  ->dbSize==PENDIN
15820 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
15830 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
15840 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b   pPager->dbSize+
15850 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
15860 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15870 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
15880 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
15890 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
158a0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
158b0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
158c0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
158d0 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
158e0 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
158f0 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
15900 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
15910 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
15920 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15930 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
15940 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  e(void *pData){.
15950 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
15960 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
15970 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ta);.  return pP
15980 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  g->dirty;.}../*.
15990 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
159a0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67  ontent of a sing
159b0 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65  le page with the
159c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
159d0 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67  the third.** arg
159e0 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
159f0 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77  lite3pager_overw
15a00 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
15a10 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
15a20 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76  oid *pData){.  v
15a30 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  oid *pPage;.  in
15a40 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  t rc;..  rc = sq
15a50 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
15a60 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
15a70 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
15a80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
15aa0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
15ab0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15ac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15ad0 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44  memcpy(pPage, pD
15ae0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
15af0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
15b00 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
15b10 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d  nref(pPage);.  }
15b20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15b30 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
15b40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
15b50 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
15b60 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
15b70 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
15b80 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
15b90 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
15ba0 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
15bb0 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
15bc0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
15bd0 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
15be0 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
15bf0 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
15c00 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
15c10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
15c20 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
15c30 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
15c40 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
15c50 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
15c60 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
15c70 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
15c80 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
15c90 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
15ca0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
15cb0 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
15cc0 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
15cd0 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
15ce0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
15cf0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  _rollback() belo
15d00 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
15d10 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
15d20 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
15d30 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
15d40 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
15d50 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
15d60 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
15d70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15d80 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
15d90 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
15da0 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
15db0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
15dc0 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  s to sqlite3page
15dd0 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
15de0 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
15df0 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
15e00 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
15e10 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
15e20 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
15e30 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
15e40 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
15e50 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
15e60 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
15e70 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
15e80 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
15e90 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
15ea0 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
15eb0 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
15ec0 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
15ed0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
15ee0 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
15ef0 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
15f00 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
15f10 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
15f20 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
15f30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15f40 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
15f50 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72  d,.** the dont_r
15f60 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
15f70 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
15f80 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  t because the pa
15f90 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63  ge contains.** c
15fa0 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
15fb0 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
15fc0 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72  e sure it gets r
15fd0 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
15fe0 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f  ite.** of the do
15ff0 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61  nt_rollback() ca
16000 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
16010 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  te3pager_dont_wr
16020 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
16030 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
16040 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
16050 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
16060 62 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70  b ) return;..  p
16070 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
16080 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
16090 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  .  pPg->alwaysRo
160a0 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66  llback = 1;.  if
160b0 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69  ( pPg && pPg->di
160c0 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  rty ){.    if( p
160d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
160e0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
160f0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
16100 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
16110 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
16120 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
16130 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
16140 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
16150 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
16160 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
16170 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
16180 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
16190 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
161a0 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
161b0 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
161c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
161d0 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
161e0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
161f0 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
16200 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
16210 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
16220 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
16230 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
16240 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
16250 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
16260 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
16270 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
16280 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
16290 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
162a0 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
162b0 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
162c0 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
162d0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
162e0 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
162f0 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
16300 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
16310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16320 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52   TRACE3("DONT_WR
16330 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
16340 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70 50 61 67  d\n", pgno, pPag
16350 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20  er->fd.h);.     
16360 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
16370 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
16380 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
16390 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
163a0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
163b0 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
163c0 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
163d0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
163e0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
163f0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
16400 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
16410 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
16420 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
16430 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
16440 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
16450 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
16460 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nal..*/.void sql
16470 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
16480 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44  ollback(void *pD
16490 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
164a0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
164b0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
164c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
164d0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28  ->pPager;..  if(
164e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
164f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
16500 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
16510 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
16520 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
16530 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
16540 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
16550 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
16560 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74 75 72  r->memDb ) retur
16570 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  n;.  if( !pPg->i
16580 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
16590 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
165a0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
165b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
165c0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
165d0 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  al!=0 );.    pPa
165e0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
165f0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
16600 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
16610 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  ;.    pPg->inJou
16620 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66  rnal = 1;.    if
16630 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
16640 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Use ){.      pPa
16650 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
16660 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
16670 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
16680 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
16690 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
166a0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
166b0 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  3("DONT_ROLLBACK
166c0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
166d0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ", pPg->pgno, pP
166e0 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 7d  ager->fd.h);.  }
166f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
16700 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  tmtInUse && !pPg
16710 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  ->inStmt && (int
16720 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
16730 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a  er->stmtSize ){.
16740 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
16750 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
16760 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
16770 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
16780 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
16790 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
167a0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
167b0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
167c0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
167d0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
167e0 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
167f0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d  list(pPg);.  }.}
16800 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  .../*.** Clear a
16810 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b   PgHistory block
16820 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16830 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48  clearHistory(PgH
16840 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a  istory *pHist){.
16850 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
16860 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71  st->pOrig);.  sq
16870 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
16880 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d  pStmt);.  pHist-
16890 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48  >pOrig = 0;.  pH
168a0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
168b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
168c0 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
168d0 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
168e0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
168f0 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
16900 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
16910 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
16920 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
16930 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
16940 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
16950 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
16960 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
16970 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
16980 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
16990 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
169a0 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  ger_commit(Pager
169b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
169c0 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
169d0 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
169e0 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52  ->errMask==PAGER
169f0 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
16a00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
16a10 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
16a20 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
16a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16a40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16a50 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  FULL;.    }.    
16a60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
16a70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
16a80 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
16a90 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
16aa0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
16ab0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
16ac0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
16ad0 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
16ae0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16af0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
16b00 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  .  TRACE2("COMMI
16b10 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d  T %d\n", pPager-
16b20 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50  >fd.h);.  if( pP
16b30 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
16b40 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
16b50 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
16b60 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
16b70 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20  while( pPg ){.  
16b80 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
16b90 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
16ba0 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
16bb0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
16bc0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
16bd0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
16be0 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
16bf0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
16c00 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
16c10 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
16c20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
16c30 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23  >pDirty;.    }.#
16c40 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
16c50 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
16c60 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
16c70 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
16c80 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
16c90 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
16ca0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
16cb0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
16cc0 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73  rt( !pPg->always
16cd0 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
16ce0 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
16cf0 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
16d00 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
16d10 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a  >pStmt );.    }.
16d20 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65  #endif.    pPage
16d30 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
16d40 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16d50 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
16d60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16d70 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
16d80 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
16d90 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  he==0 ){.    /* 
16da0 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68  Exit early (with
16db0 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69  out doing the ti
16dc0 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c  me-consuming sql
16dd0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c  ite3OsSync() cal
16de0 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ls).    ** if th
16df0 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
16e00 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
16e10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
16e20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
16e30 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d  ager->needSync==
16e40 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 );.    rc = pa
16e50 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
16e60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
16e70 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
16e80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
16e90 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
16ea0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
16eb0 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  en );.  rc = sql
16ec0 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70  ite3pager_sync(p
16ed0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28  Pager, 0);.  if(
16ee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16ef0 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69  {.    goto commi
16f00 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72  t_abort;.  }.  r
16f10 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
16f20 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
16f30 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
16f40 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72  = -1;.  return r
16f50 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  c;..  /* Jump he
16f60 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  re if anything g
16f70 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67  oes wrong during
16f80 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
16f90 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74  ess..  */.commit
16fa0 5f 61 62 6f 72 74 3a 0a 20 20 73 71 6c 69 74 65  _abort:.  sqlite
16fb0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
16fc0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
16fd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
16fe0 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
16ff0 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61  ges.  The databa
17000 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f  se falls back to
17010 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f   PAGER_SHARED mo
17020 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
17030 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
17040 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
17050 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
17060 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
17070 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
17080 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
17090 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
170a0 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
170b0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
170c0 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
170d0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
170e0 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53  king protocol (S
170f0 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20  QLITE_PROTOCOL) 
17100 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
17110 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
17120 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
17130 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
17140 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
17150 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
17160 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
17170 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
17180 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
17190 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
171a0 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
171b0 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
171c0 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
171d0 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
171e0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
171f0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
17200 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
17210 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
17220 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52  {.  int rc;.  TR
17230 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE2("ROLLBACK %
17240 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
17250 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  .h);.  if( pPage
17260 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
17270 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
17280 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
17290 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
172a0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
172b0 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
172c0 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61     assert( !p->a
172d0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
172e0 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
172f0 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
17300 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
17310 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
17320 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
17330 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
17340 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
17350 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
17360 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
17370 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  r))->pStmt );.  
17380 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
17390 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
173a0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
173b0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b  HIST(p, pPager);
173c0 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
173d0 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
173e0 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
173f0 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73  TO_DATA(p), pHis
17400 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72  t->pOrig, pPager
17410 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17420 20 20 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c       TRACE3("ROL
17430 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66  LBACK-PAGE %d of
17440 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
17450 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
17460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17470 20 20 20 20 20 54 52 41 43 45 33 28 22 50 41 47       TRACE3("PAG
17480 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e  E %d is clean on
17490 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
174a0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
174b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
174c0 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
174d0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74  );.      p->dirt
174e0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
174f0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
17500 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d       p->inStmt =
17510 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   0;.      p->pPr
17520 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78  evStmt = p->pNex
17530 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20  tStmt = 0;..    
17540 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
17550 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
17560 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
17570 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41  iter(PGHDR_TO_DA
17580 54 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70  TA(p), pPager->p
17590 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
175a0 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20  }.      .    }. 
175b0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
175c0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
175d0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
175e0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20  r->origDbSize;. 
175f0 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
17600 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
17610 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
17620 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
17630 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
17640 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
17650 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17660 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
17670 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
17680 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
17690 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
176a0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
176b0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
176c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
176d0 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
176e0 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
176f0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
17700 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  0 && pPager->err
17710 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f  Mask!=PAGER_ERR_
17720 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
17730 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
17740 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
17750 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
17760 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
17770 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
17780 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
17790 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
177a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
177b0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
177c0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 2c 20  ){.    int rc2, 
177d0 72 63 33 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc3;.    rc = pa
177e0 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
177f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
17800 32 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  2 = pager_trunca
17810 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
17820 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 29 3b 0a  r->origDbSize);.
17830 20 20 20 20 72 63 33 20 3d 20 70 61 67 65 72 5f      rc3 = pager_
17840 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
17850 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
17860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17870 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
17880 20 20 20 20 69 66 28 20 72 63 33 20 29 20 72 63      if( rc3 ) rc
17890 20 3d 20 72 63 33 3b 0a 20 20 20 20 7d 0a 20 20   = rc3;.    }.  
178a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
178b0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
178c0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
178d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
178e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
178f0 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20  TE_CORRUPT;  /* 
17900 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a  bkpt-CORRUPT */.
17910 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
17920 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
17930 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20  _CORRUPT;.  }.  
17940 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
17950 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
17960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17970 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
17980 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
17990 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
179a0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
179b0 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
179c0 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
179d0 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
179e0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  t sqlite3pager_i
179f0 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
17a00 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
17a10 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
17a20 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nly;.}../*.** Th
17a30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
17a40 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
17a50 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
17a60 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
17a70 33 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67  3pager_stats(Pag
17a80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
17a90 74 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a  tatic int a[9];.
17aa0 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d    a[0] = pPager-
17ab0 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20  >nRef;.  a[1] = 
17ac0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20  pPager->nPage;. 
17ad0 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[2] = pPager->
17ae0 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d  mxPage;.  a[3] =
17af0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
17b00 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
17b10 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
17b20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  = pPager->errMas
17b30 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  k;.  a[6] = pPag
17b40 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
17b50 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
17b60 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65  ;.  a[8] = pPage
17b70 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75  r->nOvfl;.  retu
17b80 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn a;.}../*.** S
17b90 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
17ba0 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
17bb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17bc0 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
17bd0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
17be0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
17bf0 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
17c00 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
17c10 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
17c20 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
17c30 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
17c40 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
17c50 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
17c60 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
17c70 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
17c80 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
17c90 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
17ca0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
17cb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
17cc0 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
17cd0 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
17ce0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
17cf0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
17d00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17d10 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a  r->dbSize>=0 );.
17d20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42    TRACE2("STMT-B
17d30 45 47 49 4e 20 25 64 5c 6e 22 2c 20 70 50 61 67  EGIN %d\n", pPag
17d40 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28  er->fd.h);.  if(
17d50 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
17d60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
17d70 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
17d80 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
17d90 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
17da0 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
17db0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17dc0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
17dd0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
17de0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
17df0 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
17e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17e10 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
17e20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17e30 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  n );.  pPager->a
17e40 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  InStmt = sqliteM
17e50 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
17e60 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
17e70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
17e80 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Stmt==0 ){.    s
17e90 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
17ea0 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
17eb0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75  _LOCK);.    retu
17ec0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
17ed0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
17ee0 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
17ef0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
17f00 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
17f10 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
17f20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
17f30 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
17f40 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
17f50 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
17f60 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
17f70 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  lOff );.#endif. 
17f80 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
17f90 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
17fa0 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
17fb0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
17fc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
17fd0 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
17fe0 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
17ff0 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50  ->stmtCksum = pP
18000 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
18010 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
18020 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
18030 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
18040 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70  r_opentemp(zTemp
18050 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  , &pPager->stfd)
18060 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
18070 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
18080 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65  ailed;.    pPage
18090 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b  r->stmtOpen = 1;
180a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
180b0 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  tNRec = 0;.  }. 
180c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
180d0 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  se = 1;.  return
180e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74   SQLITE_OK;. .st
180f0 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a  mt_begin_failed:
18100 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
18110 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  InStmt ){.    sq
18120 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
18130 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70  >aInStmt);.    p
18140 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
18150 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
18160 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
18170 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74  mmit a statement
18180 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18190 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
181a0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
181b0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
181c0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
181d0 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
181e0 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28  ext;.    TRACE2(
181f0 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
18200 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
18210 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
18220 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
18230 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
18240 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
18250 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  0);.      /* sql
18260 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26  ite3OsTruncate(&
18270 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
18280 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
18290 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
182a0 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
182b0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
182c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
182d0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
182e0 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
182f0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
18300 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  xt = pPg->pNextS
18310 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tmt;.      asser
18320 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  t( pPg->inStmt )
18330 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
18340 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
18350 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
18360 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
18370 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
18380 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
18390 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
183a0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
183b0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
183c0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ger);.        sq
183d0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
183e0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
183f0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
18400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18410 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
18420 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
18430 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
18440 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
18450 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pStmt = 0;.  }.
18460 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
18470 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
18480 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18490 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
184a0 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  k a statement..*
184b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
184c0 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b  er_stmt_rollback
184d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
184e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
184f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
18500 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32  se ){.    TRACE2
18510 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
18520 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
18530 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20 70 50  d.h);.    if( pP
18540 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
18550 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
18560 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
18570 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
18580 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
18590 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
185a0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
185b0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
185c0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
185d0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
185e0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
185f0 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
18600 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
18610 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
18620 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
18630 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18640 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
18650 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
18660 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
18670 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18680 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
18690 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
186a0 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
186b0 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
186c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
186d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
186e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
186f0 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
18700 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
18710 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
18720 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
18730 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
18740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
18750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
18760 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
18770 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
18780 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18790 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
187a0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
187b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
187c0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
187d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
187e0 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
187f0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
18800 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
18810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18820 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
18830 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18840 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
18850 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
18860 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20  r_dirname(Pager 
18870 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
18880 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
18890 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
188a0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
188b0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
188c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
188d0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
188e0 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61  ite3pager_journa
188f0 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
18900 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
18910 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
18920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
18930 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
18940 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73   pager.*/.void s
18950 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
18960 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  codec(.  Pager *
18970 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28  pPager,.  void (
18980 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
18990 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
189a0 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
189b0 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
189c0 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
189d0 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
189e0 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
189f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18a00 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18a10 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
18a20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18a30 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
18a40 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
18a50 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
18a60 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
18a70 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
18a80 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
18a90 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18aa0 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
18ab0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
18ac0 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
18ad0 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ter;.  int rc;..
18ae0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
18af0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
18b00 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72   writing. */.  r
18b10 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
18b20 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  _get(pPager, 1, 
18b30 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
18b40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
18b50 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
18b60 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
18b70 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  ite(pPage);.  if
18b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18b90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
18ba0 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72  /* Read the curr
18bb0 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74  ent value at byt
18bc0 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64  e 24. */.  pPgHd
18bd0 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  r = DATA_TO_PGHD
18be0 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e  R(pPage);.  chan
18bf0 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74  ge_counter = ret
18c00 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48  rieve32bits(pPgH
18c10 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49  dr, 24);..  /* I
18c20 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
18c30 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
18c40 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
18c50 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
18c60 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
18c70 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73 28  ;.  store32bits(
18c80 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20  change_counter, 
18c90 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20  pPgHdr, 24);..  
18ca0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
18cb0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
18cc0 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  /.  sqlite3pager
18cd0 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
18ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18cf0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
18d00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18d10 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
18d20 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
18d30 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
18d40 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
18d50 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18d60 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
18d70 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
18d80 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
18d90 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
18da0 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
18db0 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
18dc0 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
18dd0 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
18de0 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
18df0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
18e00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18e10 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  e ensures that t
18e20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
18e30 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20  nced, all dirty 
18e40 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  pages written.**
18e50 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18e60 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61   file and the da
18e70 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
18e80 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  ed. The only thi
18e90 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69  ng that.** remai
18ea0 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
18eb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
18ec0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
18ed0 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a  urnal file (or.*
18ee0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
18ef0 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
18f00 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
18f10 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
18f20 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
18f30 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
18f40 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
18f50 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
18f60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
18f70 63 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74  c() call..*/.int
18f80 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
18f90 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
18fa0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
18fb0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
18fc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
18fd0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
18fe0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
18ff0 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
19000 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
19010 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
19020 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
19030 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
19040 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
19050 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
19060 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
19070 53 59 4e 43 45 44 20 26 26 20 21 70 50 61 67 65  SYNCED && !pPage
19080 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67  r->memDb && pPag
19090 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
190a0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
190b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
190c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
190d0 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  n );..    /* If 
190e0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
190f0 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
19100 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
19110 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ten to the.    *
19120 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
19130 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20  then no sync is 
19140 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68  required. This h
19150 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69  appens when it i
19160 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  s.    ** written
19170 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
19180 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72  ss fails to upgr
19190 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
191a0 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a  VED to an.    **
191b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
191c0 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   The next time t
191d0 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73  he process tries
191e0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20   to commit the. 
191f0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
19200 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77  n the m-j name w
19210 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
19220 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20   been written.. 
19230 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
19240 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
19250 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
19260 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
19270 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b  counter(pPager);
19280 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19290 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
192a0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
192b0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
192c0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
192d0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
192e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
192f0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
19300 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
19310 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
19320 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
19330 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19340 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
19350 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69     }..    /* Wri
19360 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
19370 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
19380 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
19390 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
193a0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
193b0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
193c0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
193d0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
193e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
193f0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
19400 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  it;..    /* Sync
19410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19420 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
19430 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
19440 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
19450 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67  ite3OsSync(&pPag
19460 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 0a  er->fd);.    }..
19470 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
19480 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
19490 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74  ;.  }..sync_exit
194a0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
194b0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
194c0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
194d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
194e0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
194f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
19500 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c  te of the file l
19510 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65  ock for the give
19520 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  n pager..** The 
19530 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
19540 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20  one of NO_LOCK, 
19550 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
19560 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50  ERVED_LOCK,.** P
19570 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20  ENDING_LOCK, or 
19580 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
19590 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
195a0 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61  ger_lockstate(Pa
195b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
195c0 66 64 65 66 20 4f 53 5f 54 45 53 54 0a 20 20 72  fdef OS_TEST.  r
195d0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64  eturn pPager->fd
195e0 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23  ->fd.locktype;.#
195f0 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 70 50  else.  return pP
19600 61 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70  ager->fd.locktyp
19610 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64  e;.#endif.}.#end
19620 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
19630 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69  E_TEST./*.** Pri
19640 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  nt a listing of 
19650 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70  all referenced p
19660 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72  ages and their r
19670 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  ef count..*/.voi
19680 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  d sqlite3pager_r
19690 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50  efdump(Pager *pP
196a0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
196b0 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  pPg;.  for(pPg=p
196c0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
196d0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
196e0 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50  All){.    if( pP
196f0 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e  g->nRef<=0 ) con
19700 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  tinue;.    sqlit
19710 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50  e3DebugPrintf("P
19720 41 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20  AGE %3d addr=%p 
19730 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  nRef=%d\n", .   
19740 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50      pPg->pgno, P
19750 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
19760 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20  ), pPg->nRef);. 
19770 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a               }.}.#endif.