/ Hex Artifact Content
Login

Artifact 2698653a3bd895b2156c108a37a32d240a55bb0e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 31 35  : pager.c,v 1.15
0350: 39 20 32 30 30 34 2f 30 38 2f 31 39 20 31 33 3a  9 2004/08/19 13:
0360: 32 39 3a 31 35 20 64 72 68 20 45 78 70 20 24 0a  29:15 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 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
28f0: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
2900: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2910: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
2920: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
2930: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
2940: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
2950: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
2960: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
2970: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2980: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
2990: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
29a0: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
29b0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
29c0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
29d0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
29e0: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
29f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2a00: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2a10: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
2a20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
2a30: 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53   *aHash[N_PG_HAS
2a40: 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74  H];    /* Hash t
2a50: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
2a60: 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72   number to PgHdr
2a70: 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 6a 6f 75 72   */.  off_t jour
2a80: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
2a90: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
2aa0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
2ab0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
2ac0: 20 20 6f 66 66 5f 74 20 6a 6f 75 72 6e 61 6c 48    off_t journalH
2ad0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
2ae0: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
2af0: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
2b00: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 6f 66 66   header */.  off
2b10: 5f 74 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20  _t stmtHdrOff;  
2b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2b30: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
2b40: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
2b50: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 6f 66 66  atement */.  off
2b60: 5f 74 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20  _t stmtCksum;   
2b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
2b80: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
2b90: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
2ba0: 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72   */.  int sector
2bb0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2bc0: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
2bd0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
2be0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
2bf0: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2c10: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
2c20: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2c30: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 7d 3b 0a 0a   to jrnl */.};..
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 70 72 69 6e 74 66 28 0a 20 20 20 20 20     printf(.     
37a0: 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61    "REFCNT: %4d a
37b0: 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d  ddr=0x%08x nRef=
37c0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
37d0: 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50 47 48 44  >pgno, (int)PGHD
37e0: 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d  R_TO_DATA(p), p-
37f0: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
3800: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
3810: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
3820: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
3830: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
3840: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
3850: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
3860: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
3870: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  O(X).#endif../*.
3880: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
3890: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
38a0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
38b0: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
38c0: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
38d0: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
38e0: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
38f0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
3900: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
3910: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
3920: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
3930: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
3940: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
3950: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
3960: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
3970: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
3980: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
3990: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
39a0: 20 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20   u32 res;.  int 
39b0: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
39c0: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65  e3OsRead(fd, &re
39d0: 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b  s, sizeof(res));
39e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
39f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69  E_OK ){.    unsi
3a00: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
3a10: 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20  .    memcpy(ac, 
3a20: 26 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65  &res, 4);.    re
3a30: 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20  s = (ac[0]<<24) 
3a40: 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20  | (ac[1]<<16) | 
3a50: 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b  (ac[2]<<8) | ac[
3a60: 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  3];.  }.  *pRes 
3a70: 3d 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20  = res;.  return 
3a80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
3a90: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
3aa0: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
3ab0: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
3ac0: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
3ad0: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
3ae0: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
3af0: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
3b00: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
3b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
3b20: 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a  e32bits(OsFile *
3b30: 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  fd, u32 val){.  
3b40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
3b50: 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28  [4];.  ac[0] = (
3b60: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
3b70: 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e  .  ac[1] = (val>
3b80: 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >16) & 0xff;.  a
3b90: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
3ba0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20  & 0xff;.  ac[3] 
3bb0: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20  = val & 0xff;.  
3bc0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
3bd0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29  Write(fd, ac, 4)
3be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
3bf0: 20 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65   the 32-bit inte
3c00: 67 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74  ger 'val' into t
3c10: 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
3c20: 65 64 20 62 79 20 70 61 67 65 20 68 65 61 64 65  ed by page heade
3c30: 72 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73  r.** 'p' at offs
3c40: 65 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a  et 'offset'..*/.
3c50: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72  static void stor
3c60: 65 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c  e32bits(u32 val,
3c70: 20 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f   PgHdr *p, int o
3c80: 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e  ffset){.  unsign
3c90: 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61  ed char *ac;.  a
3ca0: 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20  c = &((unsigned 
3cb0: 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
3cc0: 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b  ATA(p))[offset];
3cd0: 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e  .  ac[0] = (val>
3ce0: 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >24) & 0xff;.  a
3cf0: 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29  c[1] = (val>>16)
3d00: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d   & 0xff;.  ac[2]
3d10: 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78   = (val>>8) & 0x
3d20: 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61  ff;.  ac[3] = va
3d30: 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a  l & 0xff;.}../*.
3d40: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
3d50: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
3d60: 65 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d  et 'offset' from
3d70: 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69   the page identi
3d80: 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20  fied by.** page 
3d90: 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73  header 'p'..*/.s
3da0: 74 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65  tatic u32 retrie
3db0: 76 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a  ve32bits(PgHdr *
3dc0: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
3dd0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3de0: 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75  *ac;.  ac = &((u
3df0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47  nsigned char*)PG
3e00: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b  HDR_TO_DATA(p))[
3e10: 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72  offset];.  retur
3e20: 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  n (ac[0]<<24) | 
3e30: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
3e40: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
3e50: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
3e60: 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  ert the bits in 
3e70: 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  the pPager->errM
3e80: 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72  ask into an appr
3e90: 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e  oprate.** return
3ea0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
3eb0: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f   int pager_errco
3ec0: 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
3ed0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
3ee0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
3ef0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
3f00: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
3f10: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
3f20: 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28  _PROTOCOL;.  if(
3f30: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
3f40: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53   & PAGER_ERR_DIS
3f50: 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K )    rc = SQLI
3f60: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20  TE_IOERR;.  if( 
3f70: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
3f80: 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  & PAGER_ERR_FULL
3f90: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
3fa0: 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50  E_FULL;.  if( pP
3fb0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
3fc0: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20  PAGER_ERR_MEM ) 
3fd0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3fe0: 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61  NOMEM;.  if( pPa
3ff0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
4000: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
4010: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
4020: 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e  ORRUPT;.  return
4030: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68   rc;.}../*.** Wh
4040: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
4050: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
4060: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
4070: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
4080: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
4090: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
40a0: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
40b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
40c0: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
40d0: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
40e0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
40f0: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a  iteMalloc(). *pz
4100: 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74  Master is.** set
4110: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
4120: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
4130: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
4140: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a  The caller must.
4150: 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20  ** sqliteFree() 
4160: 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  *pzMaster..**.**
4170: 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   If no master jo
4180: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
4190: 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61  is present *pzMa
41a0: 73 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  ster is set to 0
41b0: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
41c0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
41d0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
41e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69  sterJournal(OsFi
41f0: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
4200: 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  **pzMaster){.  i
4210: 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e  nt rc;.  u32 len
4220: 3b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 0a 20  ;.  off_t szJ;. 
4230: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e   u32 cksum;.  in
4240: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
4250: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
4260: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
4270: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
4280: 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61  ader */..  *pzMa
4290: 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20  ster = 0;..  rc 
42a0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
42b0: 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29  ize(pJrnl, &szJ)
42c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
42d0: 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20  TE_OK || szJ<16 
42e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
42f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
4300: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
4310: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
4320: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
4330: 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61  rc;. .  rc = rea
4340: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26  d32bits(pJrnl, &
4350: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
4360: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
4370: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
4380: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
4390: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
43a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
43b0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
43c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
43d0: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
43e0: 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  8);.  if( rc!=SQ
43f0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d  LITE_OK || memcm
4400: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
4410: 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65  alMagic, 8) ) re
4420: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
4430: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
4440: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e  Jrnl, szJ-16-len
4450: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
4460: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
4470: 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72  rc;..  *pzMaster
4480: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
4490: 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a  eMalloc(len+1);.
44a0: 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72    if( !*pzMaster
44b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
44c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
44d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
44e0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a  sRead(pJrnl, *pz
44f0: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
4500: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4510: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
4520: 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a  ree(*pzMaster);.
4530: 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20      *pzMaster = 
4540: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  0;.    return rc
4550: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
4560: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
4570: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
4580: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
4590: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
45a0: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
45b0: 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74  ksum -= (*pzMast
45c0: 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66  er)[i];.  }.  if
45d0: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
45e0: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
45f0: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
4600: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
4610: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
4620: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
4630: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
4640: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
4650: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
4660: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
4670: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
4680: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
4690: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
46a0: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
46b0: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
46c0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
46d0: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
46e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a    sqliteFree(*pz
46f0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a  Master);.    *pz
4700: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  Master = 0;.  }.
4710: 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65    (*pzMaster)[le
4720: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20  n] = '\0';.   . 
4730: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4740: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
4750: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4760: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
4770: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
4780: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
4790: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
47a0: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
47b0: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
47c0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
47d0: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
47e0: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
47f0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
4800: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
4810: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
4820: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
4830: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
4840: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
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: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
4890: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
48b0: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
48d0: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
48f0: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
4900: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
4910: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
4920: 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6f 66 66  er){.  off_t off
4930: 73 65 74 20 3d 20 30 3b 0a 20 20 6f 66 66 5f 74  set = 0;.  off_t
4940: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
4950: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
4960: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
4970: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
4980: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
4990: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
49a0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
49b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
49c0: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
49d0: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
49e0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
49f0: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
4a00: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
4a10: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4a20: 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r) );.  pPager->
4a30: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66  journalOff = off
4a40: 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  set;.  return sq
4a50: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
4a60: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
4a70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d  ->journalOff);.}
4a80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
4a90: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
4aa0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
4ab0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4ac0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
4ad0: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
4ae0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
4af0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
4b00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
4b10: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
4b20: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
4b30: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
4b40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
4b50: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
4b60: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
4b70: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
4b80: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
4b90: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
4ba0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
4bb0: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
4bc0: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
4bd0: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
4be0: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
4bf0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
4c00: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
4c10: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
4c20: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
4c30: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
4c40: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
4c50: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
4c60: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
4c70: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a   journal..** .**
4c80: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
4c90: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
4ca0: 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  4) bytes of unus
4cb0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
4cc0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
4cd0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
4ce0: 50 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72  Pager){..  int r
4cf0: 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  c = seekJournalH
4d00: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  dr(pPager);.  if
4d10: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
4d20: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
4d30: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
4d40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
4d50: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
4d60: 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  HdrOff==0 ){.   
4d70: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
4d80: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
4d90: 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20  urnalHdr;.  }.  
4da0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
4db0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
4dc0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20  R_SZ(pPager);.. 
4dd0: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a   /* FIX ME: .  *
4de0: 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  *.  ** Possibly 
4df0: 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20  for a pager not 
4e00: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
4e10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67   the journal mag
4e20: 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20  ic should not.  
4e30: 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e  ** be written un
4e40: 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c  til nRec is fill
4e50: 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66  ed in as part of
4e60: 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61   next syncJourna
4e70: 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l(). .  **.  ** 
4e80: 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74  Actually maybe t
4e90: 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
4ea0: 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62   header should b
4eb0: 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  e delayed until 
4ec0: 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e  that.  ** point.
4ed0: 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
4ee0: 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
4ef0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
4f00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
4f10: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
4f20: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
4f30: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
4f40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
4f50: 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64  * The nRec Field
4f60: 2e 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72  . 0xFFFFFFFF for
4f70: 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c   no-sync journal
4f80: 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77  s. */.    rc = w
4f90: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
4fa0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
4fb0: 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66  >noSync ? 0xffff
4fc0: 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20  ffff : 0);.  }. 
4fd0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4fe0: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
4ff0: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
5000: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
5010: 2f 20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61  / .    sqlite3Ra
5020: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
5030: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
5040: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
5050: 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20  umInit);.    rc 
5060: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
5070: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5080: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
5090: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
50a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
50b0: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
50c0: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
50d0: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
50e0: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
50f0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
5100: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
5110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5120: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
5130: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
5140: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
5150: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
5160: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5170: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  fd, pPager->sect
5180: 6f 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  orSize);.  }..  
5190: 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  /* The journal h
51a0: 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77  eader has been w
51b0: 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75  ritten successfu
51c0: 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f  lly. Seek the jo
51d0: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
51e0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
51f0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
5200: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
5210: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  or..  */.  if( r
5220: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5230: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
5240: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
5250: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5260: 66 66 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20  ff-1);.    rc = 
5270: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
5280: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
5290: 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  00", 1);.  }.  r
52a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
52b0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
52c0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
52d0: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
52e0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
52f0: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
5300: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
5310: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
5320: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
5330: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
5340: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
5350: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
5360: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
5370: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
5380: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
5390: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
53a0: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
53b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
53c0: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
53d0: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
53e0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
53f0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
5400: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
5410: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
5420: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
5430: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
5440: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
5450: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
5460: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
5470: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
5480: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5490: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
54a0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
54b0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
54c0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
54d0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
54e0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
54f0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
5500: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
5510: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
5520: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
5530: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
5540: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
5550: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
5560: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
5570: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
5580: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
5590: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
55a0: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
55b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
55c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
55d0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
55e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
55f0: 0a 20 20 6f 66 66 5f 74 20 6a 6f 75 72 6e 61 6c  .  off_t journal
5600: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
5610: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
5620: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
5630: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5640: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
5650: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
5660: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
5670: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b   */..  rc = seek
5680: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
5690: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
56a0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
56b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
56c0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
56d0: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
56e0: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
56f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
5700: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
5710: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
5720: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
5730: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
5740: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  c));.  if( rc ) 
5750: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
5760: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
5770: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
5780: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
5790: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
57a0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
57b0: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
57c0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
57d0: 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  d, pNRec);.  if(
57e0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
57f0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
5800: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
5810: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
5820: 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Init);.  if( rc 
5830: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5840: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
5850: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  &pPager->jfd, pD
5860: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
5870: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5880: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
5890: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
58a0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
58b0: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
58c0: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
58d0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
58e0: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
58f0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
5900: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
5910: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
5920: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
5930: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
5940: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
5950: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
5960: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
5970: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
5980: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
5990: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
59a0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
59b0: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
59c0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
59d0: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
59e0: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29  er->jfd, (u32 *)
59f0: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
5a00: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
5a10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
5a20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5a30: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5a40: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
5a50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
5a60: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
5a70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5a80: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
5a90: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
5aa0: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
5ab0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5ac0: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
5ad0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5ae0: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
5af0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
5b00: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
5b10: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
5b20: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
5b30: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
5b40: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
5b50: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
5b60: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
5b70: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
5b80: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
5b90: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
5ba0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
5bb0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
5bc0: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
5bd0: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
5be0: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
5bf0: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
5c00: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
5c10: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
5c20: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
5c30: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
5c40: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
5c50: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
5c60: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
5c70: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
5c80: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
5c90: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
5ca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
5cb0: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
5cc0: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
5cd0: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
5ce0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
5cf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5d00: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
5d10: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
5d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
5d30: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
5d40: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
5d50: 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73  nt i; .  u32 cks
5d60: 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20  um = 0; ..  if( 
5d70: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
5d80: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
5d90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5da0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
5db0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
5dc0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
5dd0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
5de0: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
5df0: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
5e00: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
5e10: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
5e20: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
5e30: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
5e40: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
5e50: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
5e60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5e70: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
5e80: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
5e90: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
5ea0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
5eb0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
5ec0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
5ed0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
5ee0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
5ef0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
5f00: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
5f10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5f20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5f30: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5f40: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
5f50: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
5f60: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5f70: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
5f80: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
5f90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5fa0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5fb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
5fc0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
5fd0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b  , zMaster, len);
5fe0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5ff0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6000: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6010: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6020: 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  fd, len);.  if( 
6030: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6040: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6050: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
6060: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73  pPager->jfd, cks
6070: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
6080: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6090: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
60a0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
60b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
60c0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
60d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
60e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
60f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
6100: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
6110: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
6120: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
6130: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
6140: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
6150: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
6160: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
6170: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
6180: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
6190: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
61a0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
61b0: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
61c0: 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
61d0: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
61e0: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
61f0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
6200: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
6210: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
6220: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
6230: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
6240: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
6250: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
6260: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
6270: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
6280: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
6290: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
62a0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
62b0: 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  f( pPg->inStmt )
62c0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
62d0: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
62e0: 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65  t==0 && pPg->pNe
62f0: 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70  xtStmt==0 );.  p
6300: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
6310: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
6320: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50  >pStmt ){.    pP
6330: 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72  ager->pStmt->pPr
6340: 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  evStmt = pPg;.  
6350: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  }.  pPg->pNextSt
6360: 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74  mt = pPager->pSt
6370: 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53  mt;.  pPager->pS
6380: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  tmt = pPg;.  pPg
6390: 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a  ->inStmt = 1;.}.
63a0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
63b0: 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
63c0: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
63d0: 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  g){.  if( !pPg->
63e0: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
63f0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
6400: 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  vStmt ){.    ass
6410: 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53  ert( pPg->pPrevS
6420: 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  tmt->pNextStmt==
6430: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
6440: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
6450: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
6460: 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tStmt;.  }else{.
6470: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
6480: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d  >pPager->pStmt==
6490: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
64a0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
64b0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
64c0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
64d0: 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  NextStmt ){.    
64e0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
64f0: 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  xtStmt->pPrevStm
6500: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
6510: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
6520: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
6530: 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20  PrevStmt;.  }.  
6540: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
6550: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   0;.  pPg->pPrev
6560: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
6570: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a  >inStmt = 0;.}..
6580: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
6590: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
65a0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
65b0: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
65c0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
65d0: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
65e0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
65f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
6600: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
6610: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
6620: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
6630: 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e  dr *p = pPager->
6640: 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68  aHash[pager_hash
6650: 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65  (pgno)];.  while
6660: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
6670: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
6680: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
6690: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
66a0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
66b0: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
66c0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
66d0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
66e0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
66f0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
6700: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
6710: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
6720: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
6730: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
6740: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
6750: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
6760: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
6770: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
6780: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
6790: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
67a0: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
67b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
67c0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
67d0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
67e0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
67f0: 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  t;.  for(pPg=pPa
6800: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
6810: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
6820: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
6830: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
6840: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
6850: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
6860: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
6870: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
6880: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
6890: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
68a0: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d  >pAll = 0;.  mem
68b0: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
68c0: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
68d0: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
68e0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
68f0: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
6900: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
6910: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
6920: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
6930: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
6940: 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  .  sqlite3OsUnlo
6950: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
6960: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  NO_LOCK);.  pPag
6970: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
6980: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  R_UNLOCK;.  pPag
6990: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
69a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
69b0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
69c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
69d0: 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  en==0 );.}../*.*
69e0: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
69f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
6a00: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
6a10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
6a20: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45  en and.** a RESE
6a30: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
6a40: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
6a50: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
6a60: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a  utine releases.*
6a70: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
6a80: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
6a90: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
6aa0: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68  n its place.  Th
6ab0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
6ac0: 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64  e is deleted and
6ad0: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
6ae0: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
6af0: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
6b00: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
6b10: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
6b20: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
6b30: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
6b40: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
6b50: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
6b60: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
6b70: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
6b80: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
6b90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
6ba0: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
6bb0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6bc0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
6bd0: 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
6be0: 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 69 66 28 20  >memDb );.  if( 
6bf0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
6c00: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
6c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6c20: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
6c30: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
6c40: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
6c50: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
6c60: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
6c70: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
6c80: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
6c90: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
6ca0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
6cb0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
6cc0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
6cd0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
6ce0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67  ->jfd);.    pPag
6cf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
6d00: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
6d10: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
6d20: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
6d30: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
6d40: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
6d50: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
6d60: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
6d70: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
6d80: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
6d90: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
6da0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
6db0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
6dc0: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
6dd0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
6de0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
6df0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
6e00: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
6e10: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
6e20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
6e30: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
6e40: 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
6e50: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
6e60: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73  al==0 );.  }.  s
6e70: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
6e80: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
6e90: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  ED_LOCK);.  pPag
6ea0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
6eb0: 52 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67  R_SHARED;.  pPag
6ec0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
6ed0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
6ee0: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72  tMaster = 0;.  r
6ef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6f00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
6f10: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
6f20: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
6f30: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  page of data..**
6f40: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
6f50: 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
6f60: 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a    It is really j
6f70: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
6f80: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
6f90: 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20  itial value and 
6fa0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  the page number.
6fb0: 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65    We experimente
6fc0: 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63  d with.** a chec
6fd0: 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69  ksum of the enti
6fe0: 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61  re data, but tha
6ff0: 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62  t was found to b
7000: 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a  e too slow..**.*
7010: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
7020: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73  page number is s
7030: 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67  tored at the beg
7040: 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61  inning of data a
7050: 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73  nd.** the checks
7060: 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  um is stored at 
7070: 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69  the end.  This i
7080: 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66  s important.  If
7090: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72   journal.** corr
70a0: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
70b0: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
70c0: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
70d0: 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a  ikely scenario.*
70e0: 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  * is that one en
70f0: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
7100: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
7110: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49  l be changed.  I
7120: 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73  t is.** much les
7130: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
7140: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
7150: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
7160: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
7170: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
7180: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
7190: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
71a0: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
71b0: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
71c0: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
71d0: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
71e0: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
71f0: 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58  ption..**.** FIX
7200: 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61   ME:  Consider a
7210: 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74  dding every 200t
7220: 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f  h (or so) byte o
7230: 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  f the data to th
7240: 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20  e.** checksum.  
7250: 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69  That way if a si
7260: 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20  ngle page spans 
7270: 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73  3 or more disk s
7280: 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e  ectors and.** on
7290: 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65  ly the middle se
72a0: 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c  ctor is corrupt,
72b0: 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68   we will still h
72c0: 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ave a reasonable
72d0: 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61  .** chance of fa
72e0: 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  iling the checks
72f0: 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65  um and thus dete
7300: 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  cting the proble
7310: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  m..*/.static u32
7320: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
7330: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7340: 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61   pgno, const cha
7350: 72 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  r *aData){.  u32
7360: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
7370: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
7380: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
7390: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
73a0: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
73b0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
73c0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
73d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
73e0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
73f0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
7400: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
7410: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
7420: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7430: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
7440: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
7450: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
7460: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
7470: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
7480: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
7490: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
74a0: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
74b0: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
74c0: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
74d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
74e0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
74f0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
7500: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
7510: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
7520: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
7530: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
7540: 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74  OsFile *jfd, int
7550: 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e   useCksum){.  in
7560: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
7570: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
7580: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
7590: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
75a0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
75b0: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
75c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
75d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
75e0: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
75f0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
7600: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7610: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
7620: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
7630: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
7640: 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d  8 aData[SQLITE_M
7650: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20  AX_PAGE_SIZE];  
7660: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
7670: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
7680: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
7690: 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  (jfd, &pgno);.  
76a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
76b0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
76c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
76d0: 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c  ead(jfd, &aData,
76e0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
76f0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
7700: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7710: 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   rc;.  pPager->j
7720: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
7730: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
7740: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
7750: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
7760: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
7770: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
7780: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
7790: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
77a0: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
77b0: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
77c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
77d0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
77e0: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
77f0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
7800: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
7810: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
7820: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
7830: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
7840: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
7850: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
7860: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
7870: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
7880: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
7890: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
78a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
78b0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
78c0: 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69    if( pgno>(unsi
78d0: 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
78e0: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
78f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
7900: 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20  .  if( useCksum 
7910: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
7920: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73  32bits(jfd, &cks
7930: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
7940: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
7950: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7960: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66  Off += 4;.    if
7970: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
7980: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74  ager, pgno, aDat
7990: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
79a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
79b0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
79c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
79d0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
79e0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
79f0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
7a00: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
7a10: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
7a20: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
7a30: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
7a40: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
7a50: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
7a60: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
7a70: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
7a80: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
7a90: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
7aa0: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
7ab0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
7ac0: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
7ad0: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
7ae0: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
7af0: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
7b00: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
7b10: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
7b20: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
7b30: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
7b40: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
7b50: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
7b60: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
7b70: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
7b80: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
7b90: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
7ba0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
7bb0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
7bc0: 49 56 45 20 7c 7c 20 70 50 67 20 29 3b 0a 20 20  IVE || pPg );.  
7bd0: 54 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b  TRACE3("PLAYBACK
7be0: 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
7bf0: 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 67  pPager->fd.h, pg
7c00: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
7c10: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
7c20: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
7c30: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
7c40: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
7c50: 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 70 50 61 67  o-1)*(off_t)pPag
7c60: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
7c70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7c80: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
7c90: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
7ca0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
7cb0: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
7cc0: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
7cd0: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 72 6f 6c  ould ever be rol
7ce0: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
7cf0: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 20   in use, except 
7d00: 66 6f 72 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  for page.    ** 
7d10: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
7d20: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
7d30: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
7d40: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
7d50: 0a 20 20 20 20 2a 2a 20 61 63 74 69 76 65 2e 0a  .    ** active..
7d60: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
7d70: 2a 70 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  *pData;.    asse
7d80: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
7d90: 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31   || pPg->pgno==1
7da0: 20 29 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20   );.    pData = 
7db0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
7dc0: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
7dd0: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
7de0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
7df0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
7e00: 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20  xDestructor ){  
7e10: 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68  /*** FIX ME:  Sh
7e20: 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65  ould this be xRe
7e30: 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20  init? ***/.     
7e40: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
7e50: 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67  ctor(pData, pPag
7e60: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
7e70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
7e80: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
7e90: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
7ea0: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
7eb0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7ec0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
7ed0: 20 20 7d 0a 20 20 20 20 43 4f 44 45 43 28 70 50    }.    CODEC(pP
7ee0: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
7ef0: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a  ->pgno, 3);.  }.
7f00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7f10: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
7f20: 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
7f30: 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
7f40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
7f50: 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
7f60: 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
7f70: 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
7f80: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
7f90: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
7fa0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
7fb0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
7fc0: 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
7fd0: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
7fe0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7ff0: 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
8000: 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
8010: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
8020: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
8030: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
8040: 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f   of all child jo
8050: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65  urnals..** To te
8060: 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ll if a master j
8070: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
8080: 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20  leted, check to 
8090: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63  each of the.** c
80a0: 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c  hildren.  If all
80b0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69   children are ei
80c0: 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20  ther missing or 
80d0: 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a  do not refer to.
80e0: 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  ** a different m
80f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74  aster journal, t
8100: 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20  hen this master 
8110: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
8120: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
8130: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
8140: 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72  aster(const char
8150: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
8160: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74  t rc;.  int mast
8170: 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f  er_open = 0;.  O
8180: 73 46 69 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20  sFile master;.  
8190: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
81a0: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
81b0: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
81c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
81d0: 20 20 6f 66 66 5f 74 20 6e 4d 61 73 74 65 72 4a    off_t nMasterJ
81e0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 53  ournal;     /* S
81f0: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
8200: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
8210: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
8220: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8230: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
8240: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
8250: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
8260: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
8270: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
8280: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
8290: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
82a0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
82b0: 26 6d 61 73 74 65 72 2c 20 30 2c 20 73 69 7a 65  &master, 0, size
82c0: 6f 66 28 6d 61 73 74 65 72 29 29 3b 0a 20 20 72  of(master));.  r
82d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
82e0: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65  nReadOnly(zMaste
82f0: 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69  r, &master);.  i
8300: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8310: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
8320: 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f  r_out;.  master_
8330: 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d  open = 1;.  rc =
8340: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
8350: 7a 65 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(&master, &nMa
8360: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
8370: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8380: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
8390: 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
83a0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
83b0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
83c0: 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
83d0: 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
83e0: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
83f0: 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
8400: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
8410: 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
8420: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
8430: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
8440: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
8450: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20  asterJournal. . 
8460: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
8470: 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72  rJournal = (char
8480: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
8490: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
84a0: 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
84b0: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
84c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
84d0: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
84e0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
84f0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
8500: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 6d 61 73  lite3OsRead(&mas
8510: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
8520: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
8530: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nal);.    if( rc
8540: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
8550: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
8560: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
8570: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
8580: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
8590: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
85a0: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
85b0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
85c0: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
85d0: 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29  Exists(zJournal)
85e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
85f0: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
8600: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
8610: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8620: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
8630: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
8640: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
8650: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
8660: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
8670: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
8680: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
8690: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
86a0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
86b0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
86c0: 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75 72 6e 61     OsFile journa
86d0: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  l;..        mems
86e0: 65 74 28 26 6a 6f 75 72 6e 61 6c 2c 20 30 2c 20  et(&journal, 0, 
86f0: 73 69 7a 65 6f 66 28 6a 6f 75 72 6e 61 6c 29 29  sizeof(journal))
8700: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
8710: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
8720: 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26  Only(zJournal, &
8730: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
8740: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8750: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
8760: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
8770: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
8780: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
8790: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26  dMasterJournal(&
87a0: 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65  journal, &zMaste
87b0: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
87c0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
87d0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
87e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
87f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
8800: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
8810: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
8820: 20 20 20 20 20 20 20 69 66 28 20 7a 4d 61 73 74         if( zMast
8830: 65 72 50 74 72 20 26 26 20 21 73 74 72 63 6d 70  erPtr && !strcmp
8840: 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
8850: 73 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ster) ){.       
8860: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
8870: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
8880: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
8890: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
88a0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
88b0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
88c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
88d0: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
88e0: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
88f0: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
8900: 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f   }.  .  sqlite3O
8910: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
8920: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
8930: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
8940: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
8950: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
8960: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
8970: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
8980: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
8990: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
89a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
89b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
89c0: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
89d0: 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77  he cache agree w
89e0: 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
89f0: 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  isk.  In other w
8a00: 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20  ords,.** reread 
8a10: 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65  the disk to rese
8a20: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
8a30: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
8a40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8a50: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
8a60: 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68  ollback in which
8a70: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72   some of the dir
8a80: 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65  ty cache.** page
8a90: 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e  s had never been
8aa0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
8ab0: 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74  disk.  We need t
8ac0: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a  o roll back the.
8ad0: 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  ** cache content
8ae0: 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74   and the easiest
8af0: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20   way to do that 
8b00: 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  is to reread the
8b10: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   old content.** 
8b20: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69  back from the di
8b30: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
8b40: 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  t pager_reload_c
8b50: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
8b60: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
8b70: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
8b80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70  LITE_OK;.  for(p
8b90: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
8ba0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
8bb0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68  NextAll){.    ch
8bc0: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d  ar zBuf[SQLITE_M
8bd0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20  AX_PAGE_SIZE];. 
8be0: 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72     if( !pPg->dir
8bf0: 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ty ) continue;. 
8c00: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
8c10: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
8c20: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
8c30: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
8c40: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
8c50: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8c60: 2a 28 6f 66 66 5f 74 29 28 70 50 67 2d 3e 70 67  *(off_t)(pPg->pg
8c70: 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 72 63  no-1));.      rc
8c80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
8c90: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  (&pPager->fd, zB
8ca0: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
8cb0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54 52 41  Size);.      TRA
8cc0: 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20  CE3("REFETCH %d 
8cd0: 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  page %d\n", pPag
8ce0: 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d 3e 70  er->fd.h, pPg->p
8cf0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
8d00: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
8d10: 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
8d20: 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  zBuf, pPg->pgno,
8d30: 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   2);.    }else{.
8d40: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
8d50: 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  f, 0, pPager->pa
8d60: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
8d70: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
8d80: 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42  ==0 || memcmp(zB
8d90: 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  uf, PGHDR_TO_DAT
8da0: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
8db0: 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
8dc0: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
8dd0: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42  TO_DATA(pPg), zB
8de0: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
8df0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
8e00: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
8e10: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
8e20: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
8e30: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
8e40: 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
8e50: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
8e60: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
8e70: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
8e80: 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20  A(pPg, pPager), 
8e90: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
8ea0: 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
8eb0: 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  }.    pPg->needS
8ec0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ync = 0;.    pPg
8ed0: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d  ->dirty = 0;.  }
8ee0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8ef0: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
8f00: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66  the main file of
8f10: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
8f20: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
8f30: 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63  f pages.** indic
8f40: 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ated..*/.static 
8f50: 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
8f60: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
8f70: 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
8f80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
8f90: 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72  Truncate(&pPager
8fa0: 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61  ->fd, pPager->pa
8fb0: 67 65 53 69 7a 65 2a 28 6f 66 66 5f 74 29 6e 50  geSize*(off_t)nP
8fc0: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  age);.}../*.** P
8fd0: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
8fe0: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
8ff0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
9000: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
9010: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
9020: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
9030: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
9040: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
9050: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
9060: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
9070: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
9080: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
9090: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
90a0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
90b0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
90c0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
90d0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
90e0: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
90f0: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
9100: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
9110: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
9120: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
9130: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
9140: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
9150: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
9160: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
9170: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
9180: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
9190: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
91a0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
91b0: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
91c0: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
91d0: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
91e0: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
91f0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
9200: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
9210: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
9220: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
9230: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
9240: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
9250: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
9260: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
9270: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
9280: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
9290: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
92a0: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
92b0: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
92c0: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
92d0: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
92e0: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
92f0: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
9300: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9310: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
9320: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
9330: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
9340: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
9350: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
9360: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
9370: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
9380: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
9390: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
93a0: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
93b0: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
93c0: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
93d0: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
93e0: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
93f0: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
9400: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
9410: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
9420: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
9430: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
9440: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
9450: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
9460: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9470: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
9480: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
9490: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
94a0: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
94b0: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
94c0: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
94d0: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
94e0: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
94f0: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
9500: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
9510: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
9520: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
9530: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
9540: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
9550: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
9560: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
9570: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
9580: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
9590: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
95a0: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
95b0: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
95c0: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
95d0: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
95e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
95f0: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
9600: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
9610: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
9620: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
9630: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
9640: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
9650: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
9660: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9670: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
9680: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
9690: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
96a0: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
96b0: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
96c0: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
96d0: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
96e0: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
96f0: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
9700: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
9710: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
9720: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
9730: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
9740: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
9750: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
9760: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
9770: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
9780: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
9790: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
97a0: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
97b0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
97c0: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
97d0: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
97e0: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
97f0: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
9800: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
9810: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
9820: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
9830: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
9840: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
9850: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
9860: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
9870: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
9880: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
9890: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
98a0: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
98b0: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
98c0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
98d0: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
98e0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
98f0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
9900: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
9910: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
9920: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
9930: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
9940: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
9950: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
9960: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
9970: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
9980: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
9990: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
99a0: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
99b0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
99c0: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
99d0: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
99e0: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
99f0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
9a00: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
9a10: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
9a20: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
9a30: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
9a40: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
9a50: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
9a60: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
9a70: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
9a80: 70 50 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74  pPager){.  off_t
9a90: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
9aa0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9ab0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9ac0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
9ad0: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
9ae0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9af0: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
9b00: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
9b10: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
9b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
9b30: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
9b40: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
9b50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9b60: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
9b70: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
9b80: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
9b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
9ba0: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
9bb0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
9bc0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
9bd0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
9be0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
9bf0: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
9c00: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
9c10: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
9c20: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
9c30: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
9c40: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
9c50: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
9c60: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9c70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9c80: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
9c90: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
9ca0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
9cb0: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
9cc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9cd0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
9ce0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
9cf0: 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
9d00: 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
9d10: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
9d20: 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
9d30: 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
9d40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
9d50: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
9d60: 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
9d70: 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
9d80: 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
9d90: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
9da0: 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
9db0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
9dc0: 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
9dd0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
9de0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26 70  MasterJournal(&p
9df0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
9e00: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
9e10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
9e20: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
9e30: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
9e40: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
9e50: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
9e60: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
9e70: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
9e80: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
9e90: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
9ea0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
9eb0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9ec0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
9ed0: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
9ee0: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
9ef0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67  >jfd, 0);.  pPag
9f00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
9f10: 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
9f20: 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
9f30: 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
9f40: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
9f50: 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
9f60: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
9f70: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
9f80: 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
9f90: 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
9fa0: 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
9fb0: 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
9fc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9fd0: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
9fe0: 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
9ff0: 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
a000: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a010: 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
a020: 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
a030: 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
a040: 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
a050: 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
a060: 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
a070: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
a080: 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
a090: 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
a0a0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
a0b0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
a0c0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
a0d0: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
a0e0: 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
a0f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a100: 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
a110: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
a120: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
a130: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
a140: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
a150: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
a160: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
a170: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
a180: 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
a190: 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
a1a0: 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
a1b0: 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
a1c0: 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
a1d0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
a1e0: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
a1f0: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
a200: 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
a210: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
a220: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
a230: 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
a240: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
a250: 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
a260: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
a270: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
a280: 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
a290: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a2a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a2b0: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
a2c0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
a2d0: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
a2e0: 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
a2f0: 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
a300: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
a310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
a320: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
a330: 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
a340: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
a350: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
a360: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
a370: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
a380: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
a390: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
a3a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a3b0: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
a3c0: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
a3d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a3e0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30  r->origDbSize==0
a3f0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   || pPager->orig
a400: 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a  DbSize==mxPg );.
a410: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
a420: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
a430: 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
a440: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a450: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
a460: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
a470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
a480: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
a490: 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
a4a0: 2a 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  * rc = sqlite3Os
a4b0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
a4c0: 64 2c 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  d, JOURNAL_HDR_S
a4d0: 5a 28 70 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20  Z(pPager)); */. 
a4e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a4f0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
a500: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20  playback;.  .   
a510: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
a520: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
a530: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
a540: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
a550: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
a560: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
a570: 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRec; i++){.  
a580: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
a590: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
a5a0: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
a5b0: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20  ->jfd, 1);.     
a5c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a5d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
a5e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
a5f0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
a600: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a610: 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
a620: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
a630: 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
a640: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
a650: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  e{.          got
a660: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
a670: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a680: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
a690: 2a 20 50 61 67 65 73 20 74 68 61 74 20 68 61 76  * Pages that hav
a6a0: 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
a6b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75  o the journal bu
a6c0: 74 20 6e 65 76 65 72 20 73 79 6e 63 65 64 0a 20  t never synced. 
a6d0: 20 2a 2a 20 77 68 65 72 65 20 6e 6f 74 20 72 65   ** where not re
a6e0: 73 74 6f 72 65 64 20 62 79 20 74 68 65 20 6c 6f  stored by the lo
a6f0: 6f 70 20 61 62 6f 76 65 2e 20 20 57 65 20 68 61  op above.  We ha
a700: 76 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ve to restore th
a710: 6f 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ose.  ** pages b
a720: 79 20 72 65 61 64 69 6e 67 20 74 68 65 6d 20 62  y reading them b
a730: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6f 72 69  ack from the ori
a740: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a  ginal database..
a750: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72    */.  assert( r
a760: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
a770: 20 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63    pager_reload_c
a780: 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 0a 65  ache(pPager);..e
a790: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
a7a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a7b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
a7c0: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
a7d0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
a7e0: 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( zMaster ){.   
a7f0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
a800: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
a810: 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
a820: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74  ne will return t
a830: 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  rue,.    ** see 
a840: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
a850: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
a860: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
a870: 49 66 20 65 72 72 6f 72 73 20 0a 20 20 20 20 2a  If errors .    *
a880: 2a 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74  * occur during t
a890: 68 69 73 20 70 72 6f 63 65 73 73 2c 20 69 67 6e  his process, ign
a8a0: 6f 72 65 20 74 68 65 6d 2e 0a 20 20 20 20 2a 2f  ore them..    */
a8b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
a8c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a8d0: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
a8e0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a  zMaster);.    }.
a8f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
a900: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  Master);.  }..  
a910: 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
a920: 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
a930: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
a940: 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
a950: 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
a960: 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
a970: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
a980: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 50  th a different P
a990: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
a9a0: 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
a9b0: 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
a9c0: 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
a9d0: 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
a9e0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74  /.  pPager->sect
a9f0: 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53  orSize = PAGER_S
aa00: 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 72 65  ECTOR_SIZE;.  re
aa10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
aa20: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
aa30: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
aa40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
aa50: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
aa60: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
aa70: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
aa80: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
aa90: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
aaa0: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
aab0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
aac0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
aad0: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
aae0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
aaf0: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
ab00: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
ab10: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
ab20: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
ab30: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
ab40: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
ab50: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
ab60: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
ab70: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
ab80: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
ab90: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
aba0: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
abb0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
abc0: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
abd0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
abe0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
abf0: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
ac00: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
ac10: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
ac20: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 6f  er *pPager){.  o
ac30: 66 66 5f 74 20 73 7a 4a 3b 20 20 20 20 20 20 20  ff_t szJ;       
ac40: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
ac50: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
ac60: 6e 61 6c 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 68  nal */.  off_t h
ac70: 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
ac80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ac90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
aca0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
acb0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
acc0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
acd0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
ace0: 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
acf0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23  r->journalOff;.#
ad00: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20  ifndef NDEBUG . 
ad10: 20 7b 0a 20 20 20 20 6f 66 66 5f 74 20 6f 73 5f   {.    off_t os_
ad20: 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
ad30: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ad40: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f  &pPager->jfd, &o
ad50: 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20  s_szJ);.    if( 
ad60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
ad70: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61  return rc;.    a
ad80: 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73  ssert( szJ==os_s
ad90: 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  zJ );.  }.#endif
ada0: 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66  ..  /* Set hdrOf
adb0: 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73  f to be the offs
adc0: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
add0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
ade0: 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  ritten.  ** this
adf0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
ae00: 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65  action, or the e
ae10: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
ae20: 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
ae30: 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
ae40: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
ae50: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
ae60: 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
ae70: 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
ae80: 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
ae90: 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
aea0: 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
aeb0: 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 0a 20 20   szJ;.  }.  ..  
aec0: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
aed0: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
aee0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
aef0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
af00: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
af10: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
af20: 74 6d 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  tmtSize);.  pPag
af30: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
af40: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a  ger->stmtSize;..
af50: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
af60: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
af70: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
af80: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
af90: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
afa0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
afb0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
afc0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
afd0: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
afe0: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e  r->stfd, 0);.  n
aff0: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
b000: 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  mtNRec;.  .  /* 
b010: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
b020: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ges out of the s
b030: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
b040: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
b050: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
b060: 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61   file.  Note tha
b070: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
b080: 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68  journal omits ch
b090: 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a  ecksums from.  *
b0a0: 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69  * each record si
b0b0: 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  nce power-failur
b0c0: 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f  e recovery is no
b0d0: 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73  t important to s
b0e0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f  tatement.  ** jo
b0f0: 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  urnals..  */.  f
b100: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
b110: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
b120: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
b130: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
b140: 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  , &pPager->stfd,
b150: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
b160: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
b170: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
b180: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
b190: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
b1a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
b1b0: 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
b1c0: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
b1d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
b1e0: 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
b1f0: 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
b200: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
b210: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
b220: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
b230: 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
b240: 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
b250: 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
b260: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
b270: 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
b280: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
b290: 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
b2a0: 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
b2b0: 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
b2c0: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
b2d0: 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
b2e0: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
b2f0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
b300: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
b310: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
b320: 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
b330: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
b340: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
b350: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
b360: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
b370: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
b380: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
b390: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
b3a0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
b3b0: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
b3c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
b3d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
b3e0: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
b3f0: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
b400: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61  ->stmtCksum;.  a
b410: 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48  ssert( JOURNAL_H
b420: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70  DR_SZ(pPager)<(p
b430: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
b440: 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  8) );.  while( p
b450: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b460: 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50  f <= (hdrOff-(pP
b470: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
b480: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  )) ){.    rc = p
b490: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
b4a0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
b4b0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
b4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
b4d0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
b4e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b4f0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
b500: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
b510: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50    }..  while( pP
b520: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b530: 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33   < szJ ){.    u3
b540: 32 20 6e 52 65 63 3b 0a 20 20 20 20 75 33 32 20  2 nRec;.    u32 
b550: 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
b560: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
b570: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
b580: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
b590: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b5a0: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
b5b0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
b5c0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
b5d0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
b5e0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
b5f0: 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nRec==0 ){.   
b600: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
b610: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b620: 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
b630: 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
b640: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52 65   }.    for(i=nRe
b650: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
b660: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b670: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
b680: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
b690: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
b6a0: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
b6b0: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  >jfd, 1);.      
b6c0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
b6d0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
b6e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b6f0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
b700: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
b710: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
b720: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
b730: 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f  zJ;.  .end_stmt_
b740: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
b750: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b760: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
b770: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
b780: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
b790: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
b7a0: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
b7b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b7c0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f  Off = szJ;.    /
b7d0: 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  * pager_reload_c
b7e0: 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f  ache(pPager); */
b7f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
b810: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
b820: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
b830: 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
b840: 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20   allowed..**.** 
b850: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
b860: 65 72 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75  er is the absolu
b870: 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  te value of the 
b880: 6d 78 50 61 67 65 20 70 61 72 61 6d 65 74 65 72  mxPage parameter
b890: 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69  ..** If mxPage i
b8a0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
b8b0: 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61  noSync flag is a
b8c0: 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63  lso set.  noSync
b8d0: 20 62 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c   bypasses.** cal
b8e0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 53  ls to sqlite3OsS
b8f0: 79 6e 63 28 29 2e 20 20 54 68 65 20 70 61 67 65  ync().  The page
b900: 72 20 72 75 6e 73 20 6d 75 63 68 20 66 61 73 74  r runs much fast
b910: 65 72 20 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f  er with noSync o
b920: 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20 74 68 65  n,.** but if the
b930: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
b940: 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
b950: 72 65 20 69 73 20 61 6e 20 61 62 72 75 70 74 20  re is an abrupt 
b960: 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72  power .** failur
b970: 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
b980: 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 65  file might be le
b990: 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
b9a0: 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72  stent and.** unr
b9b0: 65 70 61 69 72 61 62 6c 65 20 73 74 61 74 65 2e  epairable state.
b9c0: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
b9d0: 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68  e3pager_set_cach
b9e0: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
b9f0: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
ba00: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 3d  {.  if( mxPage>=
ba10: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
ba20: 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
ba30: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
ba40: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
ba50: 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
ba60: 64 53 79 6e 63 20 3d 20 30 3b 20 0a 20 20 7d 65  dSync = 0; .  }e
ba70: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
ba80: 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  >noSync = 1;.   
ba90: 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50 61 67   mxPage = -mxPag
baa0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78 50  e;.  }.  if( mxP
bab0: 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50  age>10 ){.    pP
bac0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d  ager->mxPage = m
bad0: 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xPage;.  }else{.
bae0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
baf0: 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge = 10;.  }.}..
bb00: 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
bb10: 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
bb20: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
bb30: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
bb40: 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
bb50: 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
bb60: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
bb70: 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
bb80: 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
bb90: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
bba0: 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
bbb0: 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
bbc0: 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
bbd0: 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
bbe0: 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
bbf0: 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
bc00: 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
bc10: 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
bc20: 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
bc30: 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
bc40: 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
bc50: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
bc60: 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
bc70: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
bc80: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
bc90: 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
bca0: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
bcb0: 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
bcc0: 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
bcd0: 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
bce0: 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
bcf0: 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
bd00: 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
bd20: 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
bd30: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
bd40: 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
bd50: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
bd60: 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
bd70: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
bd80: 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
bd90: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
bda0: 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
bdb0: 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
bdc0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
bdd0: 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
bde0: 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
bdf0: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
be00: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
be10: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
be20: 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
be30: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
be40: 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
be50: 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
be60: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
be70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
be80: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
be90: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
bea0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
beb0: 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
bec0: 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
bed0: 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
bee0: 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
bef0: 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
bf00: 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
bf10: 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
bf30: 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
bf40: 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
bf50: 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
bf60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
bf70: 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
bf80: 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
bf90: 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
bfa0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
bfb0: 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
bfc0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
bfd0: 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
bfe0: 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
bff0: 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
c000: 3d 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  =3..*/.void sqli
c010: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66  te3pager_set_saf
c020: 65 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20  ety_level(Pager 
c030: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
c040: 65 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  el){.  pPager->n
c050: 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
c060: 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
c070: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
c080: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
c090: 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
c0a0: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28  >tempFile;.  if(
c0b0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
c0c0: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
c0d0: 6e 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nc = 0;.}../*.**
c0e0: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
c0f0: 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  y file.  Write t
c100: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
c110: 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a  ile into zName.*
c120: 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  * (zName must be
c130: 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45   at least SQLITE
c140: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62  _TEMPNAME_SIZE b
c150: 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69  ytes long.)  Wri
c160: 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  te.** the file d
c170: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
c180: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
c190: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
c1a0: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
c1b0: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
c1c0: 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54  we fail..**.** T
c1d0: 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
c1e0: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
c1f0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
c200: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  le when it is.**
c210: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
c220: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61  ic int sqlite3pa
c230: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
c240: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
c250: 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74   *fd){.  int cnt
c260: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
c270: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
c280: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65  .    sqlite3OsTe
c290: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65  mpFileName(zFile
c2a0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
c2b0: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
c2c0: 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29  ve(zFile, fd, 1)
c2d0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e  ;.  }while( cnt>
c2e0: 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 && rc!=SQLITE_
c2f0: 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
c300: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75  _NOMEM );.  retu
c310: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c320: 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
c330: 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20  e cache and put 
c340: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c350: 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a   page cache in *
c360: 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  ppPager..** The 
c370: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
c380: 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74  d need not exist
c390: 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
c3a0: 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a  ot locked until.
c3b0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ** the first cal
c3c0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  l to sqlite3page
c3d0: 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f  r_get() and is o
c3e0: 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e  nly held open un
c3f0: 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20  til the.** last 
c400: 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
c410: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70 61   using sqlite3pa
c420: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a  ger_unref()..**.
c430: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
c440: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
c450: 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
c460: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
c470: 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
c480: 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
c490: 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54  to be cached.  T
c4a0: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
c4b0: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
c4c0: 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74  atically when it
c4d0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
c4e0: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
c4f0: 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
c500: 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  n all informatio
c510: 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
c520: 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76  he..** It is nev
c530: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
c540: 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  sk.  This can be
c550: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
c560: 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  nt an.** in-memo
c570: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ry database..*/.
c580: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
c590: 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a  _open(.  Pager *
c5a0: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
c5b0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
c5c0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
c5d0: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
c5e0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
c5f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
c600: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c610: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
c620: 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
c630: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
c640: 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
c650: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
c660: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  ge */.  int useJ
c670: 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20 20  ournal          
c680: 20 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65 20   /* TRUE to use 
c690: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
c6a0: 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  al on this file 
c6b0: 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  */.){.  Pager *p
c6c0: 50 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a  Pager;.  char *z
c6d0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30  FullPathname = 0
c6e0: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
c6f0: 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20  .  OsFile fd;.  
c700: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c710: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
c720: 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
c730: 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
c740: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
c750: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54 65   = 0;.  char zTe
c760: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
c770: 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70  ME_SIZE];..  *pp
c780: 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d  Pager = 0;.  mem
c790: 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65  set(&fd, 0, size
c7a0: 6f 66 28 66 64 29 29 3b 0a 20 20 69 66 28 20 73  of(fd));.  if( s
c7b0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
c7c0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
c7d0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
c7e0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65  .  }.  if( zFile
c7f0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
c800: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20  e[0] ){.    if( 
c810: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
c820: 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
c830: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
c840: 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50   1;.      zFullP
c850: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
c860: 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20  StrDup("");.    
c870: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
c880: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c890: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
c8a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
c8b0: 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Pathname(zFilena
c8c0: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
c8d0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
c8e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c8f0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
c900: 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ite(zFullPathnam
c910: 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c  e, &fd, &readOnl
c920: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
c930: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
c940: 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
c950: 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
c960: 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65   &fd);.    zFile
c970: 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  name = zTemp;.  
c980: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
c990: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
c9a0: 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  athname(zFilenam
c9b0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
c9c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c9d0: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
c9e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c9f0: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
ca00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
ca10: 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20  Close(&fd);.    
ca20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ca30: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  MEM;.  }.  if( r
ca40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ca50: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ca60: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  se(&fd);.    sql
ca70: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
ca80: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
ca90: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d  rn rc;.  }.  nam
caa0: 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46  eLen = strlen(zF
cab0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
cac0: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
cad0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
cae0: 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
caf0: 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 69 66 28  *3 + 30 );.  if(
cb00: 20 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20   pPager==0 ){.  
cb10: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
cb20: 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&fd);.    sqlit
cb30: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
cb40: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
cb50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
cb60: 20 7d 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45   }.  TRACE3("OPE
cb70: 4e 20 25 64 20 25 73 5c 6e 22 2c 20 66 64 2e 68  N %d %s\n", fd.h
cb80: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
cb90: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
cba0: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
cbb0: 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
cbc0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
cbd0: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
cbe0: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
cbf0: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
cc00: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
cc10: 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65  Directory[nameLe
cc20: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
cc30: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
cc40: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
cc50: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
cc60: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
cc70: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
cc80: 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20   for(i=nameLen; 
cc90: 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
cca0: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
ccb0: 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
ccc0: 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
ccd0: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
cce0: 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50  = 0;.  strcpy(pP
ccf0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
cd00: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
cd10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
cd20: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
cd30: 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  trcpy(&pPager->z
cd40: 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d  Journal[nameLen]
cd50: 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20  , "-journal");. 
cd60: 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64   pPager->fd = fd
cd70: 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  ;.#if OS_UNIX.  
cd80: 70 50 61 67 65 72 2d 3e 66 64 2e 70 50 61 67 65  pPager->fd.pPage
cd90: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64  r = pPager;.#end
cda0: 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  if.  pPager->jou
cdb0: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
cdc0: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
cdd0: 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20  al = useJournal 
cde0: 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61  && !memDb;.  pPa
cdf0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
ce00: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
ce10: 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50  tInUse = 0;.  pP
ce20: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
ce30: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
ce40: 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
ce50: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
ce60: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
ce70: 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61  PAGE_SIZE;.  pPa
ce80: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
ce90: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
cea0: 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  tJSize = 0;.  pP
ceb0: 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
cec0: 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
ced0: 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65  e = 100;.  pPage
cee0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
cef0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
cf00: 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a  r->errMask = 0;.
cf10: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
cf20: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
cf30: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
cf40: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
cf50: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
cf60: 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d  dOnly;.  pPager-
cf70: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
cf80: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
cf90: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
cfa0: 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
cfb0: 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  l;.  pPager->ful
cfc0: 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  lSync = (pPager-
cfd0: 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20  >noSync?0:1);.  
cfe0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
cff0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
d000: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a  irstSynced = 0;.
d010: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
d020: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
d030: 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a  Extra = nExtra;.
d040: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
d050: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
d060: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67  TOR_SIZE;.  pPag
d070: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
d080: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70   = 0;.  memset(p
d090: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
d0a0: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
d0b0: 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61  aHash));.  *ppPa
d0c0: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
d0d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d0e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
d0f0: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
d100: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
d110: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
d120: 65 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50  et_busyhandler(P
d130: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
d140: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
d150: 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
d160: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
d170: 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
d180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
d190: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
d1a0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
d1b0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
d1c0: 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
d1d0: 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
d1e0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
d1f0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
d200: 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
d210: 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
d220: 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
d230: 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
d240: 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
d250: 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
d260: 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
d270: 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
d280: 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
d290: 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
d2a0: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
d2b0: 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
d2c0: 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
d2d0: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61  led by sqlite3pa
d2e0: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a  ger_unref()..*/.
d2f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
d300: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
d310: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
d320: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
d330: 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  id*,int)){.  pPa
d340: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
d350: 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
d360: 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
d370: 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
d380: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
d390: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
d3a0: 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
d3b0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
d3c0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
d3d0: 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
d3e0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
d3f0: 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
d400: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
d410: 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
d420: 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
d430: 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
d440: 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
d450: 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
d460: 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
d470: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
d480: 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
d490: 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
d4a0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
d4b0: 5f 72 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  _reiniter(Pager 
d4c0: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
d4d0: 78 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69  xReinit)(void*,i
d4e0: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
d4f0: 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
d500: 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
d510: 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  t the page size.
d520: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
d530: 73 69 7a 65 20 6d 75 73 74 20 6f 6e 6c 79 20 62  size must only b
d540: 65 20 63 68 61 6e 67 65 64 20 77 68 65 6e 20 74  e changed when t
d550: 68 65 20 63 61 63 68 65 20 69 73 20 65 6d 70 74  he cache is empt
d560: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
d570: 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e3pager_set_page
d580: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
d590: 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  er, int pageSize
d5a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ){.  assert( pag
d5b0: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
d5c0: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
d5d0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
d5e0: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
d5f0: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 7d  ze = pageSize;.}
d600: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
d610: 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
d620: 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
d630: 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
d640: 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
d650: 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
d660: 6f 2e 20 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  o.  No error che
d670: 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 0a 2a  cking is done..*
d680: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
d690: 67 65 72 5f 72 65 61 64 5f 66 69 6c 65 68 65 61  ger_read_filehea
d6a0: 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
d6b0: 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
d6c0: 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
d6d0: 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
d6e0: 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 70 50   0, N);.  if( pP
d6f0: 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
d700: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  {.    sqlite3OsS
d710: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
d720: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
d730: 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
d740: 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20  fd, pDest, N);. 
d750: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
d760: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
d770: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
d780: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
d790: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
d7a0: 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20   pPager..*/.int 
d7b0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
d7c0: 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
d7d0: 61 67 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 6e  ager){.  off_t n
d7e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d7f0: 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
d800: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
d810: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
d820: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
d830: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
d840: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
d850: 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c  er->fd, &n)!=SQL
d860: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
d870: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
d880: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b   PAGER_ERR_DISK;
d890: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d8a0: 20 7d 0a 20 20 6e 20 2f 3d 20 70 50 61 67 65 72   }.  n /= pPager
d8b0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66  ->pageSize;.  if
d8c0: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
d8d0: 20 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   && n==PENDING_B
d8e0: 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
d8f0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  Size ){.    n++;
d900: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
d910: 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
d920: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50  UNLOCK ){.    pP
d930: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
d940: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
d950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
d960: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
d970: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
d980: 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
d990: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  ;.../*.** Unlink
d9a0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
d9b0: 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
d9c0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
d9d0: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
d9e0: 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
d9f0: 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
da00: 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
da10: 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
da20: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
da30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
da40: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
da50: 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
da60: 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
da70: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
da80: 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
da90: 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
daa0: 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
dab0: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
dac0: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
dad0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
dae0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
daf0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
db00: 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
db10: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
db20: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
db30: 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
db40: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
db50: 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
db60: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
db70: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
db80: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
db90: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
dba0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
dbb0: 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
dbc0: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
dbd0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
dbe0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
dbf0: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
dc00: 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
dc10: 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
dc20: 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
dc30: 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
dc40: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
dc50: 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
dc60: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
dc70: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
dc80: 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
dc90: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
dca0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
dcb0: 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
dcc0: 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
dcd0: 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ash table */.  i
dce0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
dcf0: 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
dd00: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
dd10: 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
dd20: 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
dd30: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
dd40: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
dd50: 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  ash->pNextHash =
dd60: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
dd70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
dd80: 74 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68  t h = pager_hash
dd90: 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  (pPg->pgno);.   
dda0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
ddb0: 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29  >aHash[h]==pPg )
ddc0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
ddd0: 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e  ash[h] = pPg->pN
dde0: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 70  extHash;.  }.  p
ddf0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
de00: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
de10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
de20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
de30: 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e  d to truncate an
de40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
de50: 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20  ase.  Delete.** 
de60: 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
de70: 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74  pgno is larger t
de80: 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
de90: 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65  ze and is unrefe
dea0: 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72  renced..** Refer
deb0: 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
dec0: 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
ded0: 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
dee0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
def0: 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  d memoryTruncate
df00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
df10: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
df20: 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
df30: 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
df40: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
df50: 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
df60: 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
df70: 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
df80: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
df90: 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
dfa0: 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
dfb0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
dfc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
dfd0: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
dfe0: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
dff0: 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
e000: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
e010: 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
e020: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
e030: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e040: 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
e050: 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c  xtAll;.      unl
e060: 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
e070: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
e080: 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
e090: 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
e0a0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
e0b0: 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
e0c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
e0d0: 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65  f pages specifie
e0e0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e0f0: 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
e100: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
e110: 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
e120: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 70  t rc;.  sqlite3p
e130: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
e140: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
e150: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
e160: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
e170: 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
e180: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
e190: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  c;.  }.  if( nPa
e1a0: 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50  ge>=(unsigned)pP
e1b0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
e1c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e1d0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
e1e0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
e1f0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
e200: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
e210: 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
e220: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
e230: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
e240: 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f   }.  rc = syncJo
e250: 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
e260: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e270: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
e280: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
e290: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
e2a0: 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20  Pager, nPage);. 
e2b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e2c0: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
e2d0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
e2e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
e2f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
e300: 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
e310: 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
e320: 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
e330: 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
e340: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
e350: 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
e360: 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
e370: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
e380: 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
e390: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
e3a0: 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
e3b0: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
e3c0: 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
e3d0: 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
e3e0: 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
e3f0: 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
e400: 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
e410: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
e420: 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
e430: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
e440: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
e450: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
e460: 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  edump..*/.int sq
e470: 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
e480: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
e490: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
e4a0: 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28  pNext;.  switch(
e4b0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29   pPager->state )
e4c0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
e4d0: 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63  _RESERVED:.    c
e4e0: 61 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ase PAGER_SYNCED
e4f0: 3a 20 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  : .    case PAGE
e500: 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20  R_EXCLUSIVE: {. 
e510: 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
e520: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
e530: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
e540: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
e550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
e560: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
e570: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
e580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
e590: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
e5a0: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
e5b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e5c0: 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  }.    case PAGER
e5d0: 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20  _SHARED: {.     
e5e0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
e5f0: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mDb ){.        s
e600: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
e610: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
e620: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
e630: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e640: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
e650: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
e660: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ing */.      bre
e670: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
e680: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
e690: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
e6a0: 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e  Next){.#ifndef N
e6b0: 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 50  DEBUG.    if( pP
e6c0: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
e6d0: 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
e6e0: 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
e6f0: 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
e700: 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
e710: 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
e720: 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
e730: 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
e740: 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
e750: 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
e760: 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
e770: 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d  ndif.    pNext =
e780: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
e790: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
e7a0: 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  Pg);.  }.  TRACE
e7b0: 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  2("CLOSE %d\n", 
e7c0: 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
e7d0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
e7e0: 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
e7f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
e800: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
e810: 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
e820: 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
e830: 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
e840: 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
e850: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
e860: 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
e870: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
e880: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
e890: 2a 2a 20 7d 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ** }.  */.  if( 
e8a0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
e8b0: 65 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67 65  e!=(char*)&pPage
e8c0: 72 5b 31 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  r[1] ){.    asse
e8d0: 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e  rt( 0 );  /* Can
e8e0: 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  not happen */.  
e8f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
e900: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
e910: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e920: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e930: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
e940: 65 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  e(pPager->zDirec
e950: 74 6f 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tory);.  }.  sql
e960: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
e970: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e980: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
e990: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
e9a0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
e9b0: 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
e9c0: 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67  .Pgno sqlite3pag
e9d0: 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f  er_pagenumber(vo
e9e0: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
e9f0: 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f  Hdr *p = DATA_TO
ea00: 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
ea10: 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
ea20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
ea30: 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f  ge_ref() functio
ea40: 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  n increments the
ea50: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
ea60: 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20   for a page..** 
ea70: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63  If the page is c
ea80: 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
ea90: 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
eaa0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
eab0: 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
eac0: 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
ead0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
eae0: 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73  * For non-test s
eaf0: 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
eb00: 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68  () is a macro th
eb10: 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72  at calls _page_r
eb20: 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f  ef().** online o
eb30: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
eb40: 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20  count is zero.  
eb50: 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73  For test systems
eb60: 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20  , page_ref().** 
eb70: 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  is a real functi
eb80: 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  on so that we ca
eb90: 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74  n set breakpoint
eba0: 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a  s and trace it..
ebb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
ebc0: 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
ebd0: 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
ebe0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
ebf0: 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
ec00: 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
ec10: 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
ec20: 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
ec30: 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65   pPg==pPg->pPage
ec40: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
ec50: 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
ec60: 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
ec70: 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ee;.      while(
ec80: 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
ec90: 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
eca0: 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70  tFree; }.      p
ecb0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
ecc0: 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
ecd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
ece0: 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
ecf0: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
ed00: 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
ed10: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
ed20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ed30: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
ed40: 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
ed50: 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tFree;.    }.   
ed60: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
ed70: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
ed80: 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
ed90: 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
eda0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  revFree;.    }el
edb0: 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
edc0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
edd0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
ede0: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
edf0: 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
ee00: 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
ee10: 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
ee20: 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
ee30: 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 76  _TEST.  static v
ee40: 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
ee50: 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
ee60: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
ee70: 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
ee80: 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
ee90: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
eea0: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
eeb0: 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
eec0: 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
eed0: 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
eee0: 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
eef0: 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
ef00: 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
ef10: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
ef20: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
ef30: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
ef40: 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
ef50: 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
ef60: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
ef70: 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
ef80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
ef90: 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  r_ref(void *pDat
efa0: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
efb0: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
efc0: 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f  (pData);.  page_
efd0: 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
efe0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
eff0: 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
f000: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
f010: 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
f020: 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
f030: 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
f040: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
f050: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
f060: 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
f070: 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
f080: 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
f090: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
f0a0: 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
f0b0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
f0c0: 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
f0d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
f0e0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
f0f0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
f100: 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
f110: 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
f120: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
f130: 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
f140: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
f150: 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
f160: 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
f170: 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
f180: 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
f190: 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
f1a0: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
f1b0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
f1c0: 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
f1d0: 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
f1e0: 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
f1f0: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
f200: 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
f210: 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
f220: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
f230: 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
f240: 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
f250: 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
f260: 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
f270: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
f280: 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
f290: 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
f2a0: 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
f2b0: 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
f2c0: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
f2d0: 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
f2e0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
f2f0: 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
f300: 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
f310: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
f320: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
f330: 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
f340: 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
f350: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
f360: 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
f370: 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20  ailure, so sync 
f380: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
f390: 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
f3a0: 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  s the needSync f
f3b0: 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61  ield of every pa
f3c0: 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20  ge current held 
f3d0: 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  in.** memory..*/
f3e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
f3f0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
f400: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
f410: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
f420: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
f430: 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
f440: 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
f450: 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
f460: 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
f470: 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
f480: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
f490: 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
f4a0: 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
f4b0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
f4c0: 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
f4d0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
f4e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f4f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
f500: 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73  n );.      /* as
f510: 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e  sert( !pPager->n
f520: 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79  oSync ); // noSy
f530: 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20  nc might be set 
f540: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  if synchronous. 
f550: 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e       ** was turn
f560: 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65  ed off after the
f570: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
f580: 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65   started.  Ticke
f590: 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65  t #615 */.#ifnde
f5a0: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b  f NDEBUG.      {
f5b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
f5c0: 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72   sure the pPager
f5d0: 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77  ->nRec counter w
f5e0: 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67  e are keeping ag
f5f0: 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  rees.        ** 
f600: 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f  with the nRec co
f610: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
f620: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
f630: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
f640: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66    */.        off
f650: 5f 74 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20  _t jSz;.        
f660: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
f670: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
f680: 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20  jfd, &jSz);.    
f690: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
f6a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
f6b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f6c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
f6d0: 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Sz );.      }.#e
f6e0: 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
f6f0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
f700: 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
f710: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
f720: 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
f730: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
f740: 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
f750: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
f760: 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
f770: 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
f780: 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
f790: 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
f7a0: 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
f7b0: 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
f7c0: 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
f7d0: 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
f7e0: 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
f7f0: 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  k. .        */. 
f800: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
f810: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
f820: 20 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28           TRACE2(
f830: 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
f840: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
f850: 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 20 20 20  fd.h);.         
f860: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
f870: 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
f880: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
f890: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
f8a0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
f8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
f8c0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
f8d0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f8e0: 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
f8f0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
f900: 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
f910: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
f920: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52  >jfd, pPager->nR
f930: 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
f940: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
f950: 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
f960: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
f970: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
f980: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20  urnalOff);.     
f990: 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28   }.      TRACE2(
f9a0: 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
f9b0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
f9c0: 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 72 63 20  fd.h);.      rc 
f9d0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
f9e0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
f9f0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
fa00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fa10: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
fa20: 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
fa30: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
fa40: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
fa50: 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
fa60: 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
fa70: 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
fa80: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
fa90: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
faa0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
fab0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
fac0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
fad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
fae0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
faf0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
fb00: 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
fb10: 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
fb20: 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
fb30: 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
fb40: 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
fb50: 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
fb60: 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
fb70: 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
fb80: 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
fb90: 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
fba0: 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
fbb0: 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
fbc0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
fbd0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
fbe0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
fbf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
fc00: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
fc10: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
fc20: 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
fc30: 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
fc40: 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
fc50: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
fc60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
fc70: 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
fc80: 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
fc90: 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
fca0: 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
fcb0: 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
fcc0: 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
fcd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
fce0: 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
fcf0: 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
fd00: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
fd10: 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
fd20: 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
fd30: 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
fd40: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
fd50: 0a 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b  .  int busy = 1;
fd60: 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
fd70: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
fd80: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
fd90: 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
fda0: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
fdb0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
fdc0: 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
fdd0: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
fde0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
fdf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
fe00: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
fe10: 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
fe20: 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
fe30: 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
fe40: 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
fe50: 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
fe60: 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
fe70: 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
fe80: 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
fe90: 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
fea0: 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
feb0: 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
fec0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
fed0: 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
fee0: 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
fef0: 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
ff00: 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
ff10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
ff20: 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
ff30: 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
ff40: 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
ff50: 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
ff60: 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
ff70: 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
ff80: 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
ff90: 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
ffa0: 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
ffb0: 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
ffc0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
ffd0: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
ffe0: 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
fff0: 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
10000 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
10010 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
10020 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
10030 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
10040 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
10050 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
10060 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
10070 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
10080 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
10090 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
100a0 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
100b0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
100c0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
100d0 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
100e0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
100f0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
10100 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
10110 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  */.  do {.    rc
10120 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
10130 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  (&pPager->fd, EX
10140 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
10150 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
10160 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20  ITE_BUSY && .   
10170 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
10180 48 61 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20  Handler && .    
10190 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
101a0 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26  andler->xFunc &&
101b0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
101c0 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46  pBusyHandler->xF
101d0 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73  unc(pPager->pBus
101e0 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20  yHandler->pArg, 
101f0 62 75 73 79 2b 2b 29 0a 20 20 29 3b 0a 20 20 69  busy++).  );.  i
10200 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10210 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10220 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
10230 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
10240 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 77 68 69  XCLUSIVE;..  whi
10250 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  le( pList ){.   
10260 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
10270 64 69 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c  dirty );.    sql
10280 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
10290 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e  er->fd, (pList->
102a0 70 67 6e 6f 2d 31 29 2a 28 6f 66 66 5f 74 29 70  pgno-1)*(off_t)p
102b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
102c0 3b 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67  ;.    CODEC(pPag
102d0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
102e0 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
102f0 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 54  >pgno, 6);.    T
10300 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20  RACE3("STORE %d 
10310 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  page %d\n", pPag
10320 65 72 2d 3e 66 64 2e 68 2c 20 70 4c 69 73 74 2d  er->fd.h, pList-
10330 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 72 63 20 3d  >pgno);.    rc =
10340 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10350 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
10360 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
10370 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
10380 69 7a 65 29 3b 0a 20 20 20 20 43 4f 44 45 43 28  ize);.    CODEC(
10390 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
103a0 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
103b0 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  ist->pgno, 0);. 
103c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
103d0 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74  rn rc;.    pList
103e0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
103f0 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
10400 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65  pDirty;.  }.  re
10410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10420 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74  }../*.** Collect
10430 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67   every dirty pag
10440 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c  e into a dirty l
10450 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ist and.** retur
10460 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
10470 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20  he head of that 
10480 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73  list.  All pages
10490 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65   are.** collecte
104a0 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61  d even if they a
104b0 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e  re still in use.
104c0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
104d0 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f   *pager_get_all_
104e0 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65  dirty_pages(Page
104f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
10500 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a  Hdr *p, *pList;.
10510 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66    pList = 0;.  f
10520 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
10530 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
10540 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  All){.    if( p-
10550 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
10560 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69 73  p->pDirty = pLis
10570 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  t;.      pList =
10580 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   p;.    }.  }.  
10590 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
105a0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
105b0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
105c0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
105d0 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
105e0 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
105f0 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
10600 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
10610 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
10620 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
10630 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
10640 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65  sed..**.** A _ge
10650 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  t works for any 
10660 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
10670 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
10680 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10690 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
106a0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
106b0 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
106c0 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
106d0 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
106e0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
106f0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
10700 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
10710 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
10720 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
10730 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
10740 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
10750 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
10760 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
10770 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
10780 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
10790 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
107a0 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
107b0 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
107c0 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
107d0 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
107e0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
107f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
10800 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
10810 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
10820 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
10830 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20  ager_lookup().  
10840 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
10850 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20  e and _lookup() 
10860 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
10870 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
10880 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
10890 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
108a0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
108b0 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
108c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
108d0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
108e0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
108f0 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  s _lookup().** j
10900 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
10910 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
10920 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
10930 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
10940 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
10950 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
10960 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
10970 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
10980 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
10990 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28  * Since _lookup(
109a0 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
109b0 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
109c0 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
109d0 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
109e0 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
109f0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  t sqlite3pager_g
10a00 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
10a10 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
10a20 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50  d **ppPage){.  P
10a30 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
10a40 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20   rc;..  /* Make 
10a50 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
10a60 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
10a70 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
10a80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10a90 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
10aa0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70   pgno!=0 );.  *p
10ab0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  pPage = 0;.  if(
10ac0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
10ad0 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46   & ~(PAGER_ERR_F
10ae0 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ULL) ){.    retu
10af0 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
10b00 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
10b10 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
10b20 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
10b30 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
10b40 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
10b50 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
10b60 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
10b70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
10b80 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  f==0 && !pPager-
10b90 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e  >memDb ){.    in
10ba0 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20  t busy = 1;.    
10bb0 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
10bc0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
10bd0 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
10be0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 77 68  D_LOCK);.    }wh
10bf0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
10c00 42 55 53 59 20 26 26 20 0a 20 20 20 20 20 20 20  BUSY && .       
10c10 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
10c20 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20  ndler && .      
10c30 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
10c40 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26  andler->xFunc &&
10c50 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
10c60 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
10c70 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42  xFunc(pPager->pB
10c80 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67  usyHandler->pArg
10c90 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 29 3b  , busy++).    );
10ca0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10cb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10cc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10cd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
10ce0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
10cf0 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  D;..    /* If a 
10d00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
10d10 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
10d20 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
10d30 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
10d40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
10d50 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
10d60 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
10d70 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
10d80 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
10d90 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
10da0 72 6e 61 6c 20 26 26 20 0a 20 20 20 20 20 20 20  rnal && .       
10db0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
10dc0 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  ists(pPager->zJo
10dd0 75 72 6e 61 6c 29 20 26 26 0a 20 20 20 20 20 20  urnal) &&.      
10de0 20 20 21 73 71 6c 69 74 65 33 4f 73 43 68 65 63    !sqlite3OsChec
10df0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 26 70  kReservedLock(&p
10e00 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 20  Pager->fd) .    
10e10 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72 63  ){.       int rc
10e20 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ;..       /* Get
10e30 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
10e40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
10e50 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
10e60 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
10e70 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
10e80 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
10e90 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
10ea0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
10eb0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 2a   to the.       *
10ec0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
10ed0 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
10ee0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
10ef0 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
10f00 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
10f10 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
10f20 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
10f30 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
10f40 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  t the.       ** 
10f50 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
10f60 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
10f70 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
10f80 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
10f90 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e  .       ** back.
10fa0 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  .       ** .    
10fb0 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
10fc0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
10fd0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
10fe0 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74  not requested, t
10ff0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65 63  he.       ** sec
11000 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
11010 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
11020 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
11030 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
11040 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73    ** obtain it's
11050 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
11060 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
11070 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
11080 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
11090 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
110a0 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
110b0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
110c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
110d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
110e0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
110f0 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  (&pPager->fd, NO
11100 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
11110 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
11120 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
11130 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
11140 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  c;.       }.    
11150 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
11160 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
11170 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f  VE;..       /* O
11180 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
11190 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
111a0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
111b0 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
111c0 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  ** we are unable
111d0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
111e0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
111f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20     **.       ** 
11200 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
11210 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
11220 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65  o be locked itse
11230 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  lf.  The.       
11240 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
11250 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e  is never open un
11260 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61  less the main da
11270 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
11280 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72  s.       ** a wr
11290 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65  ite lock, so the
112a0 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20  re is never any 
112b0 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72  chance of two or
112c0 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20   more.       ** 
112d0 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e  processes openin
112e0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74  g the journal at
112f0 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
11300 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
11310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
11320 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67  penReadOnly(pPag
11330 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
11340 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
11350 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11370 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
11380 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
11390 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  O_LOCK);.       
113a0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
113b0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
113c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
113d0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
113e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
113f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
11400 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61   = 1;.       pPa
11410 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
11420 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ted = 0;.       
11430 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11440 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  ff = 0;.       p
11450 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
11460 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61   = 0;.       pPa
11470 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
11480 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  = 0;..       /* 
11490 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
114a0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
114b0 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
114c0 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
114d0 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
114e0 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
114f0 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  lock..       */.
11500 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
11510 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
11520 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  r);.       if( r
11530 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11540 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11550 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
11560 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a   }.    pPg = 0;.
11570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11580 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20  Search for page 
11590 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20  in cache */.    
115a0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
115b0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
115c0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
115d0 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
115e0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
115f0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
11600 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
11610 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
11620 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
11630 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
11640 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
11650 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
11660 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
11670 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50     int h;.    pP
11680 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20  ager->nMiss++;. 
11690 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
116a0 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
116b0 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  age || pPager->p
116c0 46 69 72 73 74 3d 3d 30 20 7c 7c 20 70 50 61 67  First==0 || pPag
116d0 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
116e0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
116f0 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ew page */.     
11700 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
11710 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
11720 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70  pPg) + pPager->p
11730 61 67 65 53 69 7a 65 20 0a 20 20 20 20 20 20 20  ageSize .       
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
11760 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
11770 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 20 20 20 2b 20 70 50 61 67 65 72 2d 3e 6d 65      + pPager->me
117a0 6d 44 62 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  mDb*sizeof(PgHis
117b0 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69  tory) );.      i
117c0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
117d0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
117e0 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20  ->memDb ){.     
117f0 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72 69       pager_unwri
11800 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
11810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11820 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
11830 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d  k |= PAGER_ERR_M
11840 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  EM;.        retu
11850 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
11860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
11870 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69  emset(pPg, 0, si
11880 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20  zeof(*pPg));.   
11890 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
118a0 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emDb ){.        
118b0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
118c0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
118d0 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48  ), 0, sizeof(PgH
118e0 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20  istory));.      
118f0 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
11900 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
11910 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
11920 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
11930 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
11940 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
11950 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
11960 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
11970 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61      /* Find a pa
11980 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
11990 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
119a0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
119b0 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75  ot.      ** requ
119c0 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
119d0 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
119e0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
119f0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61  .      pPg = pPa
11a00 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
11a10 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  d;..      /* If 
11a20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  we could not fin
11a30 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  d a page that do
11a40 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
11a50 6e 20 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20  n fsync().      
11a60 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
11a70 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
11a80 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
11a90 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
11aa0 20 20 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f       ** very slo
11ab0 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
11ac0 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
11ad0 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
11ae0 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a  ometimes.      *
11af0 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
11b00 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lped..      */. 
11b10 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
11b20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
11b30 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
11b40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
11b50 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
11b60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
11b70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
11b80 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
11b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11ba0 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
11bb0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
11bc0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
11bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
11be0 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
11bf0 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a  e, write a new j
11c00 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
11c10 74 6f 20 74 68 65 0a 09 20 20 2a 2a 20 6a 6f 75  to the..  ** jou
11c20 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
11c30 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
11c40 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
11c50 61 20 6a 6f 75 72 6e 61 6c 0a 09 20 20 2a 2a 20  a journal..  ** 
11c60 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69  header that is i
11c70 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72  nvolved in the r
11c80 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73  ollback of pages
11c90 20 74 68 61 74 20 68 61 76 65 0a 09 20 20 2a 2a   that have..  **
11ca0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
11cb0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
11cc0 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
11cd0 68 65 20 68 65 61 64 65 72 20 69 73 0a 09 20 20  he header is..  
11ce0 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
11cf0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
11d00 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
11d10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11d20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
11d30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
11d40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
11d50 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b  ournalOff > 0 );
11d60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
11d70 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
11d80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
11d90 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
11da0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
11db0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
11dc0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
11dd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
11de0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
11df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11e00 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  }.        pPg = 
11e10 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
11e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
11e30 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
11e40 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
11e50 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
11e60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
11e70 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
11e80 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
11e90 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74     if( pPg->dirt
11ea0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
11eb0 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
11ec0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nc==0 );.       
11ed0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
11ee0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
11ef0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
11f00 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
11f10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11f20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11f30 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
11f40 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
11f50 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
11f60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
11f70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11f80 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
11f90 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
11fa0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
11fb0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72  he page we are r
11fc0 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b  ecycling is mark
11fd0 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
11fe0 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20  back, then.     
11ff0 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
12000 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
12010 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
12020 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  abling the.     
12030 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f   ** sqlite_dont_
12040 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  rollback() optim
12050 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
12060 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
12070 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
12080 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
12090 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
120a0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
120b0 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
120c0 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69  back.      ** mi
120d0 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
120e0 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
120f0 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
12100 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
12110 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ber.      ** tha
12120 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20  t is was marked 
12130 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20  alwaysRollback. 
12140 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
12150 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a   all pages must.
12160 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b        ** be mark
12170 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
12180 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
12190 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  n out..      */.
121a0 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61        if( pPg->a
121b0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
121c0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
121d0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
121e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
121f0 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68      /* Unlink th
12200 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
12210 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
12220 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
12230 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12240 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
12250 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
12260 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Ovfl++;.    }.  
12270 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
12280 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
12290 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
122a0 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
122b0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
122c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
122d0 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
122e0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
122f0 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
12300 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
12310 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
12320 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
12330 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
12340 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
12350 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
12360 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
12370 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
12380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12390 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
123a0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
123b0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
123c0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
123d0 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69  r->aInStmt && (i
123e0 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
123f0 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20  >stmtSize.      
12400 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
12410 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f  r->aInStmt[pgno/
12420 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
12430 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
12440 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
12450 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
12460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
12470 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
12480 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
12490 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72    }.    pPg->dir
124a0 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
124b0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
124c0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
124d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
124e0 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68  .    h = pager_h
124f0 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ash(pgno);.    p
12500 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
12510 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
12520 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
12530 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
12540 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
12550 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
12560 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
12570 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
12580 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
12590 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
125a0 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
125b0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
125c0 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
125d0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
125e0 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
125f0 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
12600 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
12610 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61   }.    sqlite3pa
12620 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
12630 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
12640 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
12650 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12660 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
12670 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
12680 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
12690 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
126a0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
126b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
126c0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
126d0 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a  ze<(int)pgno ){.
126e0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
126f0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
12700 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
12710 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
12720 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
12730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12740 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
12750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
12760 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
12770 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66 66  d, (pgno-1)*(off
12780 5f 74 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  _t)pPager->pageS
12790 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
127a0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
127b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
127c0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
127d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
127e0 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
127f0 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
12800 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
12810 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  .h, pPg->pgno);.
12820 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
12830 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
12840 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e  A(pPg), pPg->pgn
12850 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 3);.      if(
12860 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12870 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  {.        off_t 
12880 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  fileSize;.      
12890 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
128a0 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
128b0 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d  >fd,&fileSize)!=
128c0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
128d0 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65           || file
128e0 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65  Size>=pgno*pPage
128f0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
12900 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12910 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
12920 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
12930 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12940 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  n rc;.        }e
12950 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
12960 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
12970 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
12980 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
12990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
129a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
129b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
129c0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
129d0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
129e0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
129f0 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65  nHit++;.    page
12a00 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
12a10 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
12a20 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
12a30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12a40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
12a50 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
12a60 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
12a70 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
12a80 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
12a90 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
12aa0 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
12ab0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
12ac0 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
12ad0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
12ae0 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
12af0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
12b00 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20  e3pager_get().  
12b10 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
12b20 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
12b30 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
12b40 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73  e3pager_get() is
12b50 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
12b60 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
12b70 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
12b80 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
12b90 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
12ba0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
12bb0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
12bc0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
12bd0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
12be0 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
12bf0 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
12c00 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
12c10 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ened..*/.void *s
12c20 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
12c30 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
12c40 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
12c50 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
12c60 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
12c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
12c80 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  no!=0 );.  if( p
12c90 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
12ca0 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
12cb0 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
12cc0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
12cd0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
12ce0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
12cf0 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
12d00 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
12d10 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50  pPg);.  return P
12d20 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
12d30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
12d40 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
12d50 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
12d60 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
12d70 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
12d80 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
12d90 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
12da0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
12db0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
12dc0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
12dd0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
12de0 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
12df0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
12e00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
12e10 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
12e20 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12e30 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f  e3pager_unref(vo
12e40 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
12e50 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
12e60 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
12e70 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
12e80 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
12e90 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  .  pPg = DATA_TO
12ea0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
12eb0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
12ec0 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e  ef>0 );.  pPg->n
12ed0 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
12ee0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  (pPg);..  /* Whe
12ef0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
12f00 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20  references to a 
12f10 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61  page reach 0, ca
12f20 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74  ll the.  ** dest
12f30 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74  ructor and add t
12f40 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
12f50 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  reelist..  */.  
12f60 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
12f70 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
12f80 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65  Pager;.    pPage
12f90 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
12fa0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
12fb0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ree = 0;.    pPg
12fc0 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
12fd0 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20  ager->pLast;.   
12fe0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
12ff0 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
13000 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
13010 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
13020 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
13030 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65  = pPg;.    }else
13040 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
13050 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
13060 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
13070 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20  >needSync==0 && 
13080 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
13090 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nced==0 ){.     
130a0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
130b0 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20  ynced = pPg;.   
130c0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
130d0 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
130e0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
130f0 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
13100 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
13110 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ize);.    }.  . 
13120 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70     /* When all p
13130 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66  ages reach the f
13140 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68  reelist, drop th
13150 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d  e read lock from
13160 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
13170 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
13180 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  /.    pPager->nR
13190 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ef--;.    assert
131a0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d  ( pPager->nRef>=
131b0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
131c0 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
131d0 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
131e0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
131f0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
13200 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13220 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75  .** Create a jou
13230 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50  rnal file for pP
13240 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f  ager.  There sho
13250 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61  uld already be a
13260 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20   RESERVED.** or 
13270 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
13280 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13290 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
132a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
132b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
132c0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
132d0 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61  thing.  Return a
132e0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
132f0 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20   release the.** 
13300 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e  write lock if an
13310 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
13320 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
13330 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
13340 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
13350 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
13360 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
13370 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 61 73 73 65  >memDb );.  asse
13380 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
13390 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
133a0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
133b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
133c0 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  en==0 );.  asser
133d0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
133e0 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74  urnal );.  sqlit
133f0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
13400 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
13410 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
13420 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
13430 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
13440 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
13450 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
13460 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
13470 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
13480 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
13490 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
134a0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
134b0 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
134c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
134d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
134e0 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
134f0 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
13500 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
13510 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  d,pPager->tempFi
13520 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
13530 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13540 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
13550 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
13560 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
13570 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
13590 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
135a0 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  aInJournal);.   
135b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
135c0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  nal = 0;.    sql
135d0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
135e0 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
135f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
13600 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
13610 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
13620 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73  turn rc;.  }.  s
13630 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65  qlite3OsOpenDire
13640 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44  ctory(pPager->zD
13650 69 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65  irectory, &pPage
13660 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65  r->jfd);.  pPage
13670 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
13680 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
13690 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
136a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
136b0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
136c0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
136d0 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
136e0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
136f0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
13700 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
13710 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
13720 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
13730 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
13740 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
13750 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
13760 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
13770 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
13780 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
13790 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
137a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
137b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
137c0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
137d0 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
137e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
137f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
13800 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
13810 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
13820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13830 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13840 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
13850 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13860 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rc;  .}../*.** A
13870 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
13880 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
13890 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
138a0 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
138b0 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
138c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
138d0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
138e0 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
138f0 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  t() is called..*
13900 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
13910 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69  ger_rollback() i
13920 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
13930 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63    sqlite3pager_c
13940 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
13950 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
13960 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69  3pager_unref() i
13970 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
13980 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
13990 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
139a0 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
139b0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
139c0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
139d0 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
139e0 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
139f0 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
13a00 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
13a10 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
13a20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a  used merely to.*
13a30 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  * acquire a poin
13a40 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
13a50 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
13a60 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
13a70 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  re is.** already
13a80 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
13a90 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
13aa0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  .** The second p
13ab0 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
13ac0 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  es how much spac
13ad0 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  e in bytes to re
13ae0 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d  serve for a.** m
13af0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
13b00 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73  le-name at the s
13b10 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
13b20 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63  nal when it is c
13b30 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  reated..**.** A 
13b40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
13b50 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
13b60 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
13b70 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d  y file.  For tem
13b80 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c  porary.** files,
13b90 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
13ba0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13bb0 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
13bc0 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  il there is an.*
13bd0 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  * actual need to
13be0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
13bf0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
13c00 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
13c10 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64  already reserved
13c20 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68   for writing, th
13c30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
13c40 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
13c50 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e  lite3pager_begin
13c60 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
13c70 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
13c80 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
13c90 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
13ca0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
13cb0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
13cc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
13cd0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
13ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13cf0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
13d00 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
13d10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
13d20 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
13d30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13d40 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
13d50 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
13d60 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
13d70 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
13d80 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
13d90 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
13da0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
13db0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
13dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
13dd0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  f SQLITE_BUSY_RE
13de0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 20 20  SERVED_LOCK.    
13df0 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a    int busy = 1;.
13e00 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
13e10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13e20 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  sLock(&pPager->f
13e30 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
13e40 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
13e50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
13e60 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 70   && .          p
13e70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
13e80 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20  ler && .        
13e90 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
13ea0 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26  andler->xFunc &&
13eb0 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67   .          pPag
13ec0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
13ed0 2d 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e  ->xFunc(pPager->
13ee0 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41  pBusyHandler->pA
13ef0 72 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20  rg, busy++).    
13f00 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
13f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
13f20 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
13f30 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
13f40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
13f50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13f60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
13f70 20 64 6f 20 6e 6f 74 20 63 61 6c 6c 20 74 68 65   do not call the
13f80 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
13f90 65 6e 20 77 65 20 66 61 69 6c 20 74 6f 20 67 65  en we fail to ge
13fa0 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
13fb0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  k..        ** Th
13fc0 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 77 65  e only reason we
13fd0 20 6d 69 67 68 74 20 66 61 69 6c 20 69 73 20 62   might fail is b
13fe0 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 20 70  ecause another p
13ff0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
14000 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
14010 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
14020 20 42 75 74 20 74 68 65 20 6f 74 68 65 72 20 70   But the other p
14030 72 6f 63 65 73 73 20 77 69 6c 6c 20 6e 6f 74 20  rocess will not 
14040 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
14050 20 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74     ** release it
14060 73 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  s reserved lock 
14070 75 6e 74 69 6c 20 74 68 69 73 20 70 72 6f 63 65  until this proce
14080 73 73 20 72 65 6c 65 61 73 65 73 20 69 74 73 20  ss releases its 
14090 73 68 61 72 65 64 0a 20 20 20 20 20 20 20 20 2a  shared.        *
140a0 2a 20 6c 6f 63 6b 2e 20 20 53 6f 20 77 65 20 6d  * lock.  So we m
140b0 69 67 68 74 20 61 73 20 77 65 6c 6c 20 66 61 69  ight as well fai
140c0 6c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  l in this proces
140d0 73 2c 20 6c 65 74 20 69 74 20 72 65 6c 65 61 73  s, let it releas
140e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73  e.        ** its
140f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 73 6f 20   shared lock so 
14100 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70  that the other p
14110 72 6f 63 65 73 73 20 63 61 6e 20 63 6f 6d 6d 69  rocess can commi
14120 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
14130 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
14140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14150 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
14160 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
14170 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
14180 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
14190 20 20 20 54 52 41 43 45 32 28 22 54 52 41 4e 53     TRACE2("TRANS
141a0 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 70 50  ACTION %d\n", pP
141b0 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20  ager->fd.h);.   
141c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
141d0 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
141e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
141f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
14200 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
14210 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
14220 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
14230 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14240 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
14250 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
14260 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
14270 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
14280 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
14290 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
142a0 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
142b0 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
142c0 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
142d0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
142e0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
142f0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
14300 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
14310 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
14320 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
14330 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
14340 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
14350 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
14360 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
14370 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
14380 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
14390 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
143a0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
143b0 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
143c0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
143d0 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
143e0 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
143f0 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
14400 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
14410 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
14420 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
14430 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
14440 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
14450 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14460 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
14470 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
14480 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
14490 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
144a0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
144b0 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
144c0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
144d0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
144e0 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
144f0 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
14500 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
14510 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
14520 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
14530 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
14540 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67  () or sqlite3pag
14550 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  er_rollback() to
14560 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e  .** reset..*/.in
14570 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  t sqlite3pager_w
14580 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61  rite(void *pData
14590 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
145a0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
145b0 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
145c0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
145d0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
145e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
145f0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
14600 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
14610 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29  Pager->errMask )
14620 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  { .    return pa
14630 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
14640 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
14650 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
14660 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14670 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
14680 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
14690 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
146a0 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
146b0 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
146c0 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
146d0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
146e0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
146f0 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
14700 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
14710 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50   away..  */.  pP
14720 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
14730 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
14740 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74  al && (pPg->inSt
14750 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  mt || pPager->st
14760 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
14770 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
14780 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 72  Cache = 1;.    r
14790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
147a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
147b0 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
147c0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
147d0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
147e0 65 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74  e.  ** written t
147f0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
14800 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
14810 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
14820 6e 61 6c 0a 20 20 2a 2a 20 6f 72 20 62 6f 74 68  nal.  ** or both
14830 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 72 73  ..  **.  ** Firs
14840 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
14850 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
14860 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
14870 74 73 20 61 6e 64 0a 20 20 2a 2a 20 63 72 65 61  ts and.  ** crea
14880 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
14890 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
148a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
148b0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
148c0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
148d0 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  e3pager_begin(pD
148e0 61 74 61 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ata);.  if( rc!=
148f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14900 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14910 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14920 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
14930 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28  ESERVED );.  if(
14940 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
14950 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
14960 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >useJournal ){. 
14970 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
14980 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
14990 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
149a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
149b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
149c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
149d0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
149e0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
149f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
14a00 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
14a10 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
14a20 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
14a30 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
14a40 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
14a50 61 6e 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  an.  ** EXCLUSIV
14a60 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
14a70 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
14a80 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
14a90 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 2a  rent page to.  *
14aa0 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
14ab0 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
14ac0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
14ad0 65 61 64 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eady..  */.  if(
14ae0 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
14af0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65   && (pPager->use
14b00 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
14b10 72 2d 3e 6d 65 6d 44 62 29 20 29 7b 0a 20 20 20  r->memDb) ){.   
14b20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
14b30 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
14b40 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
14b50 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20     int szPg;.   
14b60 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20     u32 saved;.  
14b70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14b80 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20  memDb ){.       
14b90 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
14ba0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
14bb0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
14bc0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
14bd0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
14be0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
14bf0 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  d.h, pPg->pgno);
14c00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14c10 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30   pHist->pOrig==0
14c20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   );.        pHis
14c30 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
14c40 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
14c50 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
14c60 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
14c70 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
14c80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
14c90 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
14ca0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
14cb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
14cc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14ce0 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
14cf0 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
14d00 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
14d10 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
14d20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
14d30 73 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d  sum(pPager, pPg-
14d40 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20  >pgno, pData);. 
14d50 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
14d60 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
14d70 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
14d80 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  );.        store
14d90 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50  32bits(cksum, pP
14da0 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
14db0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  ize);.        sz
14dc0 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg = pPager->pag
14dd0 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20  eSize+8;.       
14de0 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67   store32bits(pPg
14df0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29  ->pgno, pPg, -4)
14e00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
14e10 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
14e20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63  Pager->jfd, &((c
14e30 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c  har*)pData)[-4],
14e40 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20   szPg);.        
14e50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14e60 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
14e70 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f 55 52      TRACE4("JOUR
14e80 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
14e90 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14eb0 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67  Pager->fd.h, pPg
14ec0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
14ed0 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
14ee0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
14ef0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
14f00 30 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 75 33  0);.        *(u3
14f10 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  2*)PGHDR_TO_EXTR
14f20 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 20 3d  A(pPg, pPager) =
14f30 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20   saved;.        
14f40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14f50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
14f60 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
14f70 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
14f80 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
14f90 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
14fa0 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  _ERR_FULL;.     
14fb0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14fd0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
14fe0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14ff0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
15000 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
15010 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
15020 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
15030 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
15040 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
15050 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
15060 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
15070 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
15080 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
15090 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
150a0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
150b0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
150c0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
150d0 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
150e0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
150f0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
15100 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
15110 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
15120 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
15130 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
15140 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
15150 63 3b 0a 20 20 20 20 20 20 54 52 41 43 45 34 28  c;.      TRACE4(
15160 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
15170 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
15180 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15190 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70   pPager->fd.h, p
151a0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
151b0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
151c0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
151d0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  dSync ){.      p
151e0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
151f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
15200 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
15210 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
15220 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
15230 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
15240 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
15250 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68  t in it,.  ** th
15260 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
15270 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
15280 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
15290 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
152a0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
152b0 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
152c0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
152d0 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
152e0 61 6c 20 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 69  al format.  ** i
152f0 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
15300 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
15310 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
15320 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
15330 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70  >stmtInUse && !p
15340 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69  Pg->inStmt && (i
15350 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
15360 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
15370 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
15380 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
15390 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
153a0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
153b0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
153c0 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
153d0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
153e0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
153f0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
15400 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15410 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30   pHist->pStmt==0
15420 20 29 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   );.      pHist-
15430 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  >pStmt = sqliteM
15440 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
15450 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
15460 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
15470 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
15480 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
15490 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
154a0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
154b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
154c0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33    }.      TRACE3
154d0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
154e0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  d page %d\n", pP
154f0 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d  ager->fd.h, pPg-
15500 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  >pgno);.    }els
15510 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 33 32  e{.      store32
15520 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20  bits(pPg->pgno, 
15530 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20  pPg, -4);.      
15540 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
15550 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
15560 37 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  7);.      rc = s
15570 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
15580 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 28 28 63  Pager->stfd, ((c
15590 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20 70  har*)pData)-4, p
155a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
155b0 34 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  4);.      TRACE3
155c0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
155d0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  d page %d\n", pP
155e0 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d  ager->fd.h, pPg-
155f0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f  >pgno);.      CO
15600 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
15610 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29  a, pPg->pgno, 0)
15620 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15640 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
15650 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
15660 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
15670 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
15680 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20  AGER_ERR_FULL;. 
15690 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
156a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
156b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
156c0 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
156d0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
156e0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  t!=0 );.      pP
156f0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
15700 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
15710 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
15720 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f 61      }.    page_a
15730 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
15740 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
15750 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
15760 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
15770 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
15780 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
15790 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
157a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
157b0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
157c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
157d0 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
157e0 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
157f0 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
15800 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
15810 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
15820 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
15830 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15840 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
15850 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
15860 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
15870 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
15880 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
15890 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
158a0 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
158b0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
158c0 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
158d0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
158e0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
158f0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
15900 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
15910 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  le(void *pData){
15920 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
15930 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
15940 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
15950 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  Pg->dirty;.}../*
15960 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
15970 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
15980 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
15990 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
159a0 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
159b0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
159c0 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72  qlite3pager_over
159d0 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
159e0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
159f0 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
15a00 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69  void *pPage;.  i
15a10 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  nt rc;..  rc = s
15a20 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
15a30 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
15a40 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
15a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
15a70 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
15a80 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
15a90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15aa0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70   memcpy(pPage, p
15ab0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
15ac0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
15ad0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
15ae0 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
15af0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15b00 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
15b10 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
15b20 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
15b30 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
15b40 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
15b50 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
15b60 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
15b70 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
15b80 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
15b90 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
15ba0 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
15bb0 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
15bc0 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
15bd0 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
15be0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
15bf0 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
15c00 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
15c10 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
15c20 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
15c30 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
15c40 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
15c50 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
15c60 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
15c70 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
15c80 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
15c90 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
15ca0 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
15cb0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
15cc0 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  t_rollback() bel
15cd0 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
15ce0 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
15cf0 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
15d00 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
15d10 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
15d20 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
15d30 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
15d40 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
15d50 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
15d60 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
15d70 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
15d80 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
15d90 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ls to sqlite3pag
15da0 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
15db0 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
15dc0 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
15dd0 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
15de0 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
15df0 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
15e00 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
15e10 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
15e20 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
15e30 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
15e40 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
15e50 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
15e60 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
15e70 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
15e80 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
15e90 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
15ea0 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
15eb0 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
15ec0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
15ed0 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
15ee0 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
15ef0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
15f00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
15f10 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
15f20 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f  ed,.** the dont_
15f30 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  rollback() routi
15f40 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
15f50 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ut because the p
15f60 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  age contains.** 
15f70 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
15f80 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
15f90 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20  be sure it gets 
15fa0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
15fb0 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64  pite.** of the d
15fc0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63  ont_rollback() c
15fd0 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
15fe0 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77  ite3pager_dont_w
15ff0 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
16000 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
16010 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
16020 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
16030 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  Db ) return;..  
16040 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
16050 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
16060 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
16070 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
16080 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64  f( pPg && pPg->d
16090 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20  irty ){.    if( 
160a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
160b0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
160c0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
160d0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
160e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
160f0 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
16100 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
16110 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
16120 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
16130 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
16140 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
16150 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
16160 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
16170 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
16180 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
16190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
161a0 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
161b0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
161c0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
161d0 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
161e0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
161f0 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
16200 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
16210 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
16220 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
16230 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
16240 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
16250 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
16260 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
16270 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
16280 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
16290 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
162a0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
162b0 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
162c0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
162d0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
162e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
162f0 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57    TRACE3("DONT_W
16300 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
16310 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 70 50 61  %d\n", pgno, pPa
16320 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20  ger->fd.h);.    
16330 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
16340 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
16350 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
16360 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
16370 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
16380 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
16390 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
163a0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
163b0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
163c0 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
163d0 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
163e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
163f0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
16400 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
16410 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
16420 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
16430 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rnal..*/.void sq
16440 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
16450 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  rollback(void *p
16460 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
16470 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
16480 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
16490 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
164a0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66  g->pPager;..  if
164b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
164c0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
164d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
164e0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74  nalOpen==0 ) ret
164f0 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
16500 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
16510 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
16520 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
16530 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74 75  er->memDb ) retu
16540 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
16550 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
16560 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
16570 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
16580 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
16590 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
165a0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
165b0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
165c0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
165d0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
165e0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
165f0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
16600 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
16610 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
16620 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
16630 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
16640 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
16650 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
16660 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
16670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
16680 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
16690 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
166a0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  n", pPg->pgno, p
166b0 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
166c0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
166d0 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
166e0 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
166f0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
16700 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
16710 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
16720 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
16730 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
16740 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
16750 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16760 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
16770 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
16780 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
16790 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
167a0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
167b0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
167c0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a  _list(pPg);.  }.
167d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
167e0 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63  a PgHistory bloc
167f0 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  k.*/.static void
16800 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67   clearHistory(Pg
16810 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b  History *pHist){
16820 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
16830 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73  ist->pOrig);.  s
16840 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
16850 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
16860 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
16870 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
16880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
16890 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
168a0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
168b0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
168c0 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
168d0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
168e0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
168f0 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
16900 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
16910 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
16920 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
16930 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
16940 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
16950 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
16960 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
16970 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ager_commit(Page
16980 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
16990 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
169a0 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
169b0 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45  r->errMask==PAGE
169c0 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
169d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
169e0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
169f0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
16a00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16a10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16a20 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
16a30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16a40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
16a50 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
16a60 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
16a70 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
16a80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
16a90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
16aa0 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
16ab0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
16ac0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16ad0 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d  }.  TRACE2("COMM
16ae0 49 54 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  IT %d\n", pPager
16af0 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66 28 20 70  ->fd.h);.  if( p
16b00 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
16b10 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
16b20 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
16b30 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
16b40 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
16b50 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
16b60 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
16b70 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
16b80 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
16b90 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
16ba0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
16bb0 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
16bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
16bd0 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
16be0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
16bf0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
16c00 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
16c10 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
16c20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
16c30 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
16c40 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
16c50 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
16c60 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
16c70 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
16c80 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
16c90 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
16ca0 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
16cb0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
16cc0 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
16cd0 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
16ce0 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
16cf0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
16d00 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
16d10 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
16d20 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
16d30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16d40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
16d50 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
16d60 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  che==0 ){.    /*
16d70 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74   Exit early (wit
16d80 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74  hout doing the t
16d90 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71  ime-consuming sq
16da0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61  lite3OsSync() ca
16db0 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74  lls).    ** if t
16dc0 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
16dd0 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  o changes to the
16de0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16df0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
16e00 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d  Pager->needSync=
16e10 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
16e20 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
16e30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
16e40 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
16e50 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
16e60 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16e70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16e80 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
16e90 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
16ea0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66  pPager, 0);.  if
16eb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16ec0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  ){.    goto comm
16ed0 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  it_abort;.  }.  
16ee0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
16ef0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
16f00 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
16f10 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
16f20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  rc;..  /* Jump h
16f30 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ere if anything 
16f40 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e  goes wrong durin
16f50 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
16f60 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69  cess..  */.commi
16f70 74 5f 61 62 6f 72 74 3a 0a 20 20 72 63 20 3d 20  t_abort:.  rc = 
16f80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
16f90 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
16fa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16fb0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
16fc0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
16fd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16fe0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
16ff0 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65  ll changes.  The
17000 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
17010 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
17020 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c  ARED mode..** Al
17030 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  l in-memory cach
17040 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74  e pages revert t
17050 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  o their original
17060 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a   data contents..
17070 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** The journal i
17080 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
17090 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
170a0 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73  nnot fail unless
170b0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
170c0 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
170d0 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72  wing.** the corr
170e0 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  ect locking prot
170f0 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f  ocol (SQLITE_PRO
17100 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73  TOCOL) or unless
17110 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
17120 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
17130 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
17140 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
17150 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
17160 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
17170 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
17180 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
17190 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
171a0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
171b0 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
171c0 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
171d0 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
171e0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
171f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
17200 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
17210 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  rollback(Pager *
17220 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
17230 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c  c;.  TRACE2("ROL
17240 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61  LBACK %d\n", pPa
17250 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 69 66  ger->fd.h);.  if
17260 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
17270 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
17280 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
17290 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
172a0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
172b0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
172c0 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
172d0 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
172e0 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
172f0 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
17300 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
17310 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
17320 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
17330 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
17340 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17350 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
17360 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
17370 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
17380 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
17390 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
173a0 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
173b0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
173c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
173d0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
173e0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
173f0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
17400 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
17410 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17420 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  e);.        TRAC
17430 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
17440 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
17450 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e  ->pgno, pPager->
17460 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c  fd.h);.      }el
17470 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43  se{.        TRAC
17480 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63  E3("PAGE %d is c
17490 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70  lean on %d\n", p
174a0 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e  ->pgno, pPager->
174b0 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  fd.h);.      }. 
174c0 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
174d0 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
174e0 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
174f0 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
17500 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
17510 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
17520 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20   p->pPrevStmt = 
17530 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  p->pNextStmt = 0
17540 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
17550 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
17560 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
17570 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44  ->xReiniter(PGHD
17580 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50  R_TO_DATA(p), pP
17590 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
175a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
175b0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
175c0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
175d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
175e0 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
175f0 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Size;.    memory
17600 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
17610 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
17620 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
17630 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
17640 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
17650 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17660 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
17670 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
17680 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  che || !pPager->
17690 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
176a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
176b0 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
176c0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
176d0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
176e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
176f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17700 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67  rMask!=0 && pPag
17710 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47  er->errMask!=PAG
17720 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
17730 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
17740 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
17750 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
17760 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
17770 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
17780 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
17790 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
177a0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
177b0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
177c0 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e  SERVED ){.    in
177d0 74 20 72 63 32 2c 20 72 63 33 3b 0a 20 20 20 20  t rc2, rc3;.    
177e0 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61  rc = pager_reloa
177f0 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
17800 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
17810 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
17820 2c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  , pPager->origDb
17830 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 33 20 3d  Size);.    rc3 =
17840 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
17850 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
17860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17870 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
17880 72 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc2;.      if( r
17890 63 33 20 29 20 72 63 20 3d 20 72 63 33 3b 0a 20  c3 ) rc = rc3;. 
178a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
178b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
178c0 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
178d0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
178e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
178f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
17900 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  T;.    pPager->e
17910 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
17920 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ERR_CORRUPT;.  }
17930 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
17940 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
17950 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
17960 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
17970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
17980 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
17990 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
179a0 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
179b0 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
179c0 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
179d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
179e0 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
179f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
17a00 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
17a10 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
17a20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
17a30 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
17a40 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
17a50 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
17a60 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
17a70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17a80 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 39    static int a[9
17a90 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
17aa0 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
17ab0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
17ac0 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
17ad0 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
17ae0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
17af0 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
17b00 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
17b10 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
17b20 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Mask;.  a[6] = p
17b30 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
17b40 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
17b50 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50  iss;.  a[8] = pP
17b60 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72  ager->nOvfl;.  r
17b70 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn a;.}../*.*
17b80 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
17b90 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
17ba0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
17bb0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
17bc0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
17bd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
17be0 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
17bf0 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
17c00 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
17c10 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
17c20 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
17c30 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
17c40 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
17c50 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
17c60 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
17c70 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
17c80 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
17c90 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  begin(Pager *pPa
17ca0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
17cb0 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
17cc0 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
17cd0 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  E];.  assert( !p
17ce0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
17cf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17d00 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
17d10 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d  );.  TRACE2("STM
17d20 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 70  T-BEGIN %d\n", p
17d30 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
17d40 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  if( pPager->memD
17d50 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
17d60 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
17d70 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
17d80 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
17d90 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
17da0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17db0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
17dc0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
17dd0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
17de0 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
17df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17e00 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
17e10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17e20 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
17e30 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
17e40 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
17e50 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
17e60 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
17e70 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
17e80 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28    sqlite3OsLock(
17e90 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  &pPager->fd, SHA
17ea0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72  RED_LOCK);.    r
17eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
17ec0 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  EM;.  }.#ifndef 
17ed0 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71  NDEBUG.  rc = sq
17ee0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
17ef0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  &pPager->jfd, &p
17f00 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
17f10 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
17f20 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
17f30 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  iled;.  assert( 
17f40 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
17f50 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e == pPager->jou
17f60 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69  rnalOff );.#endi
17f70 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f.  pPager->stmt
17f80 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  JSize = pPager->
17f90 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
17fa0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
17fb0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
17fc0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  .  pPager->stmtH
17fd0 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  drOff = 0;.  pPa
17fe0 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d  ger->stmtCksum =
17ff0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
18000 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  it;.  if( !pPage
18010 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
18020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
18030 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
18040 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  emp, &pPager->st
18050 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
18060 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
18070 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
18080 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
18090 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
180a0 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
180b0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
180c0 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
180d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
180e0 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
180f0 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
18100 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
18110 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
18120 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
18130 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
18140 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
18150 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18160 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
18170 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
18180 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
18190 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
181a0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
181b0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
181c0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
181d0 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43  *pNext;.    TRAC
181e0 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
181f0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
18200 64 2e 68 29 3b 0a 20 20 20 20 69 66 28 20 21 70  d.h);.    if( !p
18210 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
18220 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
18230 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66  eek(&pPager->stf
18240 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  d, 0);.      /* 
18250 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
18260 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  e(&pPager->stfd,
18270 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
18280 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
18290 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
182a0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
182b0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
182c0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
182d0 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
182e0 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
182f0 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
18300 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73  xtStmt;.      as
18310 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d  sert( pPg->inStm
18320 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
18330 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
18340 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
18350 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
18360 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
18370 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
18380 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
18390 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
183a0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
183b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
183c0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
183d0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
183e0 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
183f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
18400 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
18410 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20  tmtNRec = 0;.   
18420 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
18430 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
18440 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
18450 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
18460 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
18470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18480 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
18490 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
184a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
184b0 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62  pager_stmt_rollb
184c0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
184d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
184e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
184f0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41  InUse ){.    TRA
18500 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
18510 43 4b 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  CK %d\n", pPager
18520 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 69 66 28  ->fd.h);.    if(
18530 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29   pPager->memDb )
18540 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
18550 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  Pg;.      for(pP
18560 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
18570 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
18580 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
18590 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
185a0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
185b0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
185c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
185d0 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
185e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
185f0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
18600 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
18610 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18620 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
18630 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
18640 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
18650 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
18660 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
18670 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
18680 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
18690 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
186a0 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63       memoryTrunc
186b0 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
186c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
186d0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
186e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73      rc = pager_s
186f0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  tmt_playback(pPa
18700 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
18710 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
18720 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
18730 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
18740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18750 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
18760 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
18770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18780 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18790 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
187a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
187b0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
187c0 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
187d0 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  filename(Pager *
187e0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
187f0 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
18800 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
18810 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
18820 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
18830 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
18840 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
18850 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67  ager_dirname(Pag
18860 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
18870 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44  eturn pPager->zD
18880 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a  irectory;.}../*.
18890 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
188a0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
188b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
188c0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
188d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75  sqlite3pager_jou
188e0 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
188f0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
18900 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
18910 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  al;.}../*.** Set
18920 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
18930 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
18940 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
18950 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65  et_codec(.  Page
18960 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
18970 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64  d (*xCodec)(void
18980 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
18990 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
189a0 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72  cArg.){.  pPager
189b0 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
189c0 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  c;.  pPager->pCo
189d0 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41  decArg = pCodecA
189e0 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rg;.}../*.** Thi
189f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
18a00 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
18a10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18a20 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
18a30 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
18a40 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
18a50 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
18a60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
18a70 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
18a80 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
18a90 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b  {.  void *pPage;
18aa0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72  .  PgHdr *pPgHdr
18ab0 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  ;.  u32 change_c
18ac0 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63  ounter;.  int rc
18ad0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  ;..  /* Open pag
18ae0 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
18af0 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
18b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
18b10 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
18b20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66  1, &pPage);.  if
18b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18b40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
18b50 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
18b60 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
18b70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18b80 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
18b90 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63  .  /* Read the c
18ba0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20  urrent value at 
18bb0 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50  byte 24. */.  pP
18bc0 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50  gHdr = DATA_TO_P
18bd0 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63  GHDR(pPage);.  c
18be0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
18bf0 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70  retrieve32bits(p
18c00 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f  PgHdr, 24);..  /
18c10 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
18c20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
18c30 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
18c40 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
18c50 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
18c60 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69  r++;.  store32bi
18c70 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  ts(change_counte
18c80 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  r, pPgHdr, 24);.
18c90 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68  .  /* Release th
18ca0 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
18cb0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61  . */.  sqlite3pa
18cc0 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
18cd0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18ce0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
18cf0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
18d00 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
18d10 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
18d20 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
18d30 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
18d40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18d50 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
18d60 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
18d70 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
18d80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
18d90 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
18da0 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
18db0 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
18dc0 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
18dd0 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
18de0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
18df0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18e00 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
18e10 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
18e20 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72   synced, all dir
18e30 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ty pages written
18e40 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
18e50 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
18e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
18e70 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  ynced. The only 
18e80 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65  thing that.** re
18e90 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
18ea0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18eb0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
18ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
18ed0 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  r.** master jour
18ee0 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
18ef0 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
18f00 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
18f10 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
18f20 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
18f30 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
18f40 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
18f50 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  an sqlite3pager_
18f60 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  sync() call..*/.
18f70 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
18f80 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  _sync(Pager *pPa
18f90 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
18fa0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
18fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18fc0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
18fd0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
18fe0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
18ff0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
19000 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
19010 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
19020 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
19030 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
19040 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
19050 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
19060 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 70 50  ER_SYNCED && !pP
19070 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
19080 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
19090 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
190a0 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
190b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
190c0 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Open );..    /* 
190d0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
190e0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
190f0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
19100 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
19110 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
19120 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
19130 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
19140 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
19150 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
19160 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
19170 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
19180 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
19190 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
191a0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
191b0 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
191c0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
191d0 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
191e0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
191f0 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
19200 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
19210 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
19220 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19230 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
19240 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
19250 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
19260 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
19270 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
19280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19290 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
192a0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
192b0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
192c0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
192d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
192e0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
192f0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63  c_exit;.      rc
19300 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
19310 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
19320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19330 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
19340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19350 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
19360 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
19370 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
19380 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
19390 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
193a0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
193b0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
193c0 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
193d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
193e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
193f0 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
19400 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
19410 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
19420 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
19430 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
19440 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
19450 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
19460 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  }..    pPager->s
19470 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
19480 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  CED;.  }..sync_e
19490 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  xit:.  return rc
194a0 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
194b0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
194c0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
194d0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
194e0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
194f0 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c  state of the fil
19500 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67  e lock for the g
19510 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54  iven pager..** T
19520 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
19530 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43  is one of NO_LOC
19540 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
19550 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a  RESERVED_LOCK,.*
19560 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20  * PENDING_LOCK, 
19570 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  or EXCLUSIVE_LOC
19580 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
19590 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65  3pager_lockstate
195a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
195b0 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53 54 0a  .#ifdef OS_TEST.
195c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
195d0 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65  >fd->fd.locktype
195e0 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
195f0 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b   pPager->fd.lock
19600 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23  type;.#endif.}.#
19610 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
19620 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
19630 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
19640 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
19650 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
19660 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
19670 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
19680 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20  r_refdump(Pager 
19690 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
196a0 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50  r *pPg;.  for(pP
196b0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
196c0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
196d0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
196e0 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20   pPg->nRef<=0 ) 
196f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 72  continue;.    pr
19700 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
19710 64 64 72 3d 30 78 25 30 38 78 20 6e 52 65 66 3d  ddr=0x%08x nRef=
19720 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70  %d\n", .       p
19730 50 67 2d 3e 70 67 6e 6f 2c 20 28 69 6e 74 29 50  Pg->pgno, (int)P
19740 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
19750 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20  ), pPg->nRef);. 
19760 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a               }.}.#endif.