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

Artifact 6ecf24602f56ac98914685d449f6653903f36fec:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 31 36  : pager.c,v 1.16
0350: 30 20 32 30 30 34 2f 30 38 2f 32 31 20 31 39 3a  0 2004/08/21 19:
0360: 32 30 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a  20:42 drh Exp $.
0370: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e  */.#include "os.
0380: 68 22 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75  h"         /* Mu
0390: 73 74 20 62 65 20 66 69 72 73 74 20 74 6f 20 65  st be first to e
03a0: 6e 61 62 6c 65 20 6c 61 72 67 65 20 66 69 6c 65  nable large file
03b0: 20 73 75 70 70 6f 72 74 20 2a 2f 0a 23 69 6e 63   support */.#inc
03c0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
03d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67  h".#include "pag
03e0: 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  er.h".#include <
03f0: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
0400: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f  de <string.h>../
0410: 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20  *.** Macros for 
0420: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e  troubleshooting.
0430: 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65    Normally turne
0440: 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23  d off.*/.#if 0.#
0450: 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29  define TRACE1(X)
0460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
0470: 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65  bugPrintf(X).#de
0480: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0490: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
04a0: 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65  gPrintf(X,Y).#de
04b0: 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c  fine TRACE3(X,Y,
04c0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04d0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04e0: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
04f0: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0500: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0510: 57 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  W).#else.#define
0520: 20 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69   TRACE1(X).#defi
0530: 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 0a 23  ne TRACE2(X,Y).#
0540: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
0550: 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Y,Z).#define TRA
0560: 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 65 6e  CE4(X,Y,Z,W).#en
0570: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  dif.../*.** The 
0580: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0590: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
05a0: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
05b0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
05c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
05d0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
05e0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
05f0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
0600: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0620: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0630: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0640: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0660: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0670: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0680: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0690: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
06a0: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
06b0: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
06c0: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
06d0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
06e0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
06f0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
0700: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
0710: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
0720: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0730: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0750: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0760: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0770: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
07a0: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
07b0: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
07c0: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
07d0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
07e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
07f0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
0820: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0830: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0840: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0860: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0870: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0880: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0890: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08a0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
08b0: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
08c0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
08d0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0900: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0910: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0940: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0950: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0960: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0970: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0980: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
09b0: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
09c0: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
09f0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0a00: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0a10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a20: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0a30: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0a40: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0a50: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0a60: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0a70: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0a80: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0ab0: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0ac0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ad0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0af0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0b00: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0b10: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0b40: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0b50: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74  o is to remove t
0b60: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
0b80: 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65  nal file and the
0b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
0ba0: 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  l be.**         
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
0bc0: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0bd0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0be0: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0bf0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0c00: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0c10: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
0c20: 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74  occurs, the stat
0c30: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0c40: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a   PAGER_SHARED..*
0c50: 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65  * After all page
0c60: 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65  s have been rele
0c70: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
0c80: 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a  e_page_unref(),.
0c90: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61  ** the state tra
0ca0: 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f  nsitions back to
0cb0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0cc0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a  The first time.*
0cd0: 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 70 61  * that sqlite3pa
0ce0: 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63  ger_write() is c
0cf0: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0d00: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0d10: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0d20: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0d30: 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65  qlite_page_write
0d40: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0d50: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0d60: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0d70: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0d80: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0d90: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0da0: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0db0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0dc0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0dd0: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0de0: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0df0: 53 49 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e  SIVE occurs when
0e00: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
0e10: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
0e20: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0e30: 66 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20  file.  After an 
0e40: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
0e50: 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71  lback().** or sq
0e60: 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69  lite_pager_commi
0e70: 74 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 67  t(), the state g
0e80: 6f 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  oes back to PAGE
0e90: 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65  R_SHARED..*/.#de
0ea0: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
0eb0: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
0ec0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
0ed0: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
0ee0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
0ef0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
0f00: 58 43 4c 55 53 49 56 45 20 20 20 33 0a 23 64 65  XCLUSIVE   3.#de
0f10: 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45  fine PAGER_SYNCE
0f20: 44 20 20 20 20 20 20 34 0a 0a 0a 2f 2a 0a 2a 2a  D      4.../*.**
0f30: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
0f40: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
0f50: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
0f60: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
0f70: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
0f80: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
0f90: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
0fa0: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
0fb0: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
0fc0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
0fd0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
0fe0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
0ff0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1000: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1010: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70 61 67   call sqlite3pag
1020: 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20 61 20  er_write() on a 
1030: 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61  page prior to ma
1040: 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69  king.** any modi
1050: 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61  fications to tha
1060: 74 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72  t page.  The fir
1070: 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 70  st time sqlite3p
1080: 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20  ager_write().** 
1090: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f  is called, the o
10a0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
10b0: 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65  tents are writte
10c0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
10d0: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  ack.** journal a
10e0: 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e  nd PgHdr.inJourn
10f0: 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65  al and PgHdr.nee
1100: 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20  dSync are set.  
1110: 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74  Later, once.** t
1120: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  he journal page 
1130: 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f  has made it onto
1140: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
1150: 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  e, PgHdr.needSyn
1160: 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e  c.** is cleared.
1170: 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70    The modified p
1180: 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72  age cannot be wr
1190: 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
11a0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
11c0: 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  til the journal 
11d0: 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73  pages has been s
11e0: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e  ynced to disk an
11f0: 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e  d the.** PgHdr.n
1200: 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e  eedSync has been
1210: 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
1220: 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20  The PgHdr.dirty 
1230: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
1240: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1250: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1260: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1270: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1280: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1290: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
12a0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
12b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
12c0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
12d0: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
12e0: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
12f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1310: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
1320: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
1330: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
1340: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
1350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1360: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1370: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1380: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1390: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
13a0: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
13b0: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
13c0: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
13d0: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
13e0: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
13f0: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1400: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1410: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1420: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1430: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1440: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
1450: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
1460: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
1470: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
1480: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1490: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
14a0: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
14b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
14c0: 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77  UE if has been w
14d0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
14e0: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
14f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1500: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1510: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
1520: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
1530: 20 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20    u8 dirty;     
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e   /* TRUE if we n
1560: 65 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63  eed to write bac
1570: 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  k changes */.  u
1580: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a0: 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65   Sync journal be
15b0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69  fore writing thi
15c0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61  s page */.  u8 a
15d0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
15f0: 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  sable dont_rollb
1600: 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70  ack() for this p
1610: 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  age */.  short i
1620: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1630: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1640: 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68  r of users of th
1650: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
1660: 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20  dr *pDirty;     
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1680: 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74 65  irty pages sorte
1690: 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f 20  d by PgHdr.pgno 
16a0: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
16b0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
16c0: 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c  f page data foll
16d0: 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20 2a  ow this header *
16e0: 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78  /.  /* Pager.nEx
16f0: 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63  tra bytes of loc
1700: 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  al data follow t
1710: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
1720: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e  };../*.** For an
1730: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20   in-memory only 
1740: 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65  database, some e
1750: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
1760: 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f   is recorded abo
1770: 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20  ut.** each page 
1780: 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73 20  so that changes 
1790: 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
17a0: 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69  ck.  (Journal fi
17b0: 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75  les are not.** u
17c0: 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  sed for in-memor
17d0: 79 20 64 61 74 61 62 61 73 65 73 2e 29 20 20 54  y databases.)  T
17e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66  he following inf
17f0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65  ormation is adde
1800: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20  d to.** the end 
1810: 6f 66 20 65 76 65 72 79 20 45 58 54 52 41 20 62  of every EXTRA b
1820: 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  lock for in-memo
1830: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
1840: 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  .** This informa
1850: 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20  tion could have 
1860: 62 65 65 6e 20 61 64 64 65 64 20 64 69 72 65 63  been added direc
1870: 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64 72  tly to the PgHdr
1880: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42   structure..** B
1890: 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64  ut then it would
18a0: 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72   take up an extr
18b0: 61 20 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f  a 8 bytes of sto
18c0: 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67  rage on every Pg
18d0: 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20  Hdr.** even for 
18e0: 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62  disk-based datab
18f0: 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67  ases.  Splitting
1900: 20 69 74 20 6f 75 74 20 73 61 76 65 73 20 38 20   it out saves 8 
1910: 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20  bytes.  This.** 
1920: 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67  is only a saving
1930: 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68  s of 0.8% but th
1940: 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65 73 20  ose percentages 
1950: 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64  add up..*/.typed
1960: 65 66 20 73 74 72 75 63 74 20 50 67 48 69 73 74  ef struct PgHist
1970: 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73  ory PgHistory;.s
1980: 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20  truct PgHistory 
1990: 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20  {.  u8 *pOrig;  
19a0: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70     /* Original p
19b0: 61 67 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f  age text.  Resto
19c0: 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20  re to this on a 
19d0: 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  full rollback */
19e0: 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20  .  u8 *pStmt;   
19f0: 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20    /* Text as it 
1a00: 77 61 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  was at the begin
1a10: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72  ning of the curr
1a20: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ent statement */
1a30: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63  .};../*.** A mac
1a40: 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f  ro used for invo
1a50: 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69  king the codec i
1a60: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a  f there is one.*
1a70: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a80: 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69  HAS_CODEC.# defi
1a90: 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58  ne CODEC(P,D,N,X
1aa0: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20  ) if( P->xCodec 
1ab0: 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  ){ P->xCodec(P->
1ac0: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
1ad0: 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ; }.#else.# defi
1ae0: 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58  ne CODEC(P,D,N,X
1af0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1b00: 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  Convert a pointe
1b10: 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74  r to a PgHdr int
1b20: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  o a pointer to i
1b30: 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62  ts data.** and b
1b40: 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64  ack again..*/.#d
1b50: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44  efine PGHDR_TO_D
1b60: 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29  ATA(P)  ((void*)
1b70: 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69  (&(P)[1])).#defi
1b80: 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52  ne DATA_TO_PGHDR
1b90: 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29  (D)  (&((PgHdr*)
1ba0: 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e  (D))[-1]).#defin
1bb0: 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  e PGHDR_TO_EXTRA
1bc0: 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28  (G,P) ((void*)&(
1bd0: 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29  (char*)(&(G)[1])
1be0: 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d  )[(P)->pageSize]
1bf0: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
1c00: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
1c10: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
1c20: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
1c30: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
1c40: 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28  PGR)->pageSize+(
1c50: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
1c60: 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f  /*.** How big to
1c70: 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
1c80: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  able used for lo
1c90: 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79  cating in-memory
1ca0: 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67   pages.** by pag
1cb0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 23 64 65  e number..*/.#de
1cc0: 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 32  fine N_PG_HASH 2
1cd0: 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  048../*.** Hash 
1ce0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
1cf0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
1d00: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28  ash(PN)  ((PN)&(
1d10: 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f  N_PG_HASH-1))../
1d20: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
1d30: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
1d40: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1d50: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1d60: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
1d70: 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  r {.  char *zFil
1d80: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1d90: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1da0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1db0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
1dc0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1dd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
1de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
1df0: 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72   char *zDirector
1e00: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
1e10: 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64  Directory hold d
1e20: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
1e30: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f  nal files */.  O
1e40: 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20  sFile fd, jfd;  
1e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1e60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
1e70: 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  or database and 
1e80: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46  journal */.  OsF
1e90: 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20 20 20  ile stfd;       
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1eb0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
1ec0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
1ed0: 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74  bjournal*/.  int
1ee0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
1ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f00: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1f10: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
1f20: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
1f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
1f40: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
1f50: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
1f60: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f80: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
1f90: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
1fa0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
1fb0: 20 20 6f 66 66 5f 74 20 73 74 6d 74 4a 53 69 7a    off_t stmtJSiz
1fc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1fd0: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
1fe0: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
1ff0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2020: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
2030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
2040: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2060: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
2070: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
2080: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
2090: 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20  int stmtNRec;   
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20b0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
20c0: 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72   in stmt subjour
20d0: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  nal */.  int nEx
20e0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
20f0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
2100: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
2110: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2120: 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ge */.  void (*x
2130: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
2140: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
2150: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2160: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
2170: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2180: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
2190: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
21a0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
21b0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
21c0: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
21d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
21f0: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
2200: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2220: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2230: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2240: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2270: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2280: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2290: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
22a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22b0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
22c0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
22d0: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
22e0: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
22f0: 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f  ss, nOvfl;     /
2300: 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69  * Cache hits, mi
2310: 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f  ssing, and LRU o
2320: 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 76 6f  verflows */.  vo
2330: 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
2340: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
2350: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
2360: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
2370: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
2380: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
2390: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
23a0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
23b0: 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  () */.  u8 journ
23c0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
23d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
23e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
23f0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
2400: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2410: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2420: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2430: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2440: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2450: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2470: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2480: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2490: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
24a0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
24b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
24c0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
24d0: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
24e0: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2500: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
2510: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
2520: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
2530: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
2540: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2550: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
2560: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
2570: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
2580: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a0: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
25b0: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
25c0: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
25d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
25e0: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
25f0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
2600: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
2610: 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b  s */.  u8 state;
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
2640: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
2650: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
2660: 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20    u8 errMask;   
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2680: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
2690: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
26a0: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
26b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26c0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
26d0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
26e0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
26f0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
2700: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
2710: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
2720: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
2730: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2740: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2750: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
2760: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
2770: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2780: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
2790: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
27a0: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
27b0: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
27c0: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
27d0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
27e0: 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  sable dont_rollb
27f0: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
2800: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
2810: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2830: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
2840: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61 49   I/O */.  u8 *aI
2850: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
2860: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2870: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2880: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2890: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
28a0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
28b0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
28c0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
28d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
28e0: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2900: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
2910: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
2920: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
2930: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
2940: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
2950: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2960: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
2970: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
2980: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
2990: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
29a0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
29b0: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
29c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
29d0: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
29e0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
29f0: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
2a00: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2a10: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
2a20: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
2a30: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
2a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2a50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2a60: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
2a70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
2a80: 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53   *aHash[N_PG_HAS
2a90: 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74  H];    /* Hash t
2aa0: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
2ab0: 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72   number to PgHdr
2ac0: 20 2a 2f 0a 20 20 6f 66 66 5f 74 20 6a 6f 75 72   */.  off_t jour
2ad0: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
2ae0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
2af0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
2b00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
2b10: 20 20 6f 66 66 5f 74 20 6a 6f 75 72 6e 61 6c 48    off_t journalH
2b20: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
2b30: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
2b40: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
2b50: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 6f 66 66   header */.  off
2b60: 5f 74 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20  _t stmtHdrOff;  
2b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2b80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
2b90: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
2ba0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 6f 66 66  atement */.  off
2bb0: 5f 74 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20  _t stmtCksum;   
2bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
2bd0: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
2be0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
2bf0: 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72   */.  int sector
2c00: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2c10: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
2c20: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
2c30: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 7d 3b 0a 0a  rollback */.};..
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 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
60f0: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 72 65 74 75  Sync = 1;.  retu
6100: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6110: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
6120: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
6130: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
6140: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
6150: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
6160: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
6170: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
6180: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
6190: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
61a0: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
61b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
61c0: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
61d0: 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65   the sqlite3page
61e0: 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a  r_stmt_commit().
61f0: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
6200: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
6210: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
6220: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
6230: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
6240: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
6250: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
6260: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
6270: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
6280: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
6290: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
62a0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
62b0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
62c0: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
62d0: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
62e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
62f0: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
6300: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  pPg->pNextStmt==
6310: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
6320: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  vStmt = 0;.  if(
6330: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29   pPager->pStmt )
6340: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  {.    pPager->pS
6350: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
6360: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
6370: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
6380: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50  ger->pStmt;.  pP
6390: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
63a0: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  g;.  pPg->inStmt
63b0: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
63c0: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
63d0: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50  from_stmt_list(P
63e0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
63f0: 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  ( !pPg->inStmt )
6400: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
6410: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b  Pg->pPrevStmt ){
6420: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
6430: 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65  ->pPrevStmt->pNe
6440: 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  xtStmt==pPg );. 
6450: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
6460: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  t->pNextStmt = p
6470: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
6480: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6490: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
64a0: 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  >pStmt==pPg );. 
64b0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
64c0: 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pStmt = pPg->pNe
64d0: 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66  xtStmt;.  }.  if
64e0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
64f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6500: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e  pPg->pNextStmt->
6510: 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29  pPrevStmt==pPg )
6520: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
6530: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
6540: 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  = pPg->pPrevStmt
6550: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
6560: 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  xtStmt = 0;.  pP
6570: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
6580: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
6590: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
65a0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
65b0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
65c0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
65d0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
65e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
65f0: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
6600: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
6610: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
6620: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
6630: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
6640: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
6650: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61  pPager->aHash[pa
6660: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b  ger_hash(pgno)];
6670: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
6680: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
6690: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
66a0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
66b0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
66c0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
66d0: 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  se and clear the
66e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
66f0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
6700: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
6710: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
6720: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
6730: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
6740: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
6750: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
6760: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
6770: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
6780: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
6790: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
67a0: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
67b0: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
67c0: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
67d0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
67e0: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
67f0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
6800: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  g, *pNext;.  for
6810: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
6820: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
6830: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
6840: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
6850: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
6860: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
6870: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
6880: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
6890: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
68a0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
68b0: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
68c0: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
68d0: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
68e0: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
68f0: 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  sh));.  pPager->
6900: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  nPage = 0;.  if(
6910: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
6920: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
6930: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
6940: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
6950: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
6960: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
6970: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
6980: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
6990: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
69a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
69b0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
69c0: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61  r->nRef = 0;.  a
69d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
69e0: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
69f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
6a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6a10: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
6a20: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
6a30: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
6a40: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
6a50: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
6a60: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
6a70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
6a80: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
6a90: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
6aa0: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
6ab0: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
6ac0: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
6ad0: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
6ae0: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
6af0: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
6b00: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
6b10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
6b20: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
6b30: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
6b40: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
6b50: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
6b60: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
6b70: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
6b80: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
6b90: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
6ba0: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
6bb0: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
6bc0: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
6bd0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
6be0: 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20  *pPg;.  assert( 
6bf0: 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
6c00: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
6c10: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
6c20: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
6c30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6c40: 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  }.  sqlite3pager
6c50: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _stmt_commit(pPa
6c60: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
6c70: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
6c80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
6c90: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
6ca0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
6cb0: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
6cc0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
6cd0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
6ce0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
6cf0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
6d00: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
6d10: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
6d20: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
6d30: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
6d40: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
6d50: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
6d60: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
6d70: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
6d80: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
6d90: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
6da0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
6db0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
6dc0: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
6dd0: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
6de0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
6df0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
6e00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
6e10: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
6e20: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
6e30: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
6e40: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
6e50: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
6e60: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
6e70: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
6e80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
6e90: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
6ea0: 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
6eb0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
6ec0: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
6ed0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  ;.  pPager->orig
6ee0: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
6ef0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
6f00: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
6f10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6f20: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
6f30: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
6f40: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
6f50: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
6f60: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
6f70: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
6f80: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
6f90: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
6fa0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
6fb0: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
6fc0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
6fd0: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
6fe0: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
6ff0: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
7000: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
7010: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
7020: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
7030: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
7040: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
7050: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
7060: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
7070: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
7080: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
7090: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
70a0: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
70b0: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
70c0: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
70d0: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
70e0: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
70f0: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
7100: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
7110: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
7120: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
7130: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
7140: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
7150: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
7160: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
7170: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
7180: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
7190: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
71a0: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
71b0: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
71c0: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
71d0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
71e0: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
71f0: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
7200: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
7210: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
7220: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
7230: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
7240: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
7250: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
7260: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
7270: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
7280: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
7290: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
72a0: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
72b0: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
72c0: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
72d0: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
72e0: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
72f0: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
7300: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
7310: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
7320: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
7330: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
7340: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
7350: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63  er, Pgno pgno, c
7360: 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61  onst char *aData
7370: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
7380: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
7390: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
73a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
73b0: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
73c0: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
73d0: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
73e0: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
73f0: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
7400: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
7410: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
7420: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7430: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
7440: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
7450: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
7460: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
7470: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
7480: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
7490: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
74a0: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
74b0: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
74c0: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
74d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
74e0: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
74f0: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
7500: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
7510: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
7520: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
7530: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
7540: 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a  one_page(Pager *
7550: 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a  pPager, OsFile *
7560: 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75  jfd, int useCksu
7570: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
7580: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
75a0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
75b0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
75c0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
75f0: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
7600: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
7610: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7630: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
7640: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
7650: 67 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b  g */.  u8 aData[
7660: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
7670: 53 49 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20  SIZE];  /* Temp 
7680: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61  storage for a pa
7690: 67 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 72 65  ge */..  rc = re
76a0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70  ad32bits(jfd, &p
76b0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
76c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
76d0: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
76e0: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
76f0: 20 26 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d   &aData, pPager-
7700: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
7710: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7720: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
7730: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7740: 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
7750: 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a  eSize + 4;..  /*
7760: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
7770: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
7780: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
7790: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
77a0: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
77b0: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
77c0: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
77d0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
77e0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
77f0: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
7800: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
7810: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
7820: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
7830: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
7840: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
7850: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
7860: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
7870: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
7880: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
7890: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
78a0: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
78b0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
78c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
78d0: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
78e0: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
78f0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
7900: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7910: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  _OK;.  }.  if( u
7920: 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72  seCksum ){.    r
7930: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
7940: 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  fd, &cksum);.   
7950: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7960: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
7970: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
7980: 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f  ;.    if( pager_
7990: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67  cksum(pPager, pg
79a0: 6e 6f 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  no, aData)!=cksu
79b0: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
79c0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
79d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
79e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
79f0: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
7a00: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
7a10: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
7a20: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
7a30: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
7a40: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
7a50: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
7a60: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
7a70: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
7a80: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
7a90: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
7aa0: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
7ab0: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
7ac0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
7ad0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
7ae0: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
7af0: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
7b00: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
7b10: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
7b20: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
7b30: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
7b40: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
7b50: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
7b60: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
7b70: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
7b80: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  ot dirty..  */. 
7b90: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
7ba0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
7bb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
7bc0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
7bd0: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
7be0: 50 67 20 29 3b 0a 20 20 54 52 41 43 45 33 28 22  Pg );.  TRACE3("
7bf0: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
7c00: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
7c10: 66 64 2e 68 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  fd.h, pgno);.  i
7c20: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
7c30: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
7c40: 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E ){.    sqlite3
7c50: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
7c60: 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 6f 66  fd, (pgno-1)*(of
7c70: 66 5f 74 29 70 50 61 67 65 72 2d 3e 70 61 67 65  f_t)pPager->page
7c80: 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Size);.    rc = 
7c90: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
7ca0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
7cb0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
7cc0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ize);.  }.  if( 
7cd0: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
7ce0: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
7cf0: 72 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  r be rolled back
7d00: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
7d10: 20 65 78 63 65 70 74 20 66 6f 72 20 70 61 67 65   except for page
7d20: 0a 20 20 20 20 2a 2a 20 31 20 77 68 69 63 68 20  .    ** 1 which 
7d30: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
7d40: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
7d50: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
7d60: 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
7d70: 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  active..    */. 
7d80: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
7d90: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
7da0: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
7db0: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20  >pgno==1 );.    
7dc0: 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
7dd0: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20  _DATA(pPg);.    
7de0: 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44  memcpy(pData, aD
7df0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
7e00: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
7e10: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
7e20: 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58  tor ){  /*** FIX
7e30: 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68 69   ME:  Should thi
7e40: 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a  s be xReinit? **
7e50: 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
7e60: 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61  >xDestructor(pDa
7e70: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
7e80: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
7e90: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
7ea0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
7eb0: 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 50 67  IVE ){.      pPg
7ec0: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
7ed0: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
7ee0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
7ef0: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
7f00: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
7f10: 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  3);.  }.  return
7f20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
7f30: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
7f40: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
7f50: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7f60: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
7f70: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
7f80: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
7f90: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7fa0: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
7fb0: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
7fc0: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
7fd0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
7fe0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
7ff0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
8000: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
8010: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
8020: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   it is..**.** Th
8030: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8040: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
8050: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
8060: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
8070: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
8080: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
8090: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
80a0: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
80b0: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
80c0: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
80d0: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
80e0: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
80f0: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
8100: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
8110: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
8120: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8130: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
8140: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
8150: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f  ger_delmaster(co
8160: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
8170: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
8180: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
8190: 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 6d 61  = 0;.  OsFile ma
81a0: 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 4d  ster;.  char *zM
81b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
81c0: 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
81d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
81e0: 66 69 6c 65 20 2a 2f 0a 20 20 6f 66 66 5f 74 20  file */.  off_t 
81f0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
8200: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
8210: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8220: 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e  le */..  /* Open
8230: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8240: 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69  nal file exclusi
8250: 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d  vely in case som
8260: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
8270: 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20    ** is running 
8280: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  this routine als
8290: 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d  o. Not that it m
82a0: 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69  akes too much di
82b0: 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
82c0: 20 6d 65 6d 73 65 74 28 26 6d 61 73 74 65 72 2c   memset(&master,
82d0: 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61 73 74 65   0, sizeof(maste
82e0: 72 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r));.  rc = sqli
82f0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
8300: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
8310: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
8320: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
8330: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
8340: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
8350: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8360: 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61 73 74  OsFileSize(&mast
8370: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
8380: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
8390: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
83a0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
83b0: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
83c0: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
83d0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
83e0: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
83f0: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  Ptr = 0;..    /*
8400: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
8410: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8420: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
8430: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
8440: 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f    ** sqliteMallo
8450: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
8460: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
8470: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
8480: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
8490: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
84a0: 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  eMalloc(nMasterJ
84b0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
84c0: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
84d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
84e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
84f0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
8500: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
8510: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
8520: 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d 61  ead(&master, zMa
8530: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61  sterJournal, nMa
8540: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
8550: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8560: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
8570: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
8580: 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
8590: 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
85a0: 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
85b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
85c0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
85d0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
85e0: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
85f0: 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20  Journal) ){.    
8600: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
8610: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
8620: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
8630: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
8640: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
8650: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
8660: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
8670: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8680: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
8690: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
86a0: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
86b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
86c0: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
86d0: 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c  */.        OsFil
86e0: 65 20 6a 6f 75 72 6e 61 6c 3b 0a 0a 20 20 20 20  e journal;..    
86f0: 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f 75 72      memset(&jour
8700: 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6a  nal, 0, sizeof(j
8710: 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20 20 20  ournal));.      
8720: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8730: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f  OpenReadOnly(zJo
8740: 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29  urnal, &journal)
8750: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
8760: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8770: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
8780: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
8790: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
87a0: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
87b0: 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c  ournal(&journal,
87c0: 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20   &zMasterPtr);. 
87d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
87e0: 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b  Close(&journal);
87f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
8800: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8810: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
8820: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
8830: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
8840: 66 28 20 7a 4d 61 73 74 65 72 50 74 72 20 26 26  f( zMasterPtr &&
8850: 20 21 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72   !strcmp(zMaster
8860: 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 20 29 7b  Ptr, zMaster) ){
8870: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
8880: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
8890: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
88a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
88b0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
88c0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
88d0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
88e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
88f0: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
8900: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
8910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
8920: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
8930: 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61  zMaster);..delma
8940: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
8950: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
8960: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
8970: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
8980: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
8990: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
89a0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
89b0: 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  &master);.  }.  
89c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
89d0: 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70  .** Make every p
89e0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
89f0: 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74   agree with what
8a00: 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e   is on disk.  In
8a10: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a   other words,.**
8a20: 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b   reread the disk
8a30: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
8a40: 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65  ate of the cache
8a50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8a60: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
8a70: 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  fter a rollback 
8a80: 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66  in which some of
8a90: 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65   the dirty cache
8aa0: 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65  .** pages had ne
8ab0: 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
8ac0: 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57   out to disk.  W
8ad0: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62  e need to roll b
8ae0: 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65  ack the.** cache
8af0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
8b00: 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
8b10: 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65  do that is to re
8b20: 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e  read the old con
8b30: 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f  tent.** back fro
8b40: 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73  m the disk..*/.s
8b50: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
8b60: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67  reload_cache(Pag
8b70: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
8b80: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
8b90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8ba0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
8bb0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
8bc0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
8bd0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
8be0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
8bf0: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20 21  SIZE];.    if( !
8c00: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
8c10: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
8c20: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
8c30: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8c40: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
8c50: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
8c60: 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
8c70: 70 61 67 65 53 69 7a 65 2a 28 6f 66 66 5f 74 29  pageSize*(off_t)
8c80: 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a  (pPg->pgno-1));.
8c90: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8ca0: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
8cb0: 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
8cc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
8cd0: 20 20 20 20 20 54 52 41 43 45 33 28 22 52 45 46       TRACE3("REF
8ce0: 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
8cf0: 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
8d00: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
8d10: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
8d20: 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28  ak;.      CODEC(
8d30: 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50  pPager, zBuf, pP
8d40: 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20  g->pgno, 2);.   
8d50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
8d60: 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50  mset(zBuf, 0, pP
8d70: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8d80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8d90: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d  Pg->nRef==0 || m
8da0: 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44  emcmp(zBuf, PGHD
8db0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
8dc0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8dd0: 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
8de0: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
8df0: 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67  pPg), zBuf, pPag
8e00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
8e10: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
8e20: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
8e30: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
8e40: 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
8e50: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
8e60: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
8e70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8e80: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
8e90: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
8ea0: 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
8eb0: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
8ec0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
8ed0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
8ee0: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
8ef0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
8f00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8f10: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
8f20: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
8f30: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
8f40: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
8f50: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  ** indicated..*/
8f60: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8f70: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
8f80: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
8f90: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  age){.  return s
8fa0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
8fb0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  (&pPager->fd, pP
8fc0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
8fd0: 6f 66 66 5f 74 29 6e 50 61 67 65 29 3b 0a 7d 0a  off_t)nPage);.}.
8fe0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
8ff0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
9000: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
9010: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
9020: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
9030: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
9040: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
9050: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
9060: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
9070: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
9080: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
9090: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
90a0: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
90b0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
90c0: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
90d0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
90e0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
90f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
9100: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
9110: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
9120: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
9130: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
9140: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
9150: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
9160: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
9170: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
9180: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
9190: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
91a0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
91b0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
91c0: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
91d0: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
91e0: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
91f0: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
9200: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
9210: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
9220: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
9230: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
9240: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
9250: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
9260: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
9270: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
9280: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9290: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
92a0: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
92b0: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
92c0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
92d0: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
92e0: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
92f0: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
9300: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
9310: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
9320: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
9330: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
9340: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
9350: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
9360: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
9370: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
9380: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
9390: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
93a0: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
93b0: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
93c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
93d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
93e0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
93f0: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
9400: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
9410: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
9420: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
9430: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
9440: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
9450: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
9460: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
9470: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
9480: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
9490: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
94a0: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
94b0: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
94c0: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
94d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
94e0: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
94f0: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
9500: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
9510: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
9520: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
9530: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
9540: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
9550: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
9560: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
9570: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
9580: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
9590: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
95a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
95b0: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
95c0: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
95d0: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
95e0: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
95f0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
9600: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
9610: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
9620: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
9630: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
9640: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
9650: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
9660: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
9670: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
9680: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
9690: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
96a0: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
96b0: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
96c0: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
96d0: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
96e0: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
96f0: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
9700: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
9710: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
9720: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
9730: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
9740: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
9750: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
9760: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
9770: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
9780: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
9790: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
97a0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
97b0: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
97c0: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
97d0: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
97e0: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
97f0: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
9800: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
9810: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
9820: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
9830: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
9840: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
9850: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
9860: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
9870: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
9880: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
9890: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
98a0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
98b0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
98c0: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
98d0: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
98e0: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
98f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9900: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
9910: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
9920: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
9930: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
9940: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
9950: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
9960: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
9970: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
9980: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
9990: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
99a0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
99b0: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
99c0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
99d0: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
99e0: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
99f0: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
9a00: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
9a10: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
9a20: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
9a30: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
9a40: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
9a50: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
9a60: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
9a70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
9a80: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
9a90: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9aa0: 0a 20 20 6f 66 66 5f 74 20 73 7a 4a 3b 20 20 20  .  off_t szJ;   
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9ac0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
9ad0: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
9ae0: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
9b10: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
9b20: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b40: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
9b50: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
9b60: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
9b70: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
9b80: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
9b90: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
9ba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9bb0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
9bc0: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
9bd0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
9be0: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
9bf0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
9c00: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
9c10: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
9c20: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
9c30: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
9c40: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
9c50: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
9c60: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
9c70: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
9c80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9c90: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
9ca0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9cb0: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
9cc0: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
9cd0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9ce0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
9cf0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
9d00: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
9d10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9d20: 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
9d30: 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
9d40: 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
9d50: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9d60: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
9d70: 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
9d80: 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
9d90: 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
9da0: 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
9db0: 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
9dc0: 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
9dd0: 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
9de0: 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  d back..  */.  r
9df0: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
9e00: 75 72 6e 61 6c 28 26 70 50 61 67 65 72 2d 3e 6a  urnal(&pPager->j
9e10: 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20  fd, &zMaster);. 
9e20: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
9e30: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
9e40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9e50: 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21  || (zMaster && !
9e60: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
9e70: 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b  sts(zMaster)) ){
9e80: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
9e90: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
9ea0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
9eb0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
9ec0: 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
9ed0: 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  _OK;.    goto en
9ee0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
9ef0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
9f00: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  &pPager->jfd, 0)
9f10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
9f20: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
9f30: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
9f40: 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
9f50: 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
9f60: 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
9f70: 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
9f80: 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
9f90: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
9fa0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
9fb0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
9fc0: 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
9fd0: 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
9fe0: 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
9ff0: 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
a000: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
a010: 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
a020: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
a030: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
a040: 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
a050: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
a060: 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
a070: 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
a080: 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
a090: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
a0a0: 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
a0b0: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
a0c0: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
a0d0: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
a0e0: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
a0f0: 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
a100: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
a110: 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
a120: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a130: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
a140: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
a160: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
a170: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a180: 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
a190: 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
a1a0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
a1b0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
a1c0: 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
a1d0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
a1e0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
a1f0: 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
a200: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
a210: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
a220: 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
a230: 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
a240: 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
a250: 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
a260: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
a270: 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
a280: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
a290: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
a2a0: 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
a2b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a2c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
a2d0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
a2e0: 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
a2f0: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
a300: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a310: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
a320: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
a330: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
a340: 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
a350: 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
a360: 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
a370: 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
a380: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
a390: 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61   to it's origina
a3a0: 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
a3b0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
a3c0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
a3d0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a3e0: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
a3f0: 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  t( pPager->origD
a400: 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67  bSize==0 || pPag
a410: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
a420: 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63  mxPg );.      rc
a430: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
a440: 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
a450: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
a460: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a470: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
a480: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
a490: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
a4a0: 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
a4b0: 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20 3d 20 73  }..    /* rc = s
a4c0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
a4d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e  ager->jfd, JOURN
a4e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a4f0: 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  )); */.    if( r
a500: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
a510: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
a520: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ;.  .    /* Copy
a530: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
a540: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
a550: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
a560: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a570: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
a580: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
a590: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
a5a0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
a5b0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
a5c0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31   &pPager->jfd, 1
a5d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
a5e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a5f0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
a600: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
a610: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
a620: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
a630: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a640: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
a650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a660: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a670: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
a680: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
a690: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
a6a0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20    }..  /* Pages 
a6b0: 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77  that have been w
a6c0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
a6d0: 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20  urnal but never 
a6e0: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72  synced.  ** wher
a6f0: 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62  e not restored b
a700: 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65  y the loop above
a710: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65  .  We have to re
a720: 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a  store those.  **
a730: 20 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e   pages by readin
a740: 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d  g them back from
a750: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
a760: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61  tabase..  */.  a
a770: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
a780: 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f  E_OK );.  pager_
a790: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
a7a0: 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62  ger);..end_playb
a7b0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
a7c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a7d0: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
a7e0: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
a7f0: 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65    }.  if( zMaste
a800: 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  r ){.    /* If t
a810: 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
a820: 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
a830: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
a840: 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20  return true,.   
a850: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
a860: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
a870: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
a880: 6f 75 72 6e 61 6c 2e 20 49 66 20 65 72 72 6f 72  ournal. If error
a890: 73 20 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20  s .    ** occur 
a8a0: 64 75 72 69 6e 67 20 74 68 69 73 20 70 72 6f 63  during this proc
a8b0: 65 73 73 2c 20 69 67 6e 6f 72 65 20 74 68 65 6d  ess, ignore them
a8c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a8d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a8e0: 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 64 65  {.      pager_de
a8f0: 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29  lmaster(zMaster)
a900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
a910: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
a920: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
a930: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
a940: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
a950: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
a960: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
a970: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
a980: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
a990: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
a9a0: 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43  ferent PAGER_SEC
a9b0: 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61  TOR_SIZE.  ** va
a9c0: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
a9d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
a9e0: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
a9f0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ess..  */.  pPag
aa00: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
aa10: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
aa20: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ZE;.  return rc;
aa30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
aa40: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
aa50: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
aa60: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
aa70: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
aa80: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
aa90: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
aaa0: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
aab0: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
aac0: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
aad0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
aae0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
aaf0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
ab00: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
ab10: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
ab20: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
ab30: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
ab40: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
ab50: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
ab60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
ab70: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
ab80: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
ab90: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
aba0: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
abb0: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
abc0: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
abd0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
abe0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
abf0: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
ac00: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
ac10: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ac20: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
ac30: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
ac40: 65 72 29 7b 0a 20 20 6f 66 66 5f 74 20 73 7a 4a  er){.  off_t szJ
ac50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac60: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
ac70: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
ac80: 20 6f 66 66 5f 74 20 68 64 72 4f 66 66 3b 0a 20   off_t hdrOff;. 
ac90: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
aca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
acb0: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
acc0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ace0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
acf0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a    int rc;..  szJ
ad00: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
ad10: 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e  alOff;.#ifndef N
ad20: 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 6f  DEBUG .  {.    o
ad30: 66 66 5f 74 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20  ff_t os_szJ;.   
ad40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
ad50: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
ad60: 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a  >jfd, &os_szJ);.
ad70: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ad80: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
ad90: 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  c;.    assert( s
ada0: 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20  zJ==os_szJ );.  
adb0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
adc0: 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
add0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
ade0: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
adf0: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 0a 20  header written. 
ae00: 20 2a 2a 20 74 68 69 73 20 73 74 61 74 65 6d 65   ** this stateme
ae10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
ae20: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
ae30: 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75  e file if no jou
ae40: 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72  rnal.  ** header
ae50: 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20   was written..  
ae60: 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50  */.  hdrOff = pP
ae70: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
ae80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ae90: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20  er->fullSync || 
aea0: 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28  !hdrOff );.  if(
aeb0: 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20   !hdrOff ){.    
aec0: 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  hdrOff = szJ;.  
aed0: 7d 0a 20 20 0a 0a 20 20 2f 2a 20 54 72 75 6e 63  }.  ..  /* Trunc
aee0: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
aef0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
af00: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
af10: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
af20: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
af30: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
af40: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
af50: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
af60: 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  tSize;..  /* Fig
af70: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
af80: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
af90: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
afa0: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
afb0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
afc0: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
afd0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
afe0: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
aff0: 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  k(&pPager->stfd,
b000: 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50   0);.  nRec = pP
b010: 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a  ager->stmtNRec;.
b020: 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69    .  /* Copy ori
b030: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
b040: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
b050: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
b060: 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  k into the.  ** 
b070: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
b080: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74  Note that the st
b090: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
b0a0: 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20  omits checksums 
b0b0: 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72  from.  ** each r
b0c0: 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65  ecord since powe
b0d0: 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65  r-failure recove
b0e0: 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74  ry is not import
b0f0: 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74  ant to statement
b100: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a  .  ** journals..
b110: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65    */.  for(i=nRe
b120: 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
b130: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
b140: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
b150: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
b160: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
b170: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
b180: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
b190: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b1a0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
b1b0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
b1c0: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
b1d0: 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
b1e0: 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
b1f0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
b200: 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
b210: 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
b220: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
b230: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
b240: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
b250: 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
b260: 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
b270: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
b280: 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
b290: 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
b2a0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
b2b0: 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
b2c0: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
b2d0: 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
b2e0: 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
b2f0: 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
b300: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
b310: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
b320: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
b330: 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
b340: 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
b350: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
b360: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
b370: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
b380: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
b390: 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
b3a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b3b0: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  {.    goto end_s
b3c0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
b3d0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
b3e0: 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  nalOff = pPager-
b3f0: 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50  >stmtJSize;.  pP
b400: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
b410: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b  = pPager->stmtCk
b420: 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 4a  sum;.  assert( J
b430: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
b440: 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e 70  ager)<(pPager->p
b450: 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20  ageSize+8) );.  
b460: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
b470: 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64  ournalOff <= (hd
b480: 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70 61  rOff-(pPager->pa
b490: 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20  geSize+8)) ){.  
b4a0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
b4b0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
b4c0: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
b4d0: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  jfd, 1);.    ass
b4e0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
b4f0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
b500: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b510: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
b520: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77  ayback;.  }..  w
b530: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
b540: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29  urnalOff < szJ )
b550: 7b 0a 20 20 20 20 75 33 32 20 6e 52 65 63 3b 0a  {.    u32 nRec;.
b560: 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
b570: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
b580: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
b590: 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75 6d 6d  zJ, &nRec, &dumm
b5a0: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
b5b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b5c0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
b5d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
b5e0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
b5f0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
b600: 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  }.    if( nRec==
b610: 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  0 ){.      nRec 
b620: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
b630: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
b640: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b650: 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
b660: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
b670: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
b680: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
b690: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
b6a0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
b6b0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
b6c0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29  &pPager->jfd, 1)
b6d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b6e0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
b6f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
b700: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b710: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
b720: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
b730: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
b740: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
b750: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
b760: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
b770: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
b780: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
b790: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
b7a0: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
b7b0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65  TE_CORRUPT;.  }e
b7c0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
b7d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
b7e0: 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
b7f0: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
b800: 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
b810: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b820: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
b830: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
b840: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
b850: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
b860: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
b870: 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68  mum number is th
b880: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
b890: 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70   of the mxPage p
b8a0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20  arameter..** If 
b8b0: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
b8c0: 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66  ve, the noSync f
b8d0: 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e  lag is also set.
b8e0: 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65    noSync bypasse
b8f0: 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  s.** calls to sq
b900: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 2e 20 20  lite3OsSync().  
b910: 54 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d  The pager runs m
b920: 75 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20  uch faster with 
b930: 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75  noSync on,.** bu
b940: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
b950: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
b960: 73 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e  s or there is an
b970: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a   abrupt power .*
b980: 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  * failure, the d
b990: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67  atabase file mig
b9a0: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ht be left in an
b9b0: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
b9c0: 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c  d.** unrepairabl
b9d0: 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f  e state.  .*/.vo
b9e0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
b9f0: 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61  set_cachesize(Pa
ba00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
ba10: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
ba20: 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  mxPage>=0 ){.   
ba30: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
ba40: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
ba50: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  le;.    if( pPag
ba60: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
ba70: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
ba80: 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0; .  }else{.   
ba90: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
baa0: 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20  = 1;.    mxPage 
bab0: 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20  = -mxPage;.  }. 
bac0: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
bad0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
bae0: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
baf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
bb00: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
bb10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
bb20: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
bb30: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
bb40: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
bb50: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
bb60: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
bb70: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
bb80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
bb90: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
bba0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
bbb0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
bbc0: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
bbd0: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
bbe0: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
bbf0: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
bc00: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
bc10: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
bc20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bc30: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
bc40: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
bc50: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
bc60: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
bc70: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
bc80: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
bc90: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
bcb0: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
bcc0: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
bcd0: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
bce0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
bcf0: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
bd00: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
bd10: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
bd20: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
bd30: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
bd40: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
bd50: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
bd60: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
bd80: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
bd90: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
bda0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
bdb0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
bdc0: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
bdd0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
bde0: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
bdf0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
be00: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
be10: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
be20: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
be30: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
be40: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
be50: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
be60: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
be70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
be80: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
be90: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
bea0: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
beb0: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
bec0: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
bed0: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
bee0: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
bf00: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
bf10: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
bf20: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
bf30: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
bf40: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
bf50: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
bf60: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
bf70: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
bf90: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
bfa0: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
bfb0: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
bfc0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
bfd0: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
bfe0: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
bff0: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
c000: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
c010: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76  and FULL=3..*/.v
c020: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
c030: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
c040: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
c050: 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70   int level){.  p
c060: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
c070: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
c080: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
c090: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
c0a0: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
c0b0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
c0c0: 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
c0d0: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
c0e0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
c0f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
c100: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
c110: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
c120: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
c130: 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65   zName.** (zName
c140: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
c150: 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  t SQLITE_TEMPNAM
c160: 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e  E_SIZE bytes lon
c170: 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68  g.)  Write.** th
c180: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
c190: 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
c1a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
c1b0: 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
c1c0: 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
c1d0: 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
c1e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69  .**.** The OS wi
c1f0: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
c200: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
c210: 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
c220: 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e  it is.** closed.
c230: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
c240: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
c250: 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65  temp(char *zFile
c260: 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20  , OsFile *fd){. 
c270: 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20   int cnt = 8;.  
c280: 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20 20  int rc;.  do{.  
c290: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
c2a0: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
c2b0: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
c2c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
c2d0: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
c2e0: 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69  , fd, 1);.  }whi
c2f0: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
c300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
c310: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
c320: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c330: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
c340: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
c350: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
c360: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
c370: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
c380: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
c390: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
c3a0: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
c3b0: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
c3c0: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
c3d0: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
c3e0: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
c3f0: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
c400: 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
c410: 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
c420: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
c430: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
c440: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
c450: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
c460: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
c470: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
c480: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
c490: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
c4a0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
c4b0: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
c4c0: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
c4d0: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
c4e0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
c4f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
c500: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
c510: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
c520: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
c530: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
c540: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
c550: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
c560: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
c570: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
c580: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
c590: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
c5a0: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20  te3pager_open(. 
c5b0: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
c5c0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
c5d0: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
c5e0: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
c5f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
c600: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
c610: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
c620: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
c630: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c650: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
c660: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
c670: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
c680: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 20  int useJournal  
c690: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
c6a0: 20 74 6f 20 75 73 65 20 61 20 72 6f 6c 6c 62 61   to use a rollba
c6b0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ck journal on th
c6c0: 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
c6d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
c6e0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
c6f0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
c700: 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c  nameLen;.  OsFil
c710: 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  e fd;.  int rc =
c720: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
c730: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
c740: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
c750: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
c760: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
c770: 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
c780: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
c790: 3b 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  ;..  *ppPager = 
c7a0: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 66 64 2c  0;.  memset(&fd,
c7b0: 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b   0, sizeof(fd));
c7c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
c7d0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
c7e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c7f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
c800: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
c810: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
c820: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
c830: 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
c840: 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
c850: 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
c860: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
c870: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 22  = sqliteStrDup("
c880: 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ");.      rc = S
c890: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
c8a0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c  lse{.      zFull
c8b0: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
c8c0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
c8d0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
c8e0: 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68     if( zFullPath
c8f0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
c900: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
c910: 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c  enReadWrite(zFul
c920: 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20  lPathname, &fd, 
c930: 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20  &readOnly);.    
c940: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
c950: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
c960: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
c970: 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20  p(zTemp, &fd);. 
c980: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
c990: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
c9a0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
c9b0: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
c9c0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
c9d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c9e0: 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46  K ){.      tempF
c9f0: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ile = 1;.    }. 
ca00: 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c 50   }.  if( !zFullP
ca10: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73  athname ){.    s
ca20: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66  qlite3OsClose(&f
ca30: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
ca40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
ca50: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ca60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
ca70: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
ca80: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
ca90: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
caa0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
cab0: 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73   }.  nameLen = s
cac0: 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e  trlen(zFullPathn
cad0: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  ame);.  pPager =
cae0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
caf0: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
cb00: 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20   nameLen*3 + 30 
cb10: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  );.  if( pPager=
cb20: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
cb30: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
cb40: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
cb50: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
cb60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cb70: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41  NOMEM;.  }.  TRA
cb80: 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE3("OPEN %d %s\
cb90: 6e 22 2c 20 66 64 2e 68 2c 20 7a 46 75 6c 6c 50  n", fd.h, zFullP
cba0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
cbb0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
cbc0: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
cbd0: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
cbe0: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
cbf0: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
cc00: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
cc10: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
cc20: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
cc30: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
cc40: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
cc50: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
cc60: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
cc70: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
cc80: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
cc90: 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  name);.  for(i=n
cca0: 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70  ameLen; i>0 && p
ccb0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
ccc0: 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d  y[i-1]!='/'; i--
ccd0: 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20  ){}.  if( i>0 ) 
cce0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
ccf0: 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73  ry[i-1] = 0;.  s
cd00: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  trcpy(pPager->zJ
cd10: 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74  ournal, zFullPat
cd20: 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  hname);.  sqlite
cd30: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
cd40: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70  me);.  strcpy(&p
cd50: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
cd60: 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72  nameLen], "-jour
cd70: 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d  nal");.  pPager-
cd80: 3e 66 64 20 3d 20 66 64 3b 0a 23 69 66 20 4f 53  >fd = fd;.#if OS
cd90: 5f 55 4e 49 58 0a 20 20 70 50 61 67 65 72 2d 3e  _UNIX.  pPager->
cda0: 66 64 2e 70 50 61 67 65 72 20 3d 20 70 50 61 67  fd.pPager = pPag
cdb0: 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61  er;.#endif.  pPa
cdc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
cdd0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
cde0: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
cdf0: 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44  Journal && !memD
ce00: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  b;.  pPager->stm
ce10: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61  tOpen = 0;.  pPa
ce20: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
ce30: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
ce40: 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ef = 0;.  pPager
ce50: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62  ->dbSize = memDb
ce60: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61  -1;.  pPager->pa
ce70: 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  geSize = SQLITE_
ce80: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
ce90: 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  E;.  pPager->stm
cea0: 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  tSize = 0;.  pPa
ceb0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
cec0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50   0;.  pPager->nP
ced0: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
cee0: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b  r->mxPage = 100;
cef0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
cf00: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
cf10: 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  .  pPager->errMa
cf20: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  sk = 0;.  pPager
cf30: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
cf40: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
cf50: 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
cf60: 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
cf70: 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
cf80: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
cf90: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
cfa0: 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
cfb0: 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75  ->tempFile || !u
cfc0: 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
cfd0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
cfe0: 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f  (pPager->noSync?
cff0: 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  0:1);.  pPager->
d000: 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50  pFirst = 0;.  pP
d010: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
d020: 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
d030: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  ->pLast = 0;.  p
d040: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
d050: 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
d060: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50  ->sectorSize = P
d070: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
d080: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
d090: 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20  yHandler = 0;.  
d0a0: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
d0b0: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
d0c0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
d0d0: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
d0e0: 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
d0f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d100: 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
d110: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
d120: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d130: 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73 79 68  3pager_set_busyh
d140: 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50  andler(Pager *pP
d150: 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65  ager, BusyHandle
d160: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r *pBusyHandler)
d170: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  {.  pPager->pBus
d180: 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79  yHandler = pBusy
d190: 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  Handler;.}../*.*
d1a0: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75  * Set the destru
d1b0: 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61  ctor for this pa
d1c0: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
d1d0: 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  L, the destructo
d1e0: 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77  r is called.** w
d1f0: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
d200: 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20  e count on each 
d210: 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72  page reaches zer
d220: 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74  o.  The destruct
d230: 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65  or can.** be use
d240: 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e  d to clean up in
d250: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
d260: 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61   extra segment a
d270: 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20  ppended to each 
d280: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
d290: 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f  destructor is no
d2a0: 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65  t called as a re
d2b0: 73 75 6c 74 20 73 71 6c 69 74 65 33 70 61 67 65  sult sqlite3page
d2c0: 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  r_close().  .** 
d2d0: 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
d2e0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
d2f0: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
d300: 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f()..*/.void sql
d310: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 64 65  ite3pager_set_de
d320: 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a  structor(Pager *
d330: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
d340: 44 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29  Desc)(void*,int)
d350: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65  ){.  pPager->xDe
d360: 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63  structor = xDesc
d370: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
d380: 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
d390: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
d3a0: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
d3b0: 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
d3c0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
d3d0: 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
d3e0: 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
d3f0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
d400: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   its original.**
d410: 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75   value as a resu
d420: 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  lt of a rollback
d430: 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  .  The callback 
d440: 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76  gives higher-lev
d450: 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70  el code.** an op
d460: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73  portunity to res
d470: 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73  tore the EXTRA s
d480: 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20  ection to agree 
d490: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
d4a0: 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a  d.** page data..
d4b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
d4c0: 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69 74 65  ager_set_reinite
d4d0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
d4e0: 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
d4f0: 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20  (void*,int)){.  
d500: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
d510: 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a  r = xReinit;.}..
d520: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61  /*.** Set the pa
d530: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
d540: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
d550: 74 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65  t only be change
d560: 64 20 77 68 65 6e 20 74 68 65 20 63 61 63 68 65  d when the cache
d570: 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 76 6f   is empty..*/.vo
d580: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
d590: 73 65 74 5f 70 61 67 65 73 69 7a 65 28 50 61 67  set_pagesize(Pag
d5a0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d5b0: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73  pageSize){.  ass
d5c0: 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35  ert( pageSize>=5
d5d0: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
d5e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
d5f0: 53 49 5a 45 20 29 3b 0a 20 20 70 50 61 67 65 72  SIZE );.  pPager
d600: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
d610: 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
d620: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
d630: 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
d640: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
d650: 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
d660: 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
d670: 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4e 6f 20 65  points to.  No e
d680: 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
d690: 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   done..*/.void s
d6a0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61 64  qlite3pager_read
d6b0: 5f 66 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  _fileheader(Page
d6c0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
d6d0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
d6e0: 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65  *pDest){.  memse
d6f0: 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
d700: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
d710: 6d 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  mDb==0 ){.    sq
d720: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
d730: 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
d740: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
d750: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
d760: 74 2c 20 4e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, N);.  }.}../*
d770: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
d780: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
d790: 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
d7a0: 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
d7b0: 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
d7c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
d7d0: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50  ager_pagecount(P
d7e0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
d7f0: 20 6f 66 66 5f 74 20 6e 3b 0a 20 20 61 73 73 65   off_t n;.  asse
d800: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
d810: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
d820: 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
d830: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64  return pPager->d
d840: 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  bSize;.  }.  if(
d850: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d860: 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ze(&pPager->fd, 
d870: 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  &n)!=SQLITE_OK )
d880: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
d890: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
d8a0: 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74  RR_DISK;.    ret
d8b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f  urn 0;.  }.  n /
d8c0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
d8d0: 7a 65 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ze;.  if( !pPage
d8e0: 72 2d 3e 6d 65 6d 44 62 20 26 26 20 6e 3d 3d 50  r->memDb && n==P
d8f0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
d900: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
d910: 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
d920: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
d930: 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
d940: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
d950: 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  Size = n;.  }.  
d960: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
d970: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
d980: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
d990: 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
d9a0: 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a  (Pager*);.../*.*
d9b0: 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20  * Unlink a page 
d9c0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
d9d0: 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20  st (the list of 
d9e0: 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20  all pages where 
d9f0: 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20  nRef==0).** and 
da00: 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f  from its hash co
da10: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a  llision chain..*
da20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
da30: 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a  linkPage(PgHdr *
da40: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
da50: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
da60: 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  ger;..  /* Keep 
da70: 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64  the pFirstSynced
da80: 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
da90: 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73  g at the first s
daa0: 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65  ynchronized page
dab0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70   */.  if( pPg==p
dac0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
dad0: 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72  ced ){.    PgHdr
dae0: 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
daf0: 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  Free;.    while(
db00: 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
db10: 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
db20: 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61  tFree; }.    pPa
db30: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
db40: 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = p;.  }..  /*
db50: 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
db60: 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
db70: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
db80: 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50  e ){.    pPg->pP
db90: 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
dba0: 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
dbb0: 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
dbc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
dbd0: 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b  ->pFirst==pPg );
dbe0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
dbf0: 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
dc00: 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Free;.  }.  if( 
dc10: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
dc20: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
dc30: 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
dc40: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
dc50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
dc60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
dc70: 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Last==pPg );.   
dc80: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
dc90: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
dca0: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
dcb0: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  tFree = pPg->pPr
dcc0: 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f  evFree = 0;..  /
dcd0: 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
dce0: 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c  e pgno hash tabl
dcf0: 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  e */.  if( pPg->
dd00: 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
dd10: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
dd20: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
dd30: 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d  ->pPrevHash;.  }
dd40: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
dd50: 76 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  vHash ){.    pPg
dd60: 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
dd70: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
dd80: 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
dd90: 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61  {.    int h = pa
dda0: 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67  ger_hash(pPg->pg
ddb0: 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
ddc0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
ddd0: 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]==pPg );.    pP
dde0: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
ddf0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
de00: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
de10: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  tHash = pPg->pPr
de20: 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f  evHash = 0;.}../
de30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
de40: 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
de50: 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ncate an in-memo
de60: 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65  ry database.  De
de70: 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65  lete.** all page
de80: 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20  s whose pgno is 
de90: 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
dea0: 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69  er->dbSize and i
deb0: 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a  s unreferenced..
dec0: 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
ded0: 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
dee0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
def0: 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74  re zeroed..*/.st
df00: 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79  atic void memory
df10: 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
df20: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
df30: 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
df40: 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
df50: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
df60: 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
df70: 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
df80: 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
df90: 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
dfa0: 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
dfb0: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
dfc0: 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
dfd0: 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
dfe0: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
dff0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
e000: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
e010: 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
e020: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
e030: 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
e040: 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
e050: 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
e060: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
e070: 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28       unlinkPage(
e080: 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pPg);.      sqli
e090: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
e0a0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
e0b0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  --;.    }.  }.}.
e0c0: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
e0d0: 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  the file to the 
e0e0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
e0f0: 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e  specified..*/.in
e100: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74  t sqlite3pager_t
e110: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
e120: 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
e130: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
e140: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
e150: 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
e160: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
e170: 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
e180: 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
e190: 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
e1a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
e1b0: 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
e1c0: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
e1d0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
e1e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e1f0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
e200: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
e210: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
e220: 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  age;.    memoryT
e230: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
e240: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e250: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
e260: 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
e270: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
e280: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e290: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e2a0: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
e2b0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
e2c0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
e2d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e2e0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
e2f0: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20   = nPage;.  }.  
e300: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e310: 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
e320: 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
e330: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
e340: 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
e350: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
e360: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
e370: 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
e380: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e390: 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
e3a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
e3b0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
e3c0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
e3d0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
e3e0: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
e3f0: 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
e400: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
e410: 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
e420: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
e430: 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
e440: 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
e450: 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
e460: 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
e470: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
e480: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
e490: 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a  er_close(Pager *
e4a0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
e4b0: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
e4c0: 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d   switch( pPager-
e4d0: 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  >state ){.    ca
e4e0: 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  se PAGER_RESERVE
e4f0: 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  D:.    case PAGE
e500: 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63  R_SYNCED: .    c
e510: 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ase PAGER_EXCLUS
e520: 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  IVE: {.      sql
e530: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
e540: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
e550: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
e560: 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emDb ){.        
e570: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
e580: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
e590: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
e5a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
e5b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
e5c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
e5d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e5e0: 73 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a  se PAGER_SHARED:
e5f0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
e600: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
e610: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
e620: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
e630: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
e640: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e650: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
e660: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
e670: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
e680: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e690: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d  }.  }.  for(pPg=
e6a0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
e6b0: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23  g; pPg=pNext){.#
e6c0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
e6d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
e6e0: 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48  mDb ){.      PgH
e6f0: 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
e700: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
e710: 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
e720: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
e730: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
e740: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e750: 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
e760: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
e770: 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
e780: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
e790: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
e7a0: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
e7b0: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
e7c0: 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45  .  TRACE2("CLOSE
e7d0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
e7e0: 66 64 2e 68 29 3b 0a 20 20 73 71 6c 69 74 65 33  fd.h);.  sqlite3
e7f0: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
e800: 3e 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >fd);.  assert( 
e810: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e820: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54  pen==0 );.  /* T
e830: 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
e840: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
e850: 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
e860: 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
e870: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
e880: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
e890: 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
e8a0: 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a  ame);.  ** }.  *
e8b0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
e8c0: 7a 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72  zFilename!=(char
e8d0: 2a 29 26 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a  *)&pPager[1] ){.
e8e0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
e8f0: 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70    /* Cannot happ
e900: 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  en */.    sqlite
e910: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  Free(pPager->zFi
e920: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  lename);.    sql
e930: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
e940: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73  zJournal);.    s
e950: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
e960: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  ->zDirectory);. 
e970: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
e980: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
e990: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e9a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
e9b0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
e9c0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
e9d0: 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
e9e0: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e  lite3pager_pagen
e9f0: 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74  umber(void *pDat
ea00: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  a){.  PgHdr *p =
ea10: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
ea20: 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
ea30: 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pgno;.}../*.*
ea40: 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
ea50: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
ea60: 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
ea70: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
ea80: 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
ea90: 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
eaa0: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
eab0: 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
eac0: 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
ead0: 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
eae0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
eaf0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
eb00: 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
eb10: 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
eb20: 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
eb30: 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
eb40: 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
eb50: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
eb60: 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
eb70: 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
eb80: 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
eb90: 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
eba0: 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
ebb0: 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
ebc0: 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
ebd0: 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
ebe0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
ebf0: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
ec00: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
ec10: 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
ec20: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
ec30: 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
ec40: 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50  .    if( pPg==pP
ec50: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
ec60: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20  tSynced ){.     
ec70: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
ec80: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
ec90: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
eca0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
ecb0: 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
ecc0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
ecd0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
ece0: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
ecf0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
ed00: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
ed10: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
ed20: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
ed30: 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  xtFree;.    }els
ed40: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
ed50: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
ed60: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
ed70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
ed80: 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
ed90: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
eda0: 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
edb0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
edc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
edd0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
ede0: 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
edf0: 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  vFree;.    }.   
ee00: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
ee10: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
ee20: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
ee30: 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65  FO(pPg);.}.#ifde
ee40: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
ee50: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
ee60: 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
ee70: 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
ee80: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
ee90: 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a  _page_ref(pPg);.
eea0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eeb0: 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
eec0: 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
eed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
eee0: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f  e.# define page_
eef0: 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e  ref(P)   ((P)->n
ef00: 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66  Ref==0?_page_ref
ef10: 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e  (P):(void)(P)->n
ef20: 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f  Ref++).#endif../
ef30: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
ef40: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
ef50: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
ef60: 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
ef70: 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  r is.** a refere
ef80: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  nce to the page 
ef90: 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  data..*/.int sql
efa0: 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f  ite3pager_ref(vo
efb0: 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
efc0: 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
efd0: 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
efe0: 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
eff0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f000: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
f010: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
f020: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
f030: 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
f040: 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
f050: 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
f060: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
f070: 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
f080: 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
f090: 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
f0a0: 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20  isk.  It is not 
f0b0: 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  safe to modify t
f0c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
f0d0: 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
f0e0: 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75  after.** the jou
f0f0: 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79  rnal has been sy
f100: 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72  nced.  If the or
f110: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f120: 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f  is modified befo
f130: 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  re.** the journa
f140: 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20  l is synced and 
f150: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
f160: 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79  occurs, the unsy
f170: 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  nced journal.** 
f180: 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f  data would be lo
f190: 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  st and we would 
f1a0: 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  be unable to com
f1b0: 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b  pletely rollback
f1c0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
f1d0: 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62   changes.  Datab
f1e0: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
f1f0: 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a  ould occur..** .
f200: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f210: 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65  also updates the
f220: 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
f230: 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
f240: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65   journal..** (Se
f250: 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68  e comments on th
f260: 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
f270: 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  () routine for a
f280: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
f290: 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68  ation.).** If th
f2a0: 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46  e sync mode is F
f2b0: 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77  ULL, two syncs w
f2c0: 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73  ill occur.  Firs
f2d0: 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  t the whole jour
f2e0: 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64  nal.** is synced
f2f0: 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20  , then the nRec 
f300: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
f310: 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20  , then a second 
f320: 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
f330: 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
f340: 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64   databases, we d
f350: 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65  o not care if we
f360: 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c   are able to rol
f370: 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61  lback.** after a
f380: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
f390: 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  so sync occurs..
f3a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f3b0: 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
f3c0: 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
f3d0: 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
f3e0: 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
f3f0: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
f400: 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
f410: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
f420: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
f430: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f440: 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
f450: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
f460: 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
f470: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
f480: 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
f490: 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
f4a0: 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
f4b0: 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
f4c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
f4d0: 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
f4e0: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
f4f0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73  File ){.      as
f500: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f510: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
f520: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70     /* assert( !p
f530: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
f540: 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74   // noSync might
f550: 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68   be set if synch
f560: 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  ronous.      ** 
f570: 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61  was turned off a
f580: 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
f590: 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
f5a0: 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a  .  Ticket #615 *
f5b0: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
f5c0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
f5d0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
f5e0: 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63  e pPager->nRec c
f5f0: 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65  ounter we are ke
f600: 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20  eping agrees.   
f610: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65       ** with the
f620: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
f630: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
f640: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f650: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
f660: 20 20 20 20 20 6f 66 66 5f 74 20 6a 53 7a 3b 0a       off_t jSz;.
f670: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f680: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
f690: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
f6a0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
f6b0: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
f6c0: 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
f6d0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
f6e0: 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
f6f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
f700: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
f710: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
f720: 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
f730: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
f740: 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
f750: 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
f760: 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
f770: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
f780: 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
f790: 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
f7a0: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
f7b0: 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
f7c0: 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
f7d0: 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
f7e0: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
f7f0: 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
f800: 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
f810: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
f820: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
f830: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
f840: 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
f850: 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
f860: 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
f870: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
f880: 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
f890: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
f8a0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
f8b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f8c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
f8d0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
f8e0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
f8f0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
f900: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f910: 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 72  gic));.        r
f920: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
f930: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
f940: 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
f950: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
f960: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
f970: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
f980: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
f990: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f9a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f9b0: 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
f9c0: 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
f9d0: 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
f9e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f9f0: 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  3OsSync(&pPager-
fa00: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
fa10: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
fa20: 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  rc;.      pPager
fa30: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
fa40: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
fa50: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
fa60: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
fa70: 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
fa80: 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
fa90: 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
faa0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
fab0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
fac0: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
fad0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
fae0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
faf0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
fb00: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
fb10: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  r->pFirst;.  }..
fb20: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
fb30: 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
fb40: 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
fb50: 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
fb60: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
fb70: 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
fb80: 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
fb90: 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
fba0: 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
fbb0: 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
fbc0: 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
fbd0: 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
fbe0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
fbf0: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
fc00: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
fc10: 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
fc20: 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
fc30: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
fc40: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
fc50: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29  pPager->pFirst )
fc60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
fc70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fc80: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
fc90: 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
fca0: 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
fcb0: 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
fcc0: 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
fcd0: 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
fce0: 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
fcf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
fd00: 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
fd10: 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
fd20: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
fd30: 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
fd40: 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
fd50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
fd60: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
fd70: 75 73 79 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  usy = 1;..  if( 
fd80: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
fd90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
fda0: 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
fdb0: 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
fdc0: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
fdd0: 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
fde0: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
fdf0: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
fe00: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
fe10: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
fe20: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
fe30: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
fe40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
fe50: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
fe60: 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f  3OsLock() are no
fe70: 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  -ops..  **.  ** 
fe80: 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
fe90: 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
fea0: 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
feb0: 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
fec0: 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
fed0: 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
fee0: 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
fef0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
ff00: 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
ff10: 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
ff20: 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
ff30: 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
ff40: 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
ff50: 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
ff60: 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
ff70: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
ff80: 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
ff90: 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
ffa0: 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
ffb0: 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
ffc0: 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
ffd0: 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
ffe0: 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
fff0: 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
10000 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
10010 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
10020 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
10030 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
10040 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
10050 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
10060 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
10070 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
10080 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
10090 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
100a0 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
100b0 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
100c0 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
100d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
100e0 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
100f0 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
10100 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
10110 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
10120 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20  back..  */.  do 
10130 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
10140 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
10150 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
10160 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68 69 6c 65 28  LOCK);.  }while(
10170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
10180 20 26 26 20 0a 20 20 20 20 20 20 70 50 61 67 65   && .      pPage
10190 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
101a0 26 26 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  && .      pPager
101b0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
101c0 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20  xFunc && .      
101d0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
101e0 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67  dler->xFunc(pPag
101f0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
10200 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a  ->pArg, busy++).
10210 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
10220 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10230 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10240 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
10250 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
10260 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  ;..  while( pLis
10270 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
10280 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
10290 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
102a0 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
102b0 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
102c0 28 6f 66 66 5f 74 29 70 50 61 67 65 72 2d 3e 70  (off_t)pPager->p
102d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 43 4f  ageSize);.    CO
102e0 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
102f0 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
10300 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36  , pList->pgno, 6
10310 29 3b 0a 20 20 20 20 54 52 41 43 45 33 28 22 53  );.    TRACE3("S
10320 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
10330 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
10340 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
10350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10360 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
10370 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
10380 54 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67 65  TA(pList), pPage
10390 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
103a0 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
103b0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
103c0 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
103d0 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  o, 0);.    if( r
103e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
103f0 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20     pList->dirty 
10400 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  = 0;.    pList =
10410 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
10420 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10430 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10440 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64   Collect every d
10450 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61  irty page into a
10460 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a   dirty list and.
10470 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** return a poin
10480 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
10490 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41  of that list.  A
104a0 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
104b0 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69  collected even i
104c0 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c  f they are still
104d0 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
104e0 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
104f0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
10500 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
10510 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20  r){.  PgHdr *p, 
10520 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20  *pList;.  pList 
10530 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61  = 0;.  for(p=pPa
10540 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
10550 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
10560 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29    if( p->dirty )
10570 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74  {.      p->pDirt
10580 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  y = pList;.     
10590 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20   pList = p;.    
105a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
105b0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
105c0 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
105d0 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
105e0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
105f0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
10600 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
10610 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
10620 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
10630 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
10640 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
10650 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
10660 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20  ** A _get works 
10670 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
10680 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
10690 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
106a0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
106b0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
106c0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
106d0 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
106e0 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
106f0 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
10700 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
10710 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
10720 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
10730 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
10740 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
10750 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
10760 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
10770 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
10780 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
10790 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
107a0 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
107b0 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
107c0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
107d0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
107e0 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
107f0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
10800 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
10810 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
10820 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
10830 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
10840 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
10850 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
10860 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
10870 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
10880 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
10890 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
108a0 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
108b0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
108c0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
108d0 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
108e0 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
108f0 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
10900 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
10910 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
10920 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
10930 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
10940 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
10950 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
10960 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
10970 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
10980 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
10990 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
109a0 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
109b0 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
109c0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
109d0 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
109e0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
109f0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
10a00 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
10a10 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72  3pager_get(Pager
10a20 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
10a30 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61  gno, void **ppPa
10a40 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ge){.  PgHdr *pP
10a50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
10a60 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
10a70 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
10a80 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
10a90 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
10aa0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
10ab0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
10ac0 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
10ad0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
10ae0 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47  >errMask & ~(PAG
10af0 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a  ER_ERR_FULL) ){.
10b00 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
10b10 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
10b20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
10b30 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
10b40 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
10b50 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
10b60 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
10b70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10b80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10b90 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
10ba0 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
10bb0 7b 0a 20 20 20 20 69 6e 74 20 62 75 73 79 20 3d  {.    int busy =
10bc0 20 31 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   1;.    do {.   
10bd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
10be0 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  sLock(&pPager->f
10bf0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
10c00 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
10c10 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
10c20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
10c30 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26  >pBusyHandler &&
10c40 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
10c50 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
10c60 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20  xFunc && .      
10c70 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
10c80 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50  andler->xFunc(pP
10c90 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
10ca0 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b  er->pArg, busy++
10cb0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
10cc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10cd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10ce0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
10cf0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
10d00 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 20 20  ER_SHARED;..    
10d10 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
10d20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
10d30 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
10d40 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
10d50 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
10d60 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
10d70 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
10d80 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
10d90 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
10da0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
10db0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
10dc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10dd0 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61  OsFileExists(pPa
10de0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26  ger->zJournal) &
10df0 26 0a 20 20 20 20 20 20 20 20 21 73 71 6c 69 74  &.        !sqlit
10e00 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
10e10 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
10e20 64 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  d) .    ){.     
10e30 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20    int rc;..     
10e40 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
10e50 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
10e60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
10e70 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
10e80 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a 20 69  t is.       ** i
10e90 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
10ea0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
10eb0 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
10ec0 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
10ed0 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
10ee0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
10ef0 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
10f00 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
10f10 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64   the.       ** d
10f20 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
10f30 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
10f40 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
10f50 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
10f60 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
10f70 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
10f80 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
10f90 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
10fa0 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
10fb0 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ** back..       
10fc0 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20 42 65  ** .       ** Be
10fd0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
10fe0 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
10ff0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
11000 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
11010 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63    ** second proc
11020 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ess will get to 
11030 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
11040 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
11050 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62 74  to.       ** obt
11060 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43  ain it's own EXC
11070 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
11080 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11090 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
110a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
110b0 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  sLock(&pPager->f
110c0 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
110d0 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  K);.       if( r
110e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
110f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11100 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
11110 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
11120 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
11130 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
11140 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  NLOCK;.         
11150 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
11160 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
11170 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
11180 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20  _EXCLUSIVE;..   
11190 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
111a0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
111b0 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ing only.  Retur
111c0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  n SQLITE_BUSY if
111d0 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72  .       ** we ar
111e0 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  e unable to open
111f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11200 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20  e. .       **.  
11210 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72       ** The jour
11220 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
11230 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
11240 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65  ked itself.  The
11250 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  .       ** journ
11260 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
11270 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
11280 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
11290 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
112a0 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   ** a write lock
112b0 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
112c0 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f  ver any chance o
112d0 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20  f two or more.  
112e0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
112f0 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f  s opening the jo
11300 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d  urnal at the sam
11310 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a  e time..       *
11320 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
11330 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
11340 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  nly(pPager->zJou
11350 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
11360 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  fd);.       if( 
11370 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11380 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
11390 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
113a0 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
113b0 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
113c0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
113d0 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
113e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
113f0 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20  USY;.       }.  
11400 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
11410 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
11420 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
11430 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
11440 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
11450 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
11460 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
11470 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
11480 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
11490 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20  rnalHdr = 0;..  
114a0 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
114b0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
114c0 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
114d0 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
114e0 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  e.       ** lock
114f0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
11500 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
11510 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
11520 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
11530 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
11540 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11550 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11560 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
11580 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
11590 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
115a0 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65  or page in cache
115b0 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
115c0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
115d0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
115e0 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
115f0 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
11600 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
11610 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
11620 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
11630 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ARED;.    }.  }.
11640 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
11650 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
11660 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
11670 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
11680 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68  he. */.    int h
11690 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d  ;.    pPager->nM
116a0 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  iss++;.    if( p
116b0 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61  Pager->nPage<pPa
116c0 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70  ger->mxPage || p
116d0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30  Pager->pFirst==0
116e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44   || pPager->memD
116f0 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72  b ){.      /* Cr
11700 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
11710 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73  */.      pPg = s
11720 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
11730 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70  sizeof(*pPg) + p
11740 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
11770 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
11780 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50              + pP
117b0 61 67 65 72 2d 3e 6d 65 6d 44 62 2a 73 69 7a 65  ager->memDb*size
117c0 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b  of(PgHistory) );
117d0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
117e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
117f0 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
11800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
11810 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
11820 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
11830 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
11840 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
11850 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20  ER_ERR_MEM;.    
11860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11870 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
11880 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
11890 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
118a0 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  g));.      if( p
118b0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
118c0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
118d0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
118e0 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69  , pPager), 0, si
118f0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29  zeof(PgHistory))
11900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11910 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
11920 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d  ager;.      pPg-
11930 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67  >pNextAll = pPag
11940 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20  er->pAll;.      
11950 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70  pPager->pAll = p
11960 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  Pg;.      pPager
11970 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d  ->nPage++;.    }
11980 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46  else{.      /* F
11990 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
119a0 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
119b0 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
119c0 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20  t does not.     
119d0 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74   ** require us t
119e0 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  o do an fsync() 
119f0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  on the journal..
11a00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
11a10 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
11a20 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20  rstSynced;..    
11a30 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
11a40 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
11a50 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
11a60 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
11a70 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ).      ** on th
11a80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
11a90 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
11aa0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
11ab0 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  s is a.      ** 
11ac0 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74  very slow operat
11ad0 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20  ion, so we work 
11ae0 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74  hard to avoid it
11af0 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73  .  But sometimes
11b00 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
11b10 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
11b20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
11b30 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
11b40 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63     int rc = sync
11b50 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
11b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
11b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11b80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
11b90 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
11ba0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11bb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
11bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11bd0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
11be0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
11bf0 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
11c00 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
11c10 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
11c20 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 09  eader into the..
11c30 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
11c40 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  e. This is done 
11c50 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f  to avoid ever mo
11c60 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61  difying a journa
11c70 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65 72 20 74  l..  ** header t
11c80 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
11c90 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
11ca0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
11cb0 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65 61 64 79  ve..  ** already
11cc0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
11cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
11ce0 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65  n case the heade
11cf0 72 20 69 73 0a 09 20 20 2a 2a 20 74 72 61 73 68  r is..  ** trash
11d00 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63  ed when the nRec
11d10 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
11d20 64 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  d)..          */
11d30 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
11d40 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
11d50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11d60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11d70 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 20  f > 0 );.       
11d80 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
11d90 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
11da0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
11db0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
11dc0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
11dd0 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
11de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
11df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11e00 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  RR;.          }.
11e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11e20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
11e30 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a  pFirst;.      }.
11e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
11e50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
11e60 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
11e70 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61  e page to the da
11e80 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
11e90 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20 20  t is dirty..    
11ea0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
11eb0 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
11ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
11ed0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
11ee0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 44  .        pPg->pD
11ef0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
11f00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
11f10 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
11f20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
11f30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11f40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11f50 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
11f60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
11f70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11f80 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
11f90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11fa0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
11fb0 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rty==0 );..     
11fc0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
11fd0 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
11fe0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
11ff0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
12000 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  en.      ** set 
12010 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
12020 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
12030 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
12040 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  he.      ** sqli
12050 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  te_dont_rollback
12060 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  () optimization 
12070 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20  for the rest of 
12080 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
12090 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73  ..      ** It is
120a0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f   necessary to do
120b0 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68   this because th
120c0 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c  e page marked al
120d0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20  waysRollback.   
120e0 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72     ** might be r
120f0 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
12100 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
12110 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
12120 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20  't remember.    
12130 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
12140 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
12150 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
12160 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
12170 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  es must.      **
12180 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   be marked as al
12190 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f  waysRollback fro
121a0 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20  m here on out.. 
121b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
121c0 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
121d0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
121e0 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
121f0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
12200 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
12210 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
12220 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
12230 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
12240 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  sh table.      *
12250 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  /.      unlinkPa
12260 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ge(pPg);.      p
12270 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a  Pager->nOvfl++;.
12280 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
12290 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
122a0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
122b0 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
122c0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
122d0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
122e0 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d   sqlite3CheckMem
122f0 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ory(pPager->aInJ
12300 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b  ournal, pgno/8);
12310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12320 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
12330 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  en );.      pPg-
12340 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50  >inJournal = (pP
12350 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
12360 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
12370 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
12380 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
12390 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
123a0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
123b0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
123c0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
123d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
123e0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
123f0 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  mt && (int)pgno<
12400 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
12410 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  e.             &
12420 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  & (pPager->aInSt
12430 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  mt[pgno/8] & (1<
12440 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29  <(pgno&7)))!=0 )
12450 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  {.      page_add
12460 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
12470 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
12480 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65       page_remove
12490 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
124a0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
124b0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
124c0 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
124d0 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70  1;.    REFINFO(p
124e0 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  Pg);.    pPager-
124f0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d  >nRef++;.    h =
12500 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f   pager_hash(pgno
12510 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
12520 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
12530 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
12540 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
12550 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
12560 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
12570 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12580 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
12590 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
125a0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
125b0 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
125c0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
125d0 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  f( pPager->nExtr
125e0 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  a>0 ){.      mem
125f0 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
12600 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
12610 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
12620 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ra);.    }.    s
12630 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
12640 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
12650 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
12660 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
12670 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
12680 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44  unref(PGHDR_TO_D
12690 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20  ATA(pPg));.     
126a0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
126b0 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
126c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
126d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
126e0 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
126f0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65  pgno ){.      me
12700 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
12710 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
12720 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
12730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12740 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73  int rc;.      as
12750 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
12760 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mDb==0 );.      
12770 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
12780 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
12790 2d 31 29 2a 28 6f 66 66 5f 74 29 70 50 61 67 65  -1)*(off_t)pPage
127a0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
127b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
127c0 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
127d0 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
127e0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
127f0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
12800 20 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25   TRACE3("FETCH %
12810 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70 50  d page %d\n", pP
12820 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d  ager->fd.h, pPg-
12830 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f  >pgno);.      CO
12840 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
12850 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
12860 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
12870 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12890 20 20 6f 66 66 5f 74 20 66 69 6c 65 53 69 7a 65    off_t fileSize
128a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
128b0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
128c0 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c  &pPager->fd,&fil
128d0 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f  eSize)!=SQLITE_O
128e0 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
128f0 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67   || fileSize>=pg
12900 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  no*pPager->pageS
12910 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
12920 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
12930 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
12940 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20  A(pPg));.       
12950 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12960 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12970 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
12980 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
12990 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
129a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
129b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
129c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
129d0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
129e0 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
129f0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
12a00 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a  pPager->nHit++;.
12a10 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
12a20 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
12a30 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
12a40 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
12a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12a60 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
12a70 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
12a80 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
12a90 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
12aa0 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
12ab0 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
12ac0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
12ad0 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
12ae0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
12af0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
12b00 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
12b10 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  so sqlite3pager_
12b20 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  get().  The diff
12b30 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
12b40 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
12b50 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nd sqlite3pager_
12b60 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  get() is that _g
12b70 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
12b80 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
12b90 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
12ba0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
12bb0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
12bc0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
12bd0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
12be0 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
12bf0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
12c00 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
12c10 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
12c20 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
12c30 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70 61  .void *sqlite3pa
12c40 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
12c50 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
12c60 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
12c70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
12c80 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
12c90 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
12ca0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
12cb0 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
12cc0 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
12cd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
12ce0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
12cf0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
12d00 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
12d10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
12d20 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
12d30 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
12d40 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
12d50 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
12d60 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
12d70 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
12d80 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
12d90 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
12da0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
12db0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
12dc0 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
12dd0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
12de0 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
12df0 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
12e00 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
12e10 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
12e20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
12e30 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
12e40 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
12e50 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  unref(void *pDat
12e60 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
12e70 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
12e80 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
12e90 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
12ea0 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  age.  */.  pPg =
12eb0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
12ec0 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
12ed0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
12ee0 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
12ef0 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
12f00 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
12f10 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
12f20 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
12f30 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
12f40 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
12f50 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
12f60 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
12f70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
12f80 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
12f90 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
12fa0 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
12fb0 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
12fc0 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
12fd0 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
12fe0 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
12ff0 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
13000 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
13010 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
13020 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
13030 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
13040 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
13050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13060 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
13070 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
13080 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
13090 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
130a0 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
130b0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
130c0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
130d0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
130e0 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
130f0 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
13100 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
13110 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65  tor(pData, pPage
13120 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
13130 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
13140 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
13150 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
13160 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
13170 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
13180 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13190 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
131a0 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
131b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
131c0 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
131d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
131e0 66 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  f==0 && !pPager-
131f0 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
13200 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
13210 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
13220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13230 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
13240 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  te a journal fil
13250 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54  e for pPager.  T
13260 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65  here should alre
13270 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
13280 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56  D.** or EXCLUSIV
13290 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
132a0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e  tabase file when
132b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
132c0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
132d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
132e0 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20  if everything.  
132f0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
13300 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65  code and release
13310 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f   the.** write lo
13320 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  ck if anything g
13330 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
13340 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
13350 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
13360 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
13370 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
13380 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
13390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
133a0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
133b0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
133c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
133d0 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
133e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
133f0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
13400 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
13410 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
13420 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
13430 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
13440 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
13450 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
13460 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
13470 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
13480 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
13490 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
134a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
134b0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
134c0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
134d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
134e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
134f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
13500 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65  nExclusive(pPage
13510 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
13520 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72  ager->jfd,pPager
13530 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  ->tempFile);.  p
13540 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13550 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
13560 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
13570 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13580 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  lHdr = 0;.  if( 
13590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
135a0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
135b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
135c0 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
135d0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
135e0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  .    sqlite3OsUn
135f0 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
13600 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
13610 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
13620 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
13630 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
13640 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
13650 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50  OpenDirectory(pP
13660 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
13670 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
13680 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
13690 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
136a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
136b0 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
136c0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
136d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61  ;.  pPager->alwa
136e0 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
136f0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
13700 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
13710 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
13720 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
13730 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
13740 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13750 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
13760 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
13770 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
13780 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
13790 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
137a0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
137b0 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
137c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
137d0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
137e0 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67  _stmt_begin(pPag
137f0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
13800 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13810 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
13820 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
13830 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
13840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13850 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
13860 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ULL;.    }.  }. 
13870 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
13880 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
13890 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
138a0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
138b0 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
138c0 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
138d0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
138e0 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
138f0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
13900 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63  er_commit() is c
13910 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
13920 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
13930 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
13940 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
13950 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69  3pager_close() i
13960 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
13970 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
13980 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
13990 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
139a0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
139b0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
139c0 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
139d0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
139e0 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
139f0 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
13a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13a10 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
13a20 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
13a30 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
13a40 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
13a50 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
13a60 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
13a70 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
13a80 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
13a90 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
13aa0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
13ab0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
13ac0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
13ad0 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
13ae0 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
13af0 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
13b00 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
13b10 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
13b20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
13b30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
13b40 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
13b50 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
13b60 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
13b70 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
13b80 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
13b90 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
13ba0 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
13bb0 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
13bc0 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
13bd0 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
13be0 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
13bf0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
13c00 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
13c10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
13c20 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
13c30 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
13c40 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
13c50 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
13c60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
13c70 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70  er_begin(void *p
13c80 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
13c90 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
13ca0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
13cb0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
13cc0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
13cd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13ce0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
13cf0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
13d00 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
13d10 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
13d20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13d30 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
13d40 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
13d50 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
13d60 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
13d70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
13d80 44 62 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  Db ){.      pPag
13d90 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
13da0 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
13db0 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
13dc0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
13dd0 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  dbSize;.    }els
13de0 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
13df0 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
13e00 4f 43 4b 0a 20 20 20 20 20 20 69 6e 74 20 62 75  OCK.      int bu
13e10 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 6f  sy = 1;.      do
13e20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   {.        rc = 
13e30 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
13e40 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
13e50 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
13e60 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
13e70 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20 20 20  ITE_BUSY && .   
13e80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
13e90 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a  BusyHandler && .
13ea0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13eb0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
13ec0 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20  xFunc && .      
13ed0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
13ee0 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28  yHandler->xFunc(
13ef0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
13f00 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79  dler->pArg, busy
13f10 2b 2b 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ++).      );.#el
13f20 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  se.      rc = sq
13f30 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
13f40 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
13f50 44 5f 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 0a  D_LOCK);.#endif.
13f60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13f80 20 20 20 2f 2a 20 57 65 20 64 6f 20 6e 6f 74 20     /* We do not 
13f90 63 61 6c 6c 20 74 68 65 20 62 75 73 79 20 68 61  call the busy ha
13fa0 6e 64 6c 65 72 20 77 68 65 6e 20 77 65 20 66 61  ndler when we fa
13fb0 69 6c 20 74 6f 20 67 65 74 20 61 20 72 65 73 65  il to get a rese
13fc0 72 76 65 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  rved lock..     
13fd0 20 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 72     ** The only r
13fe0 65 61 73 6f 6e 20 77 65 20 6d 69 67 68 74 20 66  eason we might f
13ff0 61 69 6c 20 69 73 20 62 65 63 61 75 73 65 20 61  ail is because a
14000 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
14010 73 20 68 6f 6c 64 69 6e 67 0a 20 20 20 20 20 20  s holding.      
14020 20 20 2a 2a 20 74 68 65 20 72 65 73 65 72 76 65    ** the reserve
14030 64 20 6c 6f 63 6b 2e 20 20 42 75 74 20 74 68 65  d lock.  But the
14040 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 77   other process w
14050 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
14060 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  to.        ** re
14070 6c 65 61 73 65 20 69 74 73 20 72 65 73 65 72 76  lease its reserv
14080 65 64 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68  ed lock until th
14090 69 73 20 70 72 6f 63 65 73 73 20 72 65 6c 65 61  is process relea
140a0 73 65 73 20 69 74 73 20 73 68 61 72 65 64 0a 20  ses its shared. 
140b0 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20         ** lock. 
140c0 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20   So we might as 
140d0 77 65 6c 6c 20 66 61 69 6c 20 69 6e 20 74 68 69  well fail in thi
140e0 73 20 70 72 6f 63 65 73 73 2c 20 6c 65 74 20 69  s process, let i
140f0 74 20 72 65 6c 65 61 73 65 0a 20 20 20 20 20 20  t release.      
14100 20 20 2a 2a 20 69 74 73 20 73 68 61 72 65 64 20    ** its shared 
14110 6c 6f 63 6b 20 73 6f 20 74 68 61 74 20 74 68 65  lock so that the
14120 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
14130 61 6e 20 63 6f 6d 6d 69 74 2e 0a 20 20 20 20 20  an commit..     
14140 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
14150 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
14160 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
14170 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
14180 45 52 56 45 44 3b 0a 20 20 20 20 20 20 70 50 61  ERVED;.      pPa
14190 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
141a0 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
141b0 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  2("TRANSACTION %
141c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
141d0 2e 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  .h);.      if( p
141e0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
141f0 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
14200 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
14210 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
14220 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
14230 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14240 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
14260 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
14270 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
14280 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
14290 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
142a0 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
142b0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
142c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
142d0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
142e0 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
142f0 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
14300 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
14310 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
14320 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
14330 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
14340 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
14350 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
14360 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
14370 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
14380 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
14390 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
143a0 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
143b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
143c0 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
143d0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
143e0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
143f0 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
14400 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
14410 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
14420 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
14430 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
14440 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
14450 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
14460 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
14470 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
14480 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
14490 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
144a0 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
144b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
144c0 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
144d0 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
144e0 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
144f0 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
14500 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
14510 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
14520 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
14530 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
14540 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  l to sqlite3page
14550 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  r_commit() or sq
14560 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
14570 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
14580 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
14590 33 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69  3pager_write(voi
145a0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
145b0 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
145c0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
145d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
145e0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
145f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14600 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
14610 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
14620 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14630 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72  rrMask ){ .    r
14640 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
14650 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
14660 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
14670 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
14680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
14690 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  M;.  }..  assert
146a0 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
146b0 73 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ster );..  /* Ma
146c0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
146d0 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
146e0 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
146f0 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
14700 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
14710 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
14720 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
14730 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79   */.  pPg->dirty
14740 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
14750 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
14760 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50  Pg->inStmt || pP
14770 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
14780 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
14790 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
147a0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
147b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
147c0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
147d0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
147e0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
147f0 65 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 77  eds to be.  ** w
14800 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
14810 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
14820 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
14830 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  int journal.  **
14840 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20   or both..  **. 
14850 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
14860 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
14870 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
14880 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
14890 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
148a0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
148b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
148c0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
148d0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 72 63  R_UNLOCK );.  rc
148e0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
148f0 62 65 67 69 6e 28 70 44 61 74 61 29 3b 0a 20 20  begin(pData);.  
14900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14910 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
14920 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
14930 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
14940 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
14950 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
14960 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
14970 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
14980 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
14990 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
149a0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
149b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
149c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
149d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
149e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
149f0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65   || !pPager->use
14a00 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61  Journal );.  pPa
14a10 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
14a20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  = 1;..  /* The t
14a30 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
14a40 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
14a50 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
14a60 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a 2a 20  RVED or an.  ** 
14a70 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
14a80 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
14a90 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
14aa0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
14ab0 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 74 72  e to.  ** the tr
14ac0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
14ad0 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
14ae0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
14af0 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  */.  if( !pPg->i
14b00 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
14b10 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
14b20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  || pPager->memDb
14b30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 6e  ) ){.    if( (in
14b40 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
14b50 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
14b60 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  e ){.      int s
14b70 7a 50 67 3b 0a 20 20 20 20 20 20 75 33 32 20 73  zPg;.      u32 s
14b80 61 76 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20  aved;.      if( 
14b90 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
14ba0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
14bb0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
14bc0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
14bd0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
14be0 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
14bf0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 70  %d page %d\n", p
14c00 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70 50 67  Pager->fd.h, pPg
14c10 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
14c20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
14c30 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20  pOrig==0 );.    
14c40 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67      pHist->pOrig
14c50 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
14c60 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
14c70 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
14c80 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
14c90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
14ca0 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69  mcpy(pHist->pOri
14cb0 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  g, PGHDR_TO_DATA
14cc0 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
14cd0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
14ce0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
14cf0 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73  .        u32 cks
14d00 75 6d 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  um;.        CODE
14d10 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
14d20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
14d30 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
14d40 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
14d50 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
14d60 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 73  Data);.        s
14d70 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47  aved = *(u32*)PG
14d80 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
14d90 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
14da0 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63     store32bits(c
14db0 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50 61 67 65  ksum, pPg, pPage
14dc0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14dd0 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50 61        szPg = pPa
14de0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b  ger->pageSize+8;
14df0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32  .        store32
14e00 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20  bits(pPg->pgno, 
14e10 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20  pPg, -4);.      
14e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14e30 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
14e40 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
14e50 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
14e60 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
14e70 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a  journalOff += sz
14e80 50 67 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  Pg;.        TRAC
14e90 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E4("JOURNAL %d p
14ea0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
14eb0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
14ec0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 66         pPager->f
14ed0 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  d.h, pPg->pgno, 
14ee0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
14ef0 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
14f00 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
14f10 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
14f20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52      *(u32*)PGHDR
14f30 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
14f40 50 61 67 65 72 29 20 3d 20 73 61 76 65 64 3b 0a  Pager) = saved;.
14f50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
14f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
14f80 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
14f90 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
14fa0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
14fb0 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
14fc0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  L;.          ret
14fd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
14fe0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
14ff0 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
15000 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15010 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
15020 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
15030 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
15040 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
15050 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
15060 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
15070 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
15080 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
15090 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
150a0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
150b0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
150c0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
150d0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
150e0 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
150f0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
15100 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
15110 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15130 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
15140 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
15150 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
15160 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
15170 20 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20   TRACE4("APPEND 
15180 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
15190 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
151a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
151b0 3e 66 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f  >fd.h, pPg->pgno
151c0 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
151d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
151e0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
151f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
15200 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
15210 20 7d 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f   }.    pPg->inJo
15220 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a  urnal = 1;.  }..
15230 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
15240 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
15250 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
15260 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
15270 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  .  ** then write
15280 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
15290 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
152a0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
152b0 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
152c0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
152d0 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
152e0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
152f0 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
15300 74 0a 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69  t.  ** in that i
15310 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
15320 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
15330 61 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ader..  */.  if(
15340 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
15350 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
15360 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
15370 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
15380 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  mtSize ){.    as
15390 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
153a0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
153b0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
153c0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
153d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d   if( pPager->mem
153e0 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69  Db ){.      PgHi
153f0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
15400 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
15410 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
15420 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
15430 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
15440 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
15450 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
15460 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
15470 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
15480 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
15490 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
154a0 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
154b0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
154c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
154d0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
154e0 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a    TRACE3("STMT-J
154f0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
15500 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
15510 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  .h, pPg->pgno);.
15520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15530 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67   store32bits(pPg
15540 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29  ->pgno, pPg, -4)
15550 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
15560 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
15570 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
15580 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15590 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 73  Write(&pPager->s
155a0 74 66 64 2c 20 28 28 63 68 61 72 2a 29 70 44 61  tfd, ((char*)pDa
155b0 74 61 29 2d 34 2c 20 70 50 61 67 65 72 2d 3e 70  ta)-4, pPager->p
155c0 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
155d0 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a    TRACE3("STMT-J
155e0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
155f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64  d\n", pPager->fd
15600 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  .h, pPg->pgno);.
15610 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
15620 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
15630 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
15640 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15650 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
15660 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
15670 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
15680 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
15690 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
156a0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 72  _FULL;.        r
156b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
156c0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
156d0 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
156e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
156f0 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
15700 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
15710 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
15720 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
15730 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20  gno&7);.    }.  
15740 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
15750 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
15760 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
15770 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
15780 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
15790 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
157a0 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
157b0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
157c0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
157d0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28  g->pgno;.    if(
157e0 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
157f0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
15800 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
15810 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15820 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
15830 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
15840 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
15850 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
15860 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
15870 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
15880 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
15890 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
158a0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ** to sqlite3pag
158b0 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20  er_write().  In 
158c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
158d0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
158e0 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
158f0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
15900 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e   the page..*/.in
15910 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  t sqlite3pager_i
15920 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20  swriteable(void 
15930 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
15940 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
15950 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
15960 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
15970 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  y;.}../*.** Repl
15980 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
15990 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
159a0 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
159b0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
159c0 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
159d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
159e0 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61  ger_overwrite(Pa
159f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
15a00 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
15a10 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ata){.  void *pP
15a20 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  age;.  int rc;..
15a30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
15a40 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
15a50 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
15a60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15a70 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
15a80 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
15a90 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
15aa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15ab0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
15ac0 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 70 50  pPage, pData, pP
15ad0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
15ae0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15af0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
15b00 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
15b10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15b20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
15b30 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
15b40 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
15b50 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
15b60 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
15b70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
15b80 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20  age "pgno" back 
15b90 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
15ba0 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
15bb0 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
15bc0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
15bd0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
15be0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
15bf0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
15c00 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
15c10 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
15c20 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
15c30 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
15c40 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
15c50 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
15c60 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
15c70 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
15c80 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
15c90 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
15ca0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
15cb0 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
15cc0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70   the.** sqlite3p
15cd0 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
15ce0 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
15cf0 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
15d00 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
15d10 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
15d20 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
15d30 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
15d40 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
15d50 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
15d60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
15d70 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
15d80 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
15d90 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
15da0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
15db0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
15dc0 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
15dd0 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
15de0 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
15df0 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
15e00 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
15e10 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
15e20 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
15e30 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
15e40 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
15e50 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
15e60 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
15e70 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
15e80 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
15e90 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
15ea0 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
15eb0 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
15ec0 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
15ed0 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
15ee0 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
15ef0 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
15f00 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
15f10 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
15f20 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
15f30 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
15f40 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
15f50 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
15f60 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
15f70 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  se the page cont
15f80 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c  ains.** critical
15f90 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
15fa0 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
15fb0 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62  it gets rolled b
15fc0 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20  ack in spite.** 
15fd0 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  of the dont_roll
15fe0 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
15ff0 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
16000 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67  r_dont_write(Pag
16010 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
16020 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
16030 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
16040 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72 65 74  ger->memDb ) ret
16050 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  urn;..  pPg = pa
16060 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
16070 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d  r, pgno);.  pPg-
16080 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
16090 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26  = 1;.  if( pPg &
160a0 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  & pPg->dirty ){.
160b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
160c0 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67  dbSize==(int)pPg
160d0 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
160e0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
160f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
16100 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
16110 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
16120 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
16130 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
16140 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
16150 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
16160 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
16170 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
16180 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
16190 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
161a0 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
161b0 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
161c0 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
161d0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
161e0 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
161f0 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
16200 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
16210 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
16220 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
16230 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
16240 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
16250 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
16260 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
16270 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
16280 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
16290 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
162a0 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
162b0 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
162c0 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
162d0 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
162e0 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
162f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
16300 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33  se{.      TRACE3
16310 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
16320 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
16330 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  gno, pPager->fd.
16340 68 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  h);.      pPg->d
16350 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irty = 0;.    }.
16360 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63    }.}../*.** A c
16370 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
16380 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
16390 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
163a0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
163b0 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
163c0 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
163d0 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
163e0 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
163f0 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
16400 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
16410 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
16420 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
16430 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
16440 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
16450 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
16460 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
16470 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
16480 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
16490 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
164a0 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
164b0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
164c0 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  r;..  if( pPager
164d0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 45  ->state!=PAGER_E
164e0 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61 67  XCLUSIVE || pPag
164f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
16500 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
16510 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
16520 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
16530 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
16540 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44   || pPager->memD
16550 62 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  b ) return;.  if
16560 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
16570 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
16580 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
16590 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
165a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
165b0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
165c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
165d0 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
165e0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
165f0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
16600 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
16610 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
16620 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
16630 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
16640 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
16650 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
16660 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61  gno&7);.      pa
16670 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
16680 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
16690 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
166a0 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
166b0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
166c0 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66  >pgno, pPager->f
166d0 64 2e 68 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  d.h);.  }.  if( 
166e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
166f0 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d  e && !pPg->inStm
16700 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
16710 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
16720 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  tSize ){.    ass
16730 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
16740 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
16750 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
16760 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
16770 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16780 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
16790 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
167a0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
167b0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
167c0 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64  7);.    page_add
167d0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
167e0 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  g);.  }.}.../*.*
167f0 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
16800 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
16810 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
16820 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
16830 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
16840 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  eFree(pHist->pOr
16850 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ig);.  sqliteFre
16860 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
16870 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
16880 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
16890 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  tmt = 0;.}../*.*
168a0 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
168b0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
168c0 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
168d0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
168e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
168f0 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
16900 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
16910 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
16920 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
16930 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
16940 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
16950 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
16960 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
16970 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
16980 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
16990 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
169a0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
169b0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
169c0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
169d0 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk==PAGER_ERR_FU
169e0 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LL ){.    rc = s
169f0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
16a00 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
16a10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
16a30 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
16a40 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
16a50 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
16a60 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
16a70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
16a80 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
16a90 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
16aa0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
16ab0 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
16ac0 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
16ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
16ae0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43  RROR;.  }.  TRAC
16af0 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  E2("COMMIT %d\n"
16b00 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
16b10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d  .  if( pPager->m
16b20 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 67 20  emDb ){.    pPg 
16b30 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
16b40 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
16b50 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  er);.    while( 
16b60 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  pPg ){.      cle
16b70 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
16b80 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
16b90 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
16ba0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
16bb0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
16bc0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
16bd0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
16be0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
16bf0 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
16c00 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
16c10 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
16c20 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
16c30 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
16c40 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
16c50 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
16c60 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
16c70 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
16c80 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
16c90 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
16ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
16cb0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
16cc0 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
16cd0 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
16ce0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16cf0 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
16d00 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
16d10 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
16d20 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
16d30 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
16d40 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
16d50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16d60 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
16d70 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29  >dirtyCache==0 )
16d80 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61  {.    /* Exit ea
16d90 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69  rly (without doi
16da0 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73  ng the time-cons
16db0 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53  uming sqlite3OsS
16dc0 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
16dd0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
16de0 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
16df0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
16e00 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  e file. */.    a
16e10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
16e20 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
16e30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
16e40 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
16e50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
16e60 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
16e70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
16e80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16e90 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
16ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
16eb0 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20  er_sync(pPager, 
16ec0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
16ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
16ee0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74  oto commit_abort
16ef0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67  ;.  }.  rc = pag
16f00 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
16f10 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
16f20 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
16f30 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
16f40 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
16f50 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
16f60 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  ng during the co
16f70 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20  mmit process..  
16f80 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a  */.commit_abort:
16f90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
16fa0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
16fb0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  ager);.  if( rc=
16fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16fd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
16fe0 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
16ff0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
17000 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
17010 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
17020 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
17030 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
17040 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
17050 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
17060 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
17070 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
17080 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
17090 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
170a0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
170b0 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
170c0 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
170d0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
170e0 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
170f0 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
17100 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51  ing protocol (SQ
17110 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f  LITE_PROTOCOL) o
17120 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
17130 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
17140 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
17150 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
17160 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
17170 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
17180 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
17190 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
171a0 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
171b0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
171c0 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
171d0 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
171e0 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
171f0 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
17200 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
17210 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17220 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
17230 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17240 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41  .  int rc;.  TRA
17250 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE2("ROLLBACK %d
17260 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e  \n", pPager->fd.
17270 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  h);.  if( pPager
17280 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 50  ->memDb ){.    P
17290 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
172a0 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
172b0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
172c0 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
172d0 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
172e0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c    assert( !p->al
172f0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
17300 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
17310 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
17320 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
17330 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
17340 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
17350 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
17360 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
17370 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
17380 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
17390 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  ))->pStmt );.   
173a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
173b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48       }..      pH
173c0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
173d0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a  IST(p, pPager);.
173e0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
173f0 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
17400 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
17410 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74  O_DATA(p), pHist
17420 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d  ->pOrig, pPager-
17430 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
17440 20 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c 4c      TRACE3("ROLL
17450 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20  BACK-PAGE %d of 
17460 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
17470 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
17480 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17490 20 20 20 20 54 52 41 43 45 33 28 22 50 41 47 45      TRACE3("PAGE
174a0 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
174b0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
174c0 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
174d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
174e0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
174f0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
17500 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
17510 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
17520 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
17530 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
17540 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
17550 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Stmt = 0;..     
17560 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
17570 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
17580 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
17590 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
175a0 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  A(p), pPager->pa
175b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
175c0 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  .      .    }.  
175d0 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
175e0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
175f0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
17600 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
17610 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
17620 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
17630 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
17640 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
17650 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
17660 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
17670 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17680 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
17690 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
176a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
176b0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
176c0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
176d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
176e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
176f0 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
17700 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
17710 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
17720 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   && pPager->errM
17730 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask!=PAGER_ERR_F
17740 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
17750 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
17760 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
17770 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
17780 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
17790 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
177a0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
177b0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
177c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
177d0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
177e0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 2c 20 72  {.    int rc2, r
177f0 63 33 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c3;.    rc = pag
17800 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
17810 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32  pPager);.    rc2
17820 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
17830 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
17840 2d 3e 6f 72 69 67 44 62 53 69 7a 65 29 3b 0a 20  ->origDbSize);. 
17850 20 20 20 72 63 33 20 3d 20 70 61 67 65 72 5f 75     rc3 = pager_u
17860 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
17870 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
17880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17890 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
178a0 20 20 20 69 66 28 20 72 63 33 20 29 20 72 63 20     if( rc3 ) rc 
178b0 3d 20 72 63 33 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc3;.    }.  }
178c0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
178d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
178e0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
178f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17900 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
17910 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 70  E_CORRUPT;.    p
17920 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
17930 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
17940 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  UPT;.  }.  pPage
17950 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
17960 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17970 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
17980 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
17990 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
179a0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
179b0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
179c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
179d0 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
179e0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
179f0 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64  ite3pager_isread
17a00 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
17a10 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
17a20 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
17a30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
17a40 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
17a50 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
17a60 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
17a70 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65  int *sqlite3page
17a80 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70  r_stats(Pager *p
17a90 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
17aa0 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30   int a[9];.  a[0
17ab0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
17ac0 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
17ad0 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
17ae0 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
17af0 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
17b00 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
17b10 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
17b20 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
17b30 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20  ger->errMask;.  
17b40 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
17b50 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
17b60 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
17b70 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f  [8] = pPager->nO
17b80 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  vfl;.  return a;
17b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
17ba0 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
17bb0 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
17bc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
17bd0 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
17be0 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
17bf0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
17c00 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
17c10 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
17c20 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
17c30 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
17c40 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
17c50 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
17c60 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
17c70 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
17c80 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
17c90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
17ca0 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61  er_stmt_begin(Pa
17cb0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
17cc0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
17cd0 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
17ce0 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73  NAME_SIZE];.  as
17cf0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
17d00 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73  tmtInUse );.  as
17d10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
17d20 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41  Size>=0 );.  TRA
17d30 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
17d40 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
17d50 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d.h);.  if( pPag
17d60 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
17d70 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
17d80 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
17d90 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
17da0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
17db0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17dc0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
17dd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17de0 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
17df0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
17e00 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
17e10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
17e20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17e30 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
17e40 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
17e50 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
17e60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
17e70 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
17e80 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
17e90 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
17ea0 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
17eb0 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
17ec0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17ed0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
17ee0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
17ef0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
17f00 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
17f10 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
17f20 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
17f30 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
17f40 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
17f50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17f60 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
17f70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
17f80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
17f90 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
17fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17fb0 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
17fc0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
17fd0 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
17fe0 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
17ff0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
18000 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
18010 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
18020 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
18030 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
18040 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
18050 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50  ntemp(zTemp, &pP
18060 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
18070 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
18080 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
18090 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
180a0 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  mtOpen = 1;.    
180b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
180c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
180d0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
180e0 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
180f0 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65  TE_OK;. .stmt_be
18100 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  gin_failed:.  if
18110 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
18120 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  t ){.    sqliteF
18130 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  ree(pPager->aInS
18140 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
18150 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
18160 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18170 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
18180 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
18190 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
181a0 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67  _stmt_commit(Pag
181b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
181c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
181d0 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
181e0 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
181f0 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
18200 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70  -COMMIT %d\n", p
18210 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
18220 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
18230 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71  emDb ){.      sq
18240 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
18250 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
18260 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
18270 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65  sTruncate(&pPage
18280 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a  r->stfd, 0); */.
18290 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
182a0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
182b0 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  t );.      pPage
182c0 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
182d0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50      }.    for(pP
182e0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
182f0 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
18300 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
18310 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
18320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18330 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  g->inStmt );.   
18340 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
18350 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
18360 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
18370 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
18380 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
18390 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
183a0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
183b0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
183c0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
183d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
183e0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
183f0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
18400 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
18410 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
18420 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
18430 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
18440 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
18450 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
18460 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
18470 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
18480 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
18490 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
184a0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
184b0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
184c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
184d0 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  mt_rollback(Page
184e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
184f0 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
18500 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
18510 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
18520 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
18530 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
18540 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18550 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
18560 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
18570 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
18580 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
18590 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  g=pPg->pNextStmt
185a0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
185b0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
185c0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
185d0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
185e0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
185f0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
18600 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
18610 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74  DATA(pPg), pHist
18620 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d  ->pStmt, pPager-
18630 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
18640 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
18650 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
18660 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
18670 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
18680 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18690 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
186a0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
186b0 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d  tSize;.      mem
186c0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
186d0 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
186e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
186f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
18700 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
18710 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
18720 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70    }.    sqlite3p
18730 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
18740 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
18750 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
18760 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
18770 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
18780 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
18790 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
187a0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
187b0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
187c0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
187d0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
187e0 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65  e3pager_filename
187f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18800 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
18810 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
18820 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18830 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
18840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18850 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
18860 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72  sqlite3pager_dir
18870 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
18880 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
18890 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
188a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
188b0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
188c0 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
188d0 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
188e0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
188f0 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65  ager_journalname
18900 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18910 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
18920 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
18930 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
18940 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
18950 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
18960 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63  3pager_set_codec
18970 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
18980 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  r,.  void (*xCod
18990 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
189a0 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
189b0 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
189c0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
189d0 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
189e0 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
189f0 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f   pCodecArg;.}../
18a00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18a10 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
18a20 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
18a30 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
18a40 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
18a50 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
18a60 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
18a70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18a80 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
18a90 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
18aa0 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64  *pPager){.  void
18ab0 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72   *pPage;.  PgHdr
18ac0 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20   *pPgHdr;.  u32 
18ad0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
18ae0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
18af0 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
18b00 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
18b10 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ing. */.  rc = s
18b20 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
18b30 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67  pPager, 1, &pPag
18b40 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
18b50 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
18b60 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
18b70 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
18b80 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
18b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18ba0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65  urn rc;..  /* Re
18bb0 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ad the current v
18bc0 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e  alue at byte 24.
18bd0 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44   */.  pPgHdr = D
18be0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61  ATA_TO_PGHDR(pPa
18bf0 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f  ge);.  change_co
18c00 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
18c10 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
18c20 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  4);..  /* Increm
18c30 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
18c40 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
18c50 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
18c60 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
18c70 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73  e_counter++;.  s
18c80 74 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e 67  tore32bits(chang
18c90 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48 64  e_counter, pPgHd
18ca0 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65  r, 24);..  /* Re
18cb0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
18cc0 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73  eference. */.  s
18cd0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
18ce0 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  f(pPage);.  retu
18cf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18d00 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
18d10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
18d20 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
18d30 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
18d40 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
18d50 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
18d60 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
18d70 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
18d80 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
18d90 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
18da0 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
18db0 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
18dc0 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
18dd0 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
18de0 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
18df0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
18e00 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
18e10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
18e20 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
18e30 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
18e40 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
18e50 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
18e60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18e70 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
18e80 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
18e90 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
18ea0 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
18eb0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
18ec0 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
18ed0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
18ee0 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
18ef0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18f00 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
18f10 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
18f20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
18f30 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
18f40 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
18f50 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
18f60 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
18f70 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63  e3pager_sync() c
18f80 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  all..*/.int sqli
18f90 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61  te3pager_sync(Pa
18fa0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18fb0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18fc0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18fd0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
18fe0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
18ff0 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
19000 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19010 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
19020 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
19030 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
19040 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
19050 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
19060 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19070 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
19080 44 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65  D && !pPager->me
19090 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64  mDb && pPager->d
190a0 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
190b0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
190c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
190d0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
190e0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
190f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19100 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
19110 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
19120 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
19130 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
19140 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
19150 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
19160 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
19170 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
19180 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
19190 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
191a0 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
191b0 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
191c0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
191d0 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
191e0 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
191f0 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
19200 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
19210 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
19220 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
19230 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
19240 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
19250 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
19260 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19270 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
19280 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
19290 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
192a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
192b0 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  exit;.      rc =
192c0 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
192d0 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
192e0 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
192f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19300 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
19310 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
19320 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
19330 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19340 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
19350 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
19360 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
19370 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
19380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19390 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
193a0 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
193b0 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
193c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
193d0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
193e0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
193f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19400 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
19410 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
19420 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
19430 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
19440 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
19450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19460 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66  sSync(&pPager->f
19470 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  d);.    }..    p
19480 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
19490 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
194a0 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
194b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
194c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
194d0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
194e0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
194f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19500 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
19510 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66   the file lock f
19520 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
19530 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  er..** The retur
19540 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f  n value is one o
19550 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  f NO_LOCK, SHARE
19560 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
19570 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e  _LOCK,.** PENDIN
19580 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55  G_LOCK, or EXCLU
19590 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e  SIVE_LOCK..*/.in
195a0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  t sqlite3pager_l
195b0 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
195c0 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20  pPager){.#ifdef 
195d0 4f 53 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e  OS_TEST.  return
195e0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 66 64 2e   pPager->fd->fd.
195f0 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c 73 65 0a  locktype;.#else.
19600 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
19610 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65  >fd.locktype;.#e
19620 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ndif.}.#endif..#
19630 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
19640 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  T./*.** Print a 
19650 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72  listing of all r
19660 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
19670 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f  and their ref co
19680 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
19690 69 74 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d  ite3pager_refdum
196a0 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  p(Pager *pPager)
196b0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
196c0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
196d0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
196e0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
196f0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
19700 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ef<=0 ) continue
19710 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 41  ;.    printf("PA
19720 47 45 20 25 33 64 20 61 64 64 72 3d 30 78 25 30  GE %3d addr=0x%0
19730 38 78 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  8x nRef=%d\n", .
19740 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
19750 2c 20 28 69 6e 74 29 50 47 48 44 52 5f 54 4f 5f  , (int)PGHDR_TO_
19760 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
19770 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
19780 64 69 66 0a                                      dif.